请考虑:
popl %ebp
看来%ebp是不必要的,因为pop对栈的操作不需要参数。为什么说得通?
%ebp
pop
qnakjoqk1#
来自 * x86 Assembly Guide *:
pop-弹出堆栈
弹出指令将4字节的数据元素从硬件支持的堆栈顶部移到指定的操作数(即寄存器或内存位置)。它首先将内存位置[SP]的4字节移到指定的寄存器或内存位置,然后将SP递增4。
爆响爆响
pop edi -将堆栈的顶部元素弹出到EDI中。pop [ebx] -将栈顶元素从EBX位置开始的四个字节处弹出到内存中。另一个很好的参考是 * x86 Assembly *,它在in PDF form上可用。
slmsl1lt2#
此参数设置目标。
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)
add
pop esp
%esp
popl 12(%esp, %edx, 4)
3条答案
按热度按时间qnakjoqk1#
来自 * x86 Assembly Guide *:
pop-弹出堆栈
弹出指令将4字节的数据元素从硬件支持的堆栈顶部移到指定的操作数(即寄存器或内存位置)。它首先将内存位置[SP]的4字节移到指定的寄存器或内存位置,然后将SP递增4。
爆响
爆响
pop edi -将堆栈的顶部元素弹出到EDI中。
pop [ebx] -将栈顶元素从EBX位置开始的四个字节处弹出到内存中。
另一个很好的参考是 * x86 Assembly *,它在in PDF form上可用。
slmsl1lt2#
此参数设置目标。
8wigbo563#
为了扩展Andrey的答案,除了在弹出的元素上递增堆栈指针之外,还将弹出的元素复制到目标地址或寄存器。
您给出的指令或多或少等同于这两条指令(英特尔语法)
我认为这是att(气体)语法
当然,
pop
不会修改FLAGS(因此,想象一下用莱亚执行add
),并且在加载和添加之间是不可中断的。对于
pop esp
的特殊情况,在伪代码中执行第二次加载复制了actual documented behaviour,即在将来自旧堆栈顶部位置的数据写入ESP * 之前 * 递增,以及在使用%esp
作为寻址模式的一部分的存储器目的地弹出的地址计算之前递增,如popl 12(%esp, %edx, 4)