编程新手 发表于 2011-12-20 19:03:48

鱼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?还有老师我的分析有没有错呢?请指正下。

编程新手 发表于 2011-12-20 19:06:47

我的问题是说执行完jmp ax后,物理地址应该是定位在段地址+偏移地址0,这时候执行完后,这时候按照你给的答案是CPU也修改了1次IP的值,这也是最后一次修改了,为什么最后IP的值是0呢?还有这3行代码我的分析理解有没有错误呀,有的话请指正!

nbceshi 发表于 2011-12-20 20:30:40

先读取指令,IP加上指令长度,然后执行指令,IP改为ax的值0。书里可能讲的不是很清楚。

nbceshi 发表于 2011-12-20 20:33:08

汇编都是先读取指令,然后IP改变,然后执行指令的,后面的一些跳转指令也是这样的,如call。

编程新手 发表于 2011-12-21 09:40:03

我知道,他是把指令存在缓冲区里,然后IP+1,然后再执行这条指令,但我用DEBUG程序调试了下,-T,一条一条的执行,最后发现IP的变化只有3次,所以我才有点不解

nbceshi 发表于 2011-12-21 12:16:26

读取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次了

小马过河 发表于 2011-12-21 21:28:48

读取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

编程新手 发表于 2011-12-22 09:39:24

谢谢大家的帮助,只是我感觉你们说的还是不到位,我再分析下,请你们指正下
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]
查看完整版本: 鱼C老师请进