【问题标题】:Decribing pop in Assembly [duplicate]描述装配中的流行音乐[重复]
【发布时间】:2013-02-01 20:13:09
【问题描述】:

我正在学习 IA32。当我想到 popl DEST 指令在做什么时,我想到以下几点:

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

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

【问题讨论】:

  • 很抱歉有人没有发现我的问题有用。请随时发表评论,以便我将来改进问题。
  • add 指令修改状态标志。因此lea esp, [esp + 4] 将更适合pop 所做的事情。

标签: assembly x86 cpu-registers


【解决方案1】:

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

【讨论】:

  • 所以看起来我选择描述它的方式就像英特尔的文档一样。 pop %esp 有一个特殊说明,它说它首先递增堆栈指针。
  • @KyleWeller:确实。英特尔本可以编写与pop esppush esp 的行为实际上相匹配的伪代码,但出于某种原因没有选择。它几乎不比当前的伪代码复杂,只是添加了一个临时代码。 What is an assembly-level representation of pushl/popl %esp?
猜你喜欢
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
相关资源
最近更新 更多