制作日記

こういうの作った方が、逃げにくいじゃない

DTCの%fがどうの

それ自体はどうでも良い
%gとか%eでも呼ばれるよ、とかもどうでも良いんだけど

[[char+0x345C]+0x4]を実行するのがテンプレなんかね
それで良いんですかねぇ
あそこはDTCで出力した文字列がそのまま保存されるわけじゃないんだけどなあ

[char+0x345C]は表示文字列の保存場所で

[[char+0x345C]+0x4]は文字列保存用の配列で行ごとに分割して保存、char*
[[char+0x345C]]は分割した各文字列へのアドレスの配列、char*[]

[[char+0x345C]+0x8]は一行の文字数
[[char+0x345C]+0xC]は行数

[[char+0x345C]+0x10]は
分割した各文字列へのアドレスの配列について、先頭行のアドレスを保存しているindex
[[char+0x345C]+0x14]は
分割した各文字列へのアドレスの配列について、表示する要素数 - 1
ここが1なら、[[char+0x345C]+0x10]のindexの文字列とindex + 1の文字列を表示する、2ならindex + 2まで
サイクリックに保存しているから先頭のindexが0でない場合もあるから、正確には(index + n) mod 行数


デカいcharの配列を1つ確保して、[[char+0x345C]+0x4]にアドレス保存
行ごとに適当に分割してそこに保存していく
自動改行以外にも\nで明示的に改行した場合も分割される
自動改行の場合は概ね文字列の分割位置をずらして対応する
\nのほうは既に分割されてる境界に合わせて保存する

"ABCDE"という文字列があったとしてCとDの間が自動改行されるとしたら
"ABC"と"DE"の間にnull文字が挿入されるだけで、連続した領域に保存される
対して"ABC\nDE"だと
"ABC"と"DE"が連続せず別々に保存される、自動改行と違って間にnull文字が1個入るだけではない

つまるところ、デバッグ表示の場合は1行が0x4D文字だから
それ以上のコードを埋め込もうとしても、0x4Dのとこで勝手にnull終端される
\n=0x0Aが入っても分割される

