我正在学习IA32。当我想到popl DEST
指令在做什么时,我认为如下:
movl (%esp), DEST
addl $4, %esp
但是当我想到时,我开始怀疑自己popl %esp
。尽管这可能是一条毫无意义的指令,但我认为可能有更好的方法来概括地描述popl DEST
指令。你会如何描述它?
我正在学习IA32。当我想到popl DEST
指令在做什么时,我认为如下:
movl (%esp), DEST
addl $4, %esp
但是当我想到时,我开始怀疑自己popl %esp
。尽管这可能是一条毫无意义的指令,但我认为可能有更好的方法来概括地描述popl DEST
指令。你会如何描述它?
以下是英特尔文档中 POP 指令的一小部分伪代码:
IF StackAddrSize = 32
THEN
IF OperandSize = 32
THEN
DEST ← SS:ESP; (* Copy a doubleword *)
ESP ← ESP + 4;
ELSE (* OperandSize = 16*)
...
FI;
...
但这里是它具体说的POP xSP
:
POP ESP 指令在将旧堆栈顶部的数据写入目标之前递增堆栈指针 (ESP)。
这意味着序列
PUSH ESP
POP ESP
没有做任何不寻常的事情,就像这个:
PUSH EAX
POP EAX
同样,有一些文字PUSH xSP
:
PUSH ESP 指令压入 ESP 寄存器的值,因为它在指令执行之前就存在。如果 PUSH 指令使用内存操作数,其中 ESP 寄存器用于计算操作数地址,则在 ESP 寄存器递减之前计算操作数的地址。