【发布时间】:2015-06-17 06:56:18
【问题描述】:
我正在学习有关汇编语言的更多信息,并且看到如下说明:
PUSH EAX;
POP ESP;
...这显然将 EAX 推入堆栈,并将其弹出回 ESP 寄存器。
值是否在堆栈上以某种方式标记了源寄存器?例如,是否有某种方法可以知道最终进入堆栈的 EAX 的值来自 EAX?
如果 EAX 的值与 ESP 寄存器不兼容,它被 POP 到 ESP 中,会发生什么?
【问题讨论】:
-
不,没有标记。该值始终是“兼容的”,只有 32 位。如果您尝试使用它,以后可能会出错。
-
将一个寄存器压入并立即弹出另一个寄存器的序列可能有多种原因。例如,这是将值从第一个寄存器复制到第二个寄存器的一种方法。在您引用的示例中,
mov esp, eax可以轻松完成。或者这可能是编写您正在查看的程序的程序员的判断错误。没有任何进一步的背景很难说。但是堆栈上的值,或者内存中任何其他地方的值,没有特殊的标签。它们只是价值观。 -
@Jester 如果您将其发布为答案,我会接受它