Assembly 推送dword ptr[eax&x2B;22]是什么意思?

Assembly 推送dword ptr[eax&x2B;22]是什么意思?,assembly,x86,Assembly,X86,我知道,例如,push eax会将eax保存到堆栈中,并将esp减少4。推送dword ptr意味着它需要推送4个字节,但是我很困惑。另外,如果是[esi+22],这是同一件事吗?与许多其他x86指令一样,push指令可以使用多种操作数:立即数、寄存器和内存地址: push 10 ; pushes the value 10 (32 bits in 32-bit mode) push eax ; pushes the contents

我知道,例如,push eax会将eax保存到堆栈中,并将esp减少4。推送dword ptr意味着它需要推送4个字节,但是我很困惑。另外,如果是[esi+22],这是同一件事吗?

与许多其他x86指令一样,
push
指令可以使用多种操作数:立即数、寄存器和内存地址:

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

寄存器窗体根据寄存器的大小推断大小。内存窗体需要指定大小(例如,此处以Intel语法显示)。对于立即数值,操作数大小为16或32位;当前模式为默认模式,可以显式选择其他大小(例如32位模式下的
推送字10

与许多其他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

寄存器窗体根据寄存器的大小推断大小。内存窗体需要指定大小(例如,此处以Intel语法显示)。对于立即数值,操作数大小为16或32位;当前模式为默认模式,可以显式选择其他大小(例如32位模式下的
推送字10

推送dword ptr[eax+22]
esp
减小4,然后从内存位置
ebx+22
保存4字节数据。
pop eax
则以相反的方式,首先将
esp
中存储的位移动到
esp+3
eax
,并将
esp
增加4。

推送dword ptr[eax+22]
esp
减少4,然后从内存位置
ebx+22
保存4字节的数据。
pop eax
则相反,首先将
esp
中存储的位移动到
esp+3
eax
,然后将
esp
增加4。

这很快,谢谢Kerrek。我可以问一下,仅仅根据上一条指令,读者不可能知道它是指向ebp+还是ebp-?对不起,我不太理解这个问题-谁是“它”?你说的“读者”是什么意思?阅读源代码,或检查堆栈?(请在答案中添加注释-这样我会收到通知。这次我碰巧看到你的注释。或者添加“@name”标记。)好的,谢谢@KerrekSB,下次我会知道的。描述我的困惑的最简单方法是举个例子,如果“push-DWORD[ebx+42]”是“push-DWORD[EBP+42]”,我知道这将是一个参数,并且知道它在堆栈中的位置。如果不知道ebx中的值,就无法知道其相对于ebp的偏移量(没有检查堆栈,只是基于那行源代码。我希望这听起来不是一个愚蠢的问题,只是想让我的头绕过它,谢谢。如果
ebx
包含数组的开头,您可能需要推送其他数组元素,因此需要进行偏移计算……这很快,谢谢Kerrek。我可以问一下,是吗根据上一条指令,读者不可能知道它是指向ebp+还是ebp-?对不起,我不太理解这个问题,“它”是谁?你说的“读者”是什么意思?阅读源代码,还是检查堆栈?(请在回答中添加注释-这样我会收到通知。这次我碰巧看到了你的注释。或者添加了“@name”标记。)好的,谢谢@KerrekSB,我下次会知道的。描述我困惑的最简单方法是举个例子,如果“push-DWORD[ebx+42]”是“push-DWORD[EBP+42]我知道这是一个参数,并且知道它在堆栈中的位置。如果不知道ebx中的值,就无法知道它相对于ebp的偏移量(没有检查堆栈,只是基于那行源代码。我希望这听起来不是一个愚蠢的问题,只是想让我的头绕过它,谢谢。如果
ebx
包含数组的开头,您可能需要推送其他数组元素,因此需要进行偏移计算。。。