关于 Push 和 Pop 的汇编语言 2 书

Assembly Language 2 Book on Push and Pop

第一题 关于示例代码运行时会发生什么,下列哪项说法是正确的?

1: main PROC
2: mov eax,30
3: push eax
4: push 40
5: call Ex3Sub
6: INVOKE ExitProcess,0
7: main ENDP
8:
9: Ex3Sub PROC
10: pusha
11: mov eax,80
12: popa
13: ret
14: Ex3Sub ENDP

一个。 EAX 将在第 6 行等于 40

b。该程序将在第 6 行出现运行时错误而停止

c。 EAX 将在第 6 行等于 30

d。该程序将在第 13 行出现运行时错误而停止

第二个问题 关于示例代码运行时会发生什么,下列哪项说法是正确的?

1: main PROC
2: push 10
3: push 20
4: call Ex2Sub
5: pop eax
6: INVOKE ExitProcess,0
7: main ENDP
8:
9: Ex2Sub PROC
10: pop eax
11: ret
12: Ex2Sub ENDP

一个。 EAX 将在第 6 行等于 10

b。该程序将因第 10 行的运行时错误而停止

c。 EAX 将在第 6 行等于 20

d。该程序将在第 11 行出现运行时错误而停止

1.通过查看这个,我认为 EAX 在第 6 行的末尾仍然等于 30,因为 eax 只是被压入堆栈而不是 value

的变化

2。由于 LIFO(后进先出),我认为这会等于 10。 EAX 等于 10,因为它是最后一个 in.

这是一个新概念,如有任何帮助,我们将不胜感激。

你答对了第一个。第二个比较棘手,它很可能会在第 11 行崩溃(答案 d)。这是因为在 Ex2Sub 中,pop eax 从堆栈中删除了最顶层的项目,即 return 地址。因此,当 ret 尝试执行相同操作时,它将看到下一项,即 20 并且不太可能是正确的代码地址。