popl %ebp
似乎%ebp
没有必要,因为pop
堆栈的操作不需要参数。
为什么有意义?
来自http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
pop - 弹出堆栈
pop 指令将 4 字节数据元素从硬件支持的堆栈顶部移到指定的操作数(即寄存器或内存位置)中。它首先将位于内存位置 [SP] 的 4 个字节移动到指定的寄存器或内存位置,然后将 SP 加 4。
语法
pop <reg32>
pop <mem>示例
pop edi — 将堆栈的顶部元素弹出到 EDI。
pop [ebx] — 将堆栈的顶部元素从位置 EBX 开始的四个字节弹出到内存中。
另一个很好的参考是http://en.wikibooks.org/wiki/X86_Assembly,它以PDF 形式提供。
此参数设置目的地。
为了扩展安德烈的答案,除了在弹出的元素上增加堆栈指针外,弹出的元素也被复制到目标地址或寄存器。
您给出的指令或多或少等同于两条指令(英特尔语法)
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(所以想象一下add
使用 LEA),并且在加载和添加之间是不可中断的。
对于 的特殊情况pop esp
,在伪代码中执行第二次加载复制了在旧栈顶位置的数据写入 ESP之前递增的实际记录行为。并且在地址计算之前使用作为寻址模式的一部分来计算内存目标弹出的增量,例如%esp
popl 12(%esp, %edx, 4)