【问题标题】:Assembly practise understanding what happens with push command装配练习了解 push 命令会发生什么
【发布时间】: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


【解决方案1】:

让我们一步一步来:

mov eax, 10    ; This assigns the value 10 to the register EAX
push eax       ; This puts the value of EAX onto the stack (a LIFO structure)
push 20        ; This puts the DWORD value 20 onto the stack
mov ecx, eax   ; This moves the value of the register EAX to the register ECX - the left hand side is the destination in x86 assembly with intel syntax
pop eax        ; This puts the top value of the stack into EAX and decreases the stackpointer to now point to the preceding item

最后一条指令需要一些额外的信息。我提到堆栈是LIFO data structure。这代表后进先出

因此,EAX(=10) 的值首先被压入堆栈。在下一步中,值 20 被压入堆栈。 mov ecx, eax 指令对于这个任务没有意义,可以忽略。现在,使用pop eax,检索已压入堆栈的最后项(记住 LIFO)并将其放入寄存器 EAX。

因此最终答案是 EAX=20。

【讨论】:

  • 好吧,左侧是 x86 的普通/本机或 intel 语法的目的地,但 AT&T 语法右侧是目的地(左侧不是所有 x86 程序集的目的地)。第一条指令是这里的线索,这可能是 intel 语法,因此 ecx 获得了 eax 的副本。幸运的是,该指令与结果无关,因此语法风格不会影响这个问题。这里只有两个说明是相关的,并且没有英特尔与 AT&T 的问题。
  • @old_timer:我添加了一条通知,指出有问题的部分正在使用 Intel 语法。否则,如果代码使用 AT&T 语法,它会被% 字符淹没,所以任何人都可以很容易地注意到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多