X64 用に作成された ASM ファイルがあります。リーフ機能を提供します。このファイルは MASM64/ML64 でアセンブルされています。
署名付きの C 疑似コードは次のとおりです。
int GenerateBlock(byte* ptr, size_t size, unsigned int safety)
{
if (ptr == NUL) return 0; /*FAIL*/
...
}
ASM コードの同じ部分を次に示します。
;; RCX (in): byte* buffer
;; RDX (in): size_t bsize
;; R8d (in): unsigned int safety
;; RAX (out): bool, success (1), failure (0)
ASM_GenerateBlock PROC buffer:QWORD,bsize:QWORD,safety:DWORD
LOCAL val:QWORD ;; local variables
MWSIZE EQU 8 ;; machine word size
;; Validate pointer
cmp buffer, 0
je ASM_GenerateBlock_Cleanup
;; Cleanup will set RAX to 0 and return
...
ENDP
呼び出しを実行するfastcall
と、使用されているように見えますが、これはドキュメントと一致しています。最初の 2 つの引数は と に表示されますがRCX
、RDX
これも一貫しています。
しかし、NULL
ポインターを使用したテスト ケースは、予期しない結果を生成しています。使用されているテストケースは次のとおりです。
ASM_GenerateBlock(NULL /*ptr*/, 64 /*size*/, 20 /*safety*/);
コードをステップ実行すると、 (its ) のように見えますが、(its ) のRCX
ように見えますが、未知の値に対して比較が行われています。即時ウィンドウから:buffer
NULL
RDX
bsize
0x40
cmp buffer, 0
buffer
0x000000013f82bcd0
*(__int64*)buffer
0x000000013f62aba8
bsize
0x000000013f14871b
*(__int64*)bsize
0xccccccc348c48348
13f82bcd0
命令ポインターのアドレス (EIP は13F50D268
) のように見えます。ESP
またはとは似ていないようEBP
です。
いくつかの質問を聞きたいんです...
- ML64 が変数に使用しているアドレッシング モードは何
buffer
ですか? - 変数の値はどこ
buffer
から来ていますか? - なぜ変数に使用し
ML64
ないのですか?ECX
buffer
- どうすればこれを修正できますか?
32 ビットに短縮された同じコードは、正常にアセンブルおよび実行されます。ただし、ML はbuffer
とbsize
をスタックに置き、 に対して相対的にアドレス指定しますEBP
。
にも変更してみましcmp QWORD PTR buffer, 0
たが、だめでした。