汇编中的推送指令(intel 8086)

时间:2012-07-01 16:43:52

标签: assembly x86

我需要选择正确的工具来调用函数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

为什么第二个是真的?我认为第一个实现右推参数然后调用

2 个答案:

答案 0 :(得分:3)

除了最后丢失的add esp, 4之外,第二个版本是正确的,因为英特尔架构是小端的。这意味着DWORD存储在内存中,其最低有效BYTE或WORD占用较低的内存地址。在您的情况下,0xA500是DWORD中最不重要的WORD,第二个版本正确地将它放在堆栈的4字节区域的低2字节中。

答案 1 :(得分:0)

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

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