【问题标题】:Assembly Language 2 Book on Push and Pop汇编语言 2 关于推送和弹出的书
【发布时间】:2015-06-20 05:52:30
【问题描述】:

第一个问题 关于示例代码运行时会发生什么,哪项陈述是正确的?

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 只是被压入堆栈而不是值的变化

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

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

【问题讨论】:

    标签: assembly x86 stack


    【解决方案1】:

    你猜对了第​​一个。第二个很棘手,它很可能会在第 11 行崩溃(回答 d)。这是因为在Ex2Sub 中,pop eax 从堆栈中删除了最顶层的项目,即返回地址。所以当ret 尝试做同样的事情时,它会看到下一个项目,即20,并且不太可能是正确的代码地址。

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2012-11-27
      相关资源
      最近更新 更多