汇编王爽老师书本中“检测点10.2”有不明白
内存地址机器码汇编指令;我调试过,有问题1000:0b80000movax,0;ax=0理解1000:3e80100calls;这条执行ip=7,压入栈的内容是6了。为什...
内存地址 机器码 汇编指令 ;我调试过,有问题
1000:0 b8 00 00 mov ax,0 ;ax=0理解
1000:3 e8 01 00 call s ;这条执行ip=7,压入栈的内容是6了。为什么?
1000: 6 40 inc ax ;我这里多加几个inc ax,ip就好像减几个。
1000:7 58 s:pop ax ;于是出栈ax=6
网上的答案:说call s的时候ip的值是6,可调试时明明是7.
(ip)=(ip)+16位位移。这里16位位移是什么意思。我知道(*16)是左移1位。16位位移我没明白。
书上解释16位位移=标号处地址-call指令后的第一个字节地址。按照上面应该是1了。是哇?还是不能解释IP是7,可是进栈都是6.
希望前辈能指导一下,我再看下去要混乱了。万分感谢 展开
1000:0 b8 00 00 mov ax,0 ;ax=0理解
1000:3 e8 01 00 call s ;这条执行ip=7,压入栈的内容是6了。为什么?
1000: 6 40 inc ax ;我这里多加几个inc ax,ip就好像减几个。
1000:7 58 s:pop ax ;于是出栈ax=6
网上的答案:说call s的时候ip的值是6,可调试时明明是7.
(ip)=(ip)+16位位移。这里16位位移是什么意思。我知道(*16)是左移1位。16位位移我没明白。
书上解释16位位移=标号处地址-call指令后的第一个字节地址。按照上面应该是1了。是哇?还是不能解释IP是7,可是进栈都是6.
希望前辈能指导一下,我再看下去要混乱了。万分感谢 展开
5个回答
展开全部
兄台 莫慌 首先 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
最后 手打不易~ 你们看着办吧
要是调试错了应该没啥问题了 不过 我还是把问题再说一下吧
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
最后 手打不易~ 你们看着办吧
华芯测试
2024-09-01 广告
2024-09-01 广告
电学测试台是深圳市华芯测试科技有限公司的核心设备之一,它集成了高精度测量仪器与自动化控制系统,专为半导体芯片、电子元件及模块的电性能检测而设计。该测试台能够迅速、准确地完成电压、电流、电阻、电容及频率等关键参数的测试,确保产品质量符合行业标...
点击进入详情页
本回答由华芯测试提供
展开全部
内存地址那一行很重要,在call s的时候,紧接着它后面的指令的地址将被入栈作为返回地址,也就是6,然后跳到7执行pop ax也就是把刚才压入堆栈的返回地址作为值弹出到ax中了
至于你说的你加几个inc ax,ip就减 我敢说在这段程序里是不可能出现的,会出现的只是ip比7大
至于你说的你加几个inc ax,ip就减 我敢说在这段程序里是不可能出现的,会出现的只是ip比7大
追问
ip减少是我个人感觉,因为多一个inc ax就减一下。我觉得这道理能明白些。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
之所以执行完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
执行call s时IP=6,压栈后ss栈顶为6,call指令会触发jmp操作导致IP被定向到s,此时IP=7
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p179早就说了,先把ip指向下一条指令,然后再执行指令,所以ip先是等于6再入栈,pop出来也就是6,认真看书。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Call指令有两部分
¹是把call指令后的第一个字节的偏移地址(Ip=6)送到栈中
²是下一指令的偏移地址Ip=(Ip(6)+Ip(s处的偏移地址)-Ip(被进栈的偏移地址))=7。这时候再执行7地址的指令 出栈ax=6
¹是把call指令后的第一个字节的偏移地址(Ip=6)送到栈中
²是下一指令的偏移地址Ip=(Ip(6)+Ip(s处的偏移地址)-Ip(被进栈的偏移地址))=7。这时候再执行7地址的指令 出栈ax=6
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询