第一个问题 关于示例代码运行时会发生什么的说法是正确的?
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,因为它是最后一个。
这是一个新概念,任何帮助将不胜感激。
答案 0 :(得分:3)
你有第一个正确。第二个是棘手的,它很可能会在第11行崩溃(回答d
)。这是因为在Ex2Sub
中pop eax
删除了堆栈中最顶层的项目,即返回地址。因此,当ret
尝试执行相同操作时,它会看到下一个项目20
,而且不太可能是正确的代码地址。