我知道,例如push eax会将eax保存到堆栈并将esp减少4.而push dword ptr意味着它需要推送4个字节,但后来我很困惑。如果它是[esi + 22]那么这也是一回事吗?
答案 0 :(得分: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
)。
答案 1 :(得分:0)
push dword ptr [eax+22]
会将esp
递减4,然后从内存位置ebx + 22
保存4字节数据。
并且pop eax
以相反的方式执行操作,首先将esp
中存储的位移至esp + 3
至eax
,然后将esp
增加4。