我正在学习更多关于汇编语言的知识,我看到如下指令:
PUSH EAX; POP ESP;
...显然将EAX推入堆栈,并将其弹回ESP寄存器 .
是否在堆栈上以某种方式标记了源寄存器的值?例如,有没有办法知道最终堆栈的EAX值来自EAX?
如果EAX的值与ESP寄存器不兼容,并且它被弹出到ESP中,会发生什么?
你必须对'the stack'有一个奇怪的想法 . esp - 堆栈指针 - 指向常规计算机内存中的某个位置 . push 操作将 esp 的值减小4并将其参数值存储在该地址 . A pop 反过来 . 由于堆栈指针指向常规内存,因此除了对内存中任何值的通常解释之外,它没有解释值.1403308_ .
esp
push
pop
在您的示例中,EAX的'value'可能是'incompatible'?由于ESP是任何其他的注册,它可以保持任何 Value . 唯一的事情是,从它读取(直接,或使用 pop )或写入(直接,或使用 push )可能不安全 - 但在此,它只是将任何其他寄存器值视为指针并尝试从中读取或写入 .
1 回答
你必须对'the stack'有一个奇怪的想法 .
esp
- 堆栈指针 - 指向常规计算机内存中的某个位置 .push
操作将esp
的值减小4并将其参数值存储在该地址 . Apop
反过来 . 由于堆栈指针指向常规内存,因此除了对内存中任何值的通常解释之外,它没有解释值.1403308_ .在您的示例中,EAX的'value'可能是'incompatible'?由于ESP是任何其他的注册,它可以保持任何 Value . 唯一的事情是,从它读取(直接,或使用
pop
)或写入(直接,或使用push
)可能不安全 - 但在此,它只是将任何其他寄存器值视为指针并尝试从中读取或写入 .