我们前面讲到内存地址是由段地址+偏移地址组成,例如:073F:0100。
接下来我们通过debug工具来检测,内存地址到底存放在哪个寄存器:
图1-1
从图1-1中,以073F:0100为例,我们可以看出0100(偏移地址)的存放寄存器有且只有一个,也就是IP寄存器;存放073F(段地址)的寄存器有DS、ES、SS、CS寄存器。
我们依次修改DS、ES、SS、CS,执行debug u命令查看变化。
首先修改DS:
修改ds的值为0
执行后,指令缓存器内存地址未发生变化
继续修改ES:
还是没变化
修改SS:
依旧
最后修改CS:
指令缓存器内存地址发生变化,由073F:0100变更为0000:0100
最终,我们得出结论——CS寄存器存放段地址,IP寄存器存放偏移地址。
指令的执行步骤如下:
步骤一:CPU从CS:IP 所指向的内存单元读取指令,存放到指令缓存器中。
步骤二:IP = IP + 所读指令的长度,从而指向下一条指令。
步骤三:执行指令缓存器中的内容,回到步骤一