【问题标题】:Determining appropriate register when POPing value from stack?从堆栈中弹出值时确定适当的寄存器?
【发布时间】:2015-06-17 06:56:18
【问题描述】:

我正在学习有关汇编语言的更多信息,并且看到如下说明:

PUSH EAX;
POP ESP;

...这显然将 EAX 推入堆栈,并将其弹出回 ESP 寄存器。

值是否在堆栈上以某种方式标记了源寄存器?例如,是否有某种方法可以知道最终进入堆栈的 EAX 的值来自 EAX?

如果 EAX 的值与 ESP 寄存器不兼容,它被 POP 到 ESP 中,会发生什么?

【问题讨论】:

  • 不,没有标记。该值始终是“兼容的”,只有 32 位。如果您尝试使用它,以后可能会出错。
  • 将一个寄存器压入并立即弹出另一个寄存器的序列可能有多种原因。例如,这是将值从第一个寄存器复制到第二个寄存器的一种方法。在您引用的示例中,mov esp, eax 可以轻松完成。或者这可能是编写您正在查看的程序的程序员的判断错误。没有任何进一步的背景很难说。但是堆栈上的值,或者内存中任何其他地方的值,没有特殊的标签。它们只是价值观。
  • @Jester 如果您将其发布为答案,我会接受它

标签: assembly x86 stack


【解决方案1】:

你一定对“堆栈”有一个奇怪的想法。 esp -- 堆栈指针 -- 指向常规计算机内存中的某个位置。 push 操作将 esp 的值减少 4 并将其参数值存储在该地址。 pop 则相反。由于堆栈指针指向常规内存,因此“在”它上面的值没有任何解释,除了对内存中任何值的通常解释。

在您的示例中,EAX 的什么“价值”可能是“不兼容的”?由于 ESP 和其他寄存器一样,它可以保存任何值。唯一的问题是,读取它(直接,或使用pop)或写入它(直接,或使用push)可能不安全——但在这方面,除了处理任何其他寄存器值作为指针并尝试从中读取或写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多