我需要选择正确的工具来调用函数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
为什么第二个是真的?我认为第一个实现右推参数然后调用
答案 0 :(得分:3)
除了最后丢失的add esp, 4
之外,第二个版本是正确的,因为英特尔架构是小端的。这意味着DWORD存储在内存中,其最低有效BYTE或WORD占用较低的内存地址。在您的情况下,0xA500
是DWORD中最不重要的WORD,第二个版本正确地将它放在堆栈的4字节区域的低2字节中。
答案 1 :(得分:0)
它取决于调用约定,但对于“cdecl”,由调用者来清理堆栈。这意味着它是你的第一个答案是正确的,因为它确实“添加esp,4”。然而就像ndkrempel在他的回答中注意到的那样,参数应该像第二个答案一样以小端传递。