【发布时间】:2011-02-02 23:47:15
【问题描述】:
popl %ebp
看来%ebp是不必要的,因为堆栈的pop操作不需要参数。
为什么有意义?
【问题讨论】:
标签: assembly x86 stack arguments callstack
popl %ebp
看来%ebp是不必要的,因为堆栈的pop操作不需要参数。
为什么有意义?
【问题讨论】:
标签: assembly x86 stack arguments callstack
为了扩展安德烈的答案,除了在弹出的元素上增加堆栈指针外,弹出的元素也被复制到目标地址或寄存器。
您给出的指令或多或少等同于两条指令(英特尔语法)
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)
【讨论】:
来自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。
【讨论】:
此参数设置目的地。
【讨论】: