【问题标题】:Why pop takes a parameter in assembly?为什么pop在汇编中需要一个参数?
【发布时间】:2011-02-02 23:47:15
【问题描述】:
popl   %ebp

看来%ebp是不必要的,因为堆栈的pop操作不需要参数。

为什么有意义?

【问题讨论】:

    标签: assembly x86 stack arguments callstack


    【解决方案1】:

    为了扩展安德烈的答案,除了在弹出的元素上增加堆栈指针外,弹出的元素也被复制到目标地址或寄存器。

    您给出的指令或多或少等同于两条指令(英特尔语法)

    add esp, 4               # increment the stack pointer
    mov ebp, [esp - 4]       # load what ESP was pointing to
    

    我认为这是 att (gas) 语法

    add $4, %esp
    mov -4(%esp), %ebp
    

    当然pop 不会修改 FLAGS(所以想象一下使用 LEA 执行 add),并且在加载和添加之间是不可中断的。

    对于pop esp 的特殊情况,在伪代码中进行第二次加载会复制actual documented behaviour 的递增之前 数据从旧的栈顶位置写入ESP。并且在地址计算之前使用 %esp 作为寻址模式的一部分,例如 popl 12(%esp, %edx, 4)

    【讨论】:

      【解决方案2】:

      来自http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

      pop — 弹出堆栈

      pop 指令将 4 字节数据元素从硬件支持的堆栈顶部移除到指定的操作数(即寄存器或内存位置)中。它首先将位于内存位置 [SP] 的 4 个字节移动到指定的寄存器或内存位置,然后将 SP 加 4。

      语法
      流行
      弹出

      示例
      pop edi — 将栈顶元素弹出到 EDI。
      pop [ebx] — 将栈顶元素从 EBX 位置开始的四个字节弹出到内存中。

      另一个很好的参考是http://en.wikibooks.org/wiki/X86_Assembly,它位于PDF form

      【讨论】:

        【解决方案3】:

        此参数设置目的地。

        【讨论】:

          猜你喜欢
          • 2019-02-19
          • 2011-01-29
          • 2012-11-08
          • 2013-10-22
          • 1970-01-01
          • 2019-03-11
          • 1970-01-01
          • 2017-05-25
          • 1970-01-01
          相关资源
          最近更新 更多