コードはここやぞ
004131F0  /$ 81EC 04040000  SUB ESP,404
004131F6 |. 53 PUSH EBX
004131F7 |. 55 PUSH EBP
004131F8 |. 56 PUSH ESI
004131F9 |. 8BB424 1404000>MOV ESI,DWORD PTR SS:[ESP+414]
00413200 |. 57 PUSH EDI
00413201 |. 8B46 14 MOV EAX,DWORD PTR DS:[ESI+14]
00413204 |. 8B0E MOV ECX,DWORD PTR DS:[ESI]
00413206 |. 8B56 0C MOV EDX,DWORD PTR DS:[ESI+C]
00413209 |. 8B6E 08 MOV EBP,DWORD PTR DS:[ESI+8]
0041320C |. 8B1C81 MOV EBX,DWORD PTR DS:[ECX+EAX*4]
0041320F |. 8B8C24 1C04000>MOV ECX,DWORD PTR SS:[ESP+41C]
00413216 |. 8D8424 2004000>LEA EAX,DWORD PTR SS:[ESP+420]
0041321D |. 895424 10 MOV DWORD PTR SS:[ESP+10],EDX
00413221 |. 50 PUSH EAX
00413222 |. 8D5424 18 LEA EDX,DWORD PTR SS:[ESP+18]
00413226 |. 51 PUSH ECX
00413227 |. 52 PUSH EDX
00413228 |. E8 22FF0700 CALL winmugen.0049314F
0041322D |. 8BFB MOV EDI,EBX
0041322F |. 83C9 FF OR ECX,FFFFFFFF
00413232 |. 33C0 XOR EAX,EAX
00413234 |. 83C4 0C ADD ESP,0C
00413237 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
00413239 |. 8A4424 14 MOV AL,BYTE PTR SS:[ESP+14]
0041323D |. 8D5424 14 LEA EDX,DWORD PTR SS:[ESP+14]
00413241 |. F7D1 NOT ECX
00413243 |. 49 DEC ECX
00413244 |. 84C0 TEST AL,AL
00413246 |. 74 57 JE SHORT winmugen.0041329F
00413248 |. 4D DEC EBP
00413249 |> 3BCD /CMP ECX,EBP
0041324B |. 7D 05 |JGE SHORT winmugen.00413252
0041324D |. 803A 0A |CMP BYTE PTR DS:[EDX],0A
00413250 |. 75 3B |JNZ SHORT winmugen.0041328D
00413252 |> C60419 00 |MOV BYTE PTR DS:[ECX+EBX],0
00413256 |. 8B4E 14 |MOV ECX,DWORD PTR DS:[ESI+14]
00413259 |. 41 |INC ECX
0041325A |. 894E 14 |MOV DWORD PTR DS:[ESI+14],ECX
0041325D |. 8B4C24 10 |MOV ECX,DWORD PTR SS:[ESP+10]
00413261 |. 394E 14 |CMP DWORD PTR DS:[ESI+14],ECX
00413264 |. 7C 07 |JL SHORT winmugen.0041326D
00413266 |. C746 14 000000>|MOV DWORD PTR DS:[ESI+14],0
0041326D |> 8B7E 14 |MOV EDI,DWORD PTR DS:[ESI+14]
00413270 |. 8B46 10 |MOV EAX,DWORD PTR DS:[ESI+10]
00413273 |. 3BF8 |CMP EDI,EAX
00413275 |. 75 0F |JNZ SHORT winmugen.00413286
00413277 |. 40 |INC EAX
00413278 |. 3BC1 |CMP EAX,ECX
0041327A |. 8946 10 |MOV DWORD PTR DS:[ESI+10],EAX
0041327D |. 7C 07 |JL SHORT winmugen.00413286
0041327F |. C746 10 000000>|MOV DWORD PTR DS:[ESI+10],0
00413286 |> 8B06 |MOV EAX,DWORD PTR DS:[ESI]
00413288 |. 33C9 |XOR ECX,ECX
0041328A |. 8B1CB8 |MOV EBX,DWORD PTR DS:[EAX+EDI*4]
0041328D |> 8A02 |MOV AL,BYTE PTR DS:[EDX]
0041328F |. 3C 0A |CMP AL,0A
00413291 |. 74 04 |JE SHORT winmugen.00413297
00413293 |. 880419 |MOV BYTE PTR DS:[ECX+EBX],AL
00413296 |. 41 |INC ECX
00413297 |> 8A42 01 |MOV AL,BYTE PTR DS:[EDX+1]
0041329A |. 42 |INC EDX
0041329B |. 84C0 |TEST AL,AL
0041329D |.^75 AA \JNZ SHORT winmugen.00413249
0041329F |> 5F POP EDI
004132A0 |. 5E POP ESI
004132A1 |. C60419 00 MOV BYTE PTR DS:[ECX+EBX],0
004132A5 |. 5D POP EBP
004132A6 |. 5B POP EBX
004132A7 |. 81C4 04040000 ADD ESP,404
004132AD \. C3 RETN

コメントの投稿

非公開コメント

No title

%fでDTCtextコードを呼ぶのは1024埋めて呼び出すDTCtextコードを大量に使う際に処理落ちが酷いからであって
文字数制限に掛からないものなら全て%fで呼んだ方が軽いから問題無い
自動改行する程文字数多いコードならそれだけ%fCALL以前のやり方で使うだけ

今までのは
1024埋めるのは普通より重い
残像で呼ぶのは通常の残像を犠牲にしなければならない
空白領域に書き込むのは非常に手間
変数使用は大量の一時変数が必要で空白書き込み程では無いが手間
と面倒さや処理落ち、ステコン数が嵩む、それに該当する部分の犠牲等の問題くらいなので
処理が軽めでコードの埋め込みも比較的容易い%fCALL式は使い勝手そこそこ良いんじゃない?ってだけ

他にコード書くのが楽で呼ぶのも楽なのあるなら教えて

No title

コードの末尾で%f書いとけば、%fcallとやらの時点でスタックには書式展開後の文字列が載ってるんだから
それ引っ張ってくる方法ないか探せば良いんじゃねーの

楽な方法かは知らんが
ライブラリ作って、コード一発叩いてリンクさせればアセンブラなんてほぼ書く必要ない
マウスクリック拾ってダメージ与えるキャラ作った人いたけど、ああいう複雑なこともできるぞ
しかもあれはdefオバフロでやってたけど、dlなら読み込みの走らない再試合でも影響残せる
プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク