assembly 为什么pop在程序集中带参数?

ghhkc1vu  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(170)

请考虑:

popl   %ebp

看来%ebp是不必要的,因为pop对栈的操作不需要参数。
为什么说得通?

qnakjoqk

qnakjoqk1#

来自 * x86 Assembly Guide *:

pop-弹出堆栈

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

  • 语法 *

爆响
爆响

  • 示例 *

pop edi -将堆栈的顶部元素弹出到EDI中。
pop [ebx] -将栈顶元素从EBX位置开始的四个字节处弹出到内存中。
另一个很好的参考是 * x86 Assembly *,它在in PDF form上可用。

slmsl1lt

slmsl1lt2#

此参数设置目标。

8wigbo56

8wigbo563#

为了扩展Andrey的答案,除了在弹出的元素上递增堆栈指针之外,还将弹出的元素复制到目标地址或寄存器。
您给出的指令或多或少等同于这两条指令(英特尔语法)

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

我认为这是att(气体)语法

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

当然,pop不会修改FLAGS(因此,想象一下用莱亚执行add),并且在加载和添加之间是不可中断的。
对于pop esp的特殊情况,在伪代码中执行第二次加载复制了actual documented behaviour,即在将来自旧堆栈顶部位置的数据写入ESP * 之前 * 递增,以及在使用%esp作为寻址模式的一部分的存储器目的地弹出的地址计算之前递增,如popl 12(%esp, %edx, 4)

相关问题