汇编王爽老师书本中“检测点10.2”有不明白

2025-01-21 08:50:36
推荐回答(5个)
回答1:

兄台 莫慌 首先 ax的值到最后确实是6 我也调试了 有可能是你调试错了
要是调试错了应该没啥问题了 不过 我还是把问题再说一下吧
1000:0 mov ax,0
1000:3 call s
1000:6 inc ax
1000:7 s:pop ax
问: ax值多少 ? 答案 : 6
call指令执行 有两个过程 1: 当前ip值入栈 2:跳转到调用的代码段
那 在这个问题中 程序只有一次入栈与出栈,再结合call 所以 ax的值就是当前ip的值
那为什么是6 不是 3呢?
很简单,因为当前ip的值确实是6,cpu是不会错的,只是我们的理解错了
接着 为何当前 ip 值是6呢?
一条指令如如下执行的 :
1: cpu根据 ip 读指令(也就是从内存到缓冲区)
2:改变ip(指向下一条)
3:执行
那多条指令是如何执行的呢 照着上边重复就行了
所以 先读指令call s 然后ip指向6 接着执行(也就是 1:当前ip入栈 2:跳转)
所以 答案 ax 为 6
最后 手打不易~ 你们看着办吧

回答2:

内存地址那一行很重要,在call s的时候,紧接着它后面的指令的地址将被入栈作为返回地址,也就是6,然后跳到7执行pop ax也就是把刚才压入堆栈的返回地址作为值弹出到ax中了
至于你说的你加几个inc ax,ip就减 我敢说在这段程序里是不可能出现的,会出现的只是ip比7大

回答3:

之所以执行完call s后IP=7是因为call的执行过程是首先会将当前IP压栈,然后jmp,而jmp会修改IP寄存器的值。这也就是为什么你看到的压栈内容是6,而IP是7的原因。call是一个两步操作。
执行call s时IP=6,压栈后ss栈顶为6,call指令会触发jmp操作导致IP被定向到s,此时IP=7

回答4:

p179早就说了,先把ip指向下一条指令,然后再执行指令,所以ip先是等于6再入栈,pop出来也就是6,认真看书。

回答5:

Call指令有两部分
¹是把call指令后的第一个字节的偏移地址(Ip=6)送到栈中
²是下一指令的偏移地址Ip=(Ip(6)+Ip(s处的偏移地址)-Ip(被进栈的偏移地址))=7。这时候再执行7地址的指令 出栈ax=6