内存地址 机器码 汇编指令 ;我调试过,有问题
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.
希望前辈能指导一下,我再看下去要混乱了。万分感谢
汇编王爽老师书本中“检测点10.2”有不明白
答案:2 悬赏:40 手机版
解决时间 2021-02-23 14:20
- 提问者网友:龅牙恐龙妹
- 2021-02-23 09:40
最佳答案
- 五星知识达人网友:我住北渡口
- 2021-02-23 10:35
内存地址那一行很重要,在call s的时候,紧接着它后面的指令的地址将被入栈作为返回地址,也就是6,然后跳到7执行pop ax也就是把刚才压入堆栈的返回地址作为值弹出到ax中了
至于你说的你加几个inc ax,ip就减 我敢说在这段程序里是不可能出现的,会出现的只是ip比7大
至于你说的你加几个inc ax,ip就减 我敢说在这段程序里是不可能出现的,会出现的只是ip比7大
全部回答
- 1楼网友:老鼠爱大米
- 2021-02-23 11:48
争议之所以执行完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
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