【发布时间】:2021-01-06 09:18:39
【问题描述】:
我们的课程中有一个使用汇编的练习,就像这样。
这段代码后EAX寄存器里保存的是什么?
mov eax, 10
push eax
push 20
mov ecx, eax
pop eax
所以据我了解,第一行表示将 10 放入 EAX,第二行将 EAX 推入堆栈。
但这意味着什么? eax 的内容会被删除吗?
如果 20 也被压入堆栈,堆栈是 10 和 20 吗?
代码后的 EAX 寄存器是否会是 10、10、20 之类的东西,它是如何格式化的?
【问题讨论】:
-
push只是复制将其复制到堆栈上的内容;没有修改源(只是写入内存,并调整了堆栈指针)。pop也不会清除源内存位置,但由于堆栈指针已调整,弹出的内存位置现在低于堆栈指针,因此被认为可以被覆盖。 -
felixcloutier.com/x86/push 准确记录了
push指令执行时发生的情况;仅此而已。每条指令对架构状态都有其记录的影响。如果您不确定在脑海中模拟它会发生什么,请在调试器中单步执行该序列。 (顺便说一句,指令在读取后通常不会修改寄存器或内存位置,除非它是指令的显式部分,如xchg。)
标签: assembly x86 stack cpu-registers