汇编语言2推送和流行书

时间:2015-04-14 14:44:49

标签: assembly x86 stack

第一个问题 关于示例代码运行时会发生什么的说法是正确的?

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

湾程序将在第6行停止运行时错误

℃。 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

湾程序将在第10行停止运行时错误

℃。 EAX将在第6行等于20

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

1。通过观察这一点,我认为EAX在第6行末尾仍然等于30,因为eax只是被推到了堆栈而不是值的变化

2。这个我相信它会因为LIFO(最后一次出局)而等于10。 EAX等于10,因为它是最后一个。

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

1 个答案:

答案 0 :(得分:3)

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