鱼C老师请进
在汇编语言 检测点2.3中,我不懂为什么最后IP的值得为0。mov ax,bx
这里是把bx送到ax,然后IP自加指令长度,这时候CPU修改了1次IP的值
sub ax,ax
这里是把ax-ax的值送到ax中,然后IP自加指令长度,这时候CPU修改了1次IP的值
jmp ax
这里是把ax的值设置为IP的值,也是CPU修改了一次IP的值
执行完jmp ax后,物理地址应该是定位在段地址+偏移地址0,这时候执行完后,IP不会加上这条语句的指令长度吗?为什么最后IP的值是0?还有老师我的分析有没有错呢?请指正下。
我的问题是说执行完jmp ax后,物理地址应该是定位在段地址+偏移地址0,这时候执行完后,这时候按照你给的答案是CPU也修改了1次IP的值,这也是最后一次修改了,为什么最后IP的值是0呢?还有这3行代码我的分析理解有没有错误呀,有的话请指正! 先读取指令,IP加上指令长度,然后执行指令,IP改为ax的值0。书里可能讲的不是很清楚。 汇编都是先读取指令,然后IP改变,然后执行指令的,后面的一些跳转指令也是这样的,如call。 我知道,他是把指令存在缓冲区里,然后IP+1,然后再执行这条指令,但我用DEBUG程序调试了下,-T,一条一条的执行,最后发现IP的变化只有3次,所以我才有点不解 读取mov ax,bx
IP指向sub ax,ax IP改变第一次
执行mov ax,bx
读取IP指向的sub ax,ax
IP指向jmp ax IP改变第二次
执行sub ax,ax
读取jmp ax
IP指向下一个内存地址,但你看不到,因为debug -t后返回的是执行后的状态
执行jmp ax IP变为ax的值0, 这是你看到的第三次改变,实际IP寄存器的状态改变4次了 读取mov ax,bx
IP指向sub ax,ax IP改变第一次
执行mov ax,bx
此时bx的内容就等于ax的内容因为是传送指令将BX送给AX
读取IP指向的sub ax,ax
IP指向jmp ax IP改变第二次
执行sub ax,ax
此时ax=0因为SUB是减法指令AX-BXAX=0
读取jmp ax
IP指向下一个内存地址,但你看不到,因为debug -t后返回的是执行后的状态
执行jmp ax IP变为ax的值0, 这是你看到的第三次改变,实际IP寄存器的状态改变4次了
将AX送给IP ip=ax=0 谢谢大家的帮助,只是我感觉你们说的还是不到位,我再分析下,请你们指正下
mov ax,bx
这时候CPU修改了1次IP的值,然后才执行命令才把bx里的数据放到ax里。(因为指令都是先放在指令缓冲器里,然后IP自加,然后才执行相应的指令,所以是IP先自加,然后再把bx里的数据放到ax里)
sub ax,ax
这时候CPU修改了1次IP的值,然后才执行命令这里是把ax-ax的值送到ax中。
jmp ax
这时候CPU修改了1次IP的值,然后才执行命令jmp ax指令。
但是执行jmp ax 就是把ax的值放到ip中,所以这时候又修改了1次IP的值,把IP=0,所以最后IP的值是0
各位觉得我这样解释,是不是行的通或是不是正确的理解了这几行代码?
页:
[1]