花上班的休息时间写出来的一篇文章
注意:以下寄存器命令执行环境为实模式,保护模式下CS:IP的寻址方式会发生变化,以下模式不再适用。
根据网上资料查询可知:
CS和IP为两个寄存器,分别是代码段寄存器和指令指针寄存器,CS寄存器中所存储的数据是当前要执行的代码段的首地址,IP寄存器中所存储的数据是下一段将要执行的代码段的地址,本人的理解为偏移量或者代码段长度。两个寄存器一般组合在一起使用,作为8086CPU中最关键的两个寄存器,CS:IP指向了当前要执行的指令的地址。
下面是正文 ————————————————————————
在解释CS:IP是怎么执行指令之前,先要补充一些知识。
一.代码段
使用以下代码段来说明:
以上为一段长度为24个byte的代码,假设存放在内存中,地址从00000H~00018H中,那么就可以认为,内存单元00000H~00018H是用来存放代码的,是一个代码段。PS:CPU只会将CS:IP所指向的内存单元里面的内容视为指令,其他内存单元里面的内容可以是指令也可以是数据,所以如果想要将指定内存单元里面的内容视为指令,可让CS:IP指向代码段首地址即可(可以使用汇编指令jmp进行指向)。
二.地址加法器的运算方法
如CS = FFFFH, IP = 0000H,在取出CS:IP中的地址前先对这两个寄存器中所存储的地址进行相加操作,操作如下:1.CS中的数据左移四位, 所以最终CS = FFFF0H(为什么会得到这个结果?因为这个数据是16进制的,“H”代表了“HEX”) 2.CS+IP = FFFF0H+0000H = FFFF0H。3.最后地址加法器将“FFFFF0H”这个地址输出,并且开始寻找该地址所在的内存单元,由此可以CS:IP两个寄存器相加所得到的地址才是实际的代码段的内存单元的地址。
三.指令的执行过程
1)8086CPU当前状态
2)CS寄存器以及IP寄存器内的数据传输到地址加法器进行加法操作
3)获得地址13200传入控制电路中,控制电路将地址传入地址总线中
4)地址总线在内存单元中找到该地址中的数据并传入到数据总线中
5)控制电路接收数据总线中的数据,并将数据存放到数据缓冲区中
6)最后数据缓冲区中的数据送入执行器中,命令执行,IP寄存器中的数据加2