【问题标题】:What does push dword ptr [eax+22] mean?push dword ptr [eax+22] 是什么意思?
【发布时间】:2014-03-02 22:52:09
【问题描述】:

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

【问题讨论】:

  • 这很快,谢谢Kerrek。请问,仅根据最后一条指令,读者无法知道它是指向 ebp+ 还是 ebp- 是否正确?
  • 抱歉,我不太明白这个问题——“它”是谁? “读者”是什么意思?阅读源代码,还是检查堆栈?
  • (请在答案中添加评论 - 这样我会收到通知。这次我碰巧看到您的评论。或者添加“@name”标记。)
  • 好的,谢谢@KerrekSB,下次我会知道的。描述我的困惑的最简单方法是举个例子,如果 'push DWORD [ebx + 42]' 是 'push DWORD [EBP+42]' 我知道这将是一个参数,并且知道堆栈中的位置。虽然不知道 ebx 中的值,但无法知道它相对于 ebp 的偏移量(不检查堆栈,仅基于该行源代码。我希望这听起来不是一个愚蠢的问题,只是想弄清楚它,谢谢。
  • 如果ebx 包含数组的开头,您可能想要推送一些其他数组元素,因此需要计算偏移量...

标签: assembly x86


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2014-10-28
      • 2013-03-05
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2015-01-25
      • 2021-12-23
      相关资源
      最近更新 更多