3

我正在学习IA32。当我想到popl DEST指令在做什么时,我认为如下:

movl (%esp), DEST
addl $4, %esp

但是当我想到时,我开始怀疑自己popl %esp。尽管这可能是一条毫无意义的指令,但我认为可能有更好的方法来概括地描述popl DEST指令。你会如何描述它?

4

1 回答 1

4

以下是英特尔文档中 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 寄存器递减之前计算操作数的地址。

于 2013-02-17T09:06:47.910 回答