我有一个为 X64 编写的 ASM 文件。它提供了一个叶子函数。该文件由 MASM64/ML64 组装而成。
带有签名的 C-pseduo 代码是:
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
正在被使用,这与文档一致。前两个参数出现在RCX
andRDX
中,这也是一致的。
但是带有NULL
指针的测试用例会产生意想不到的结果。这是正在使用的测试用例:
ASM_GenerateBlock(NULL /*ptr*/, 64 /*size*/, 20 /*safety*/);
当我执行代码时,RCX
似乎是buffer
(its NULL
),RDX
似乎是bsize
(its 0x40
),但比较cmp buffer, 0
是针对我未知的值进行的。从即时窗口:
buffer
0x000000013f82bcd0
*(__int64*)buffer
0x000000013f62aba8
bsize
0x000000013f14871b
*(__int64*)bsize
0xccccccc348c48348
13f82bcd0
看起来大致像一个指令指针地址(EIP 是13F50D268
)。它似乎与ESP
or不相似EBP
。
我有几个问题...
- ML64 对变量使用什么寻址模式
buffer
? - 变量的值
buffer
从何而来? - 为什么
ML64
不使用ECX
变量buffer
? - 我怎样才能解决这个问题?
相同的代码,缩短为 32 位,可以很好地汇编和执行。但是,ML 将buffer
和放入bsize
堆栈并相对于EBP
.
我也尝试更改为cmp QWORD PTR buffer, 0
,但没有帮助。