2014-02-06 175 views
0

我知道例如push eax会将eax保存到堆栈并且esp递减4. push dword ptr意味着它需要推送4个字节,但是然后我感到困惑。另外,如果它是[esi + 22]这是否是同样的事情?push dword ptr [eax + 22]是什么意思?

+0

这是快速,由于Kerrek增加esp。我能问一下,基于最后一条指令是否正确,读者不知道它是否指向ebp +或ebp-? – Soap

+0

对不起,我不太明白这个问题 - 谁是“它”? “读者”是什么意思?阅读源代码或检查堆栈? –

+0

(并且请将评论添加到答案 - 这样我得到一个通知,这次我只是偶然看到你的评论,或者添加'@name'标记) –

回答

5

push指令,就像许多其他x86指令,可以采取各种操作数:立即值,寄存器和存储器地址:

push 10     ; pushes the value 10 (32 bits in 32-bit mode) 
push eax    ; pushes the contents of the 32-bit register eax 
push DWORD [ebx + 42] ; pushes 32 bits from the memory location ebx + 42 

寄存器形式从寄存器的大小推断大小。内存形式需要指定大小(例如,这里以英特尔语法显示)。对于即时值,操作数大小为16或32位;当前模式是默认模式,另一个大小可以明确选择(例如,在32位模式下为push WORD 10)。

0

push dword ptr [eax+22]会减少esp 4,然后从内存位置ebx + 22保存4bytes数据。 和pop eax做一个反向的方式,首先移动在esp storeed到esp + 3eax位,和4

相关问题