0

我需要选择正确的工具来调用函数 foo 而不是用 c 编写的。foo 得到 1 个参数 0x100fa500。

第一个答案是:

sub esp,2
mov word[esp],0xa500
sub esp,2
mov word[esp] , 0x100f
call foo
add esp 4

第二个:

 sub esp,2
 mov word[esp],0x100f
 sub esp,2
 mov word[esp] , 0xa500
 call foo

为什么第二个是真的?我认为首先实现正确的推送参数,然后调用

4

2 回答 2

3

除了add esp, 4最后的缺失,第二个版本是正确的,因为 Intel 架构是 little-endian。这意味着 DWORD 存储在内存中,其最低有效 BYTE 或 WORD 占用较低的内存地址。在您的情况下,0xA500是 DWORD 的最低有效字,第二个版本正确地将其放置在堆栈的 4 字节区域的低 2 字节中。

于 2012-07-01T16:49:47.663 回答
0

这取决于调用约定,但对于“cdecl”,由调用者来清理堆栈。这意味着您的第一个答案是正确的,因为它确实“添加了 esp,4”。然而,就像他的答案中的 ndkrempel 通知一样,参数应该像第二个答案一样以小端方式传递。

http://en.wikipedia.org/wiki/X86_calling_conventions

于 2012-07-01T16:49:28.693 回答