CS:IP是保存汇编指令的地方,它不会自动执行需要编译成可执行文件,或者在debug中使用t命令时才会将这些汇编指令取出来执行
CS:代码段寄存器
IP:指令指针寄存器
CS:IP:CPU将内存中的CS:IP指向的内容当做指令执行
![](https://img.kancloud.cn/da/c1/dac115e5de57d86a26d13bcb4a3d95dc_709x423.png)
![](https://img.kancloud.cn/f6/ab/f6ab573d552cdffadebe8799f2fe0208_877x317.png)
![](https://img.kancloud.cn/00/10/0010f59a60c212bd5109a62cad9eb727_789x458.png)
(1) 8086CPU当前状态: Cs中的内容为2000H, IP中的内容为0000H;
(2)内存20000H-20009H单元存放着可执行的机器码;
(3)内存20000H-20009H单元中存放的机器码对应的汇编指令如下。
地址: 20000H-20002H,内容: B8 23 01,长度: 3Byte,对应汇编指令: mov ax,0123H
地址: 20003H-20005H,内容: BB 03 00,长度: 3Byte,对应汇编指令: mov bx,0003H
地址: 20006H-20007H,内容: 89 D8,长度: 2Byte,对应汇编指令: mov ax,bx
地址: 20008H-20009H,内容: 01 D8,长度: 2Byte,对应汇编指令: add ax,bx
**8086cpu执行一条指令的过程:**
![](https://img.kancloud.cn/45/9c/459c86b88f35afa4d1e5a68c0b68c1e0_777x373.gif)
此时, CS: IP指向内存单元2000:0003.
执行控制器执行指令B8 23 01(即mov ax.0123H)
指令B82301被执行后AX中的内容为0123H(此时, CPU将从内存单元2000:0003处读取指令。)
CS:2000H, IP:0003H(CPU将从内存2000H× 16+0003H处读取指令BB 03 00)
CPU从内存20003H处读取指令BB 03 00入指令缓沖器(IP中的值加3)
执行指令вв 03 00(D mov bx.0003н)
CPU从内存20006H处读取指令89D8入指令缓冲器(IP中的值加2)
执行指令89 D8(即 mov ax,bx)后, AX中的内容为0003H
CPU从内存20008H处读取指令01 D8入指令缓冲器(IP中的值加2)
执行指令01 D8(即add ax.bx)后, AX中的内容为0006H
将长度为10个字节的指令,存放在123B0H-123B9H的一组内存单元中,我们就可以认为, 123B0H-123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节
```
mov ax, 0000 (B8 00 00)
add ax,0123B (05 23 01)
mov bx, ax (8B D8)
jmp bx (FF E3)
```
如何使得代码段中的指令被执行呢?
CPU并不会自动地将我们定义的代码段中的指令当作指令来执行。
CPU只认被CS:IP指向的内存单元中的内容为指令。
所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。对于上面的例子,我们将一段代码存放在123BOH-123B9H内存单元中,将其定义为代码段,如果要让这段代码得到执行,可设CS=123BH. IP=0000H。
## **小结**
(1)段地址在8086CPU的段寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址.
(2) CS存放指令的段地址, IP存放指令的偏移地址8086机中,任意时刻, CPU将CS:IP指向的内容当作指令执行。
(3) 8086CPU的工作过程:①从CS: IP指向的内存单元读取指令,读取的指令进入指令缓冲器:@IP指向下一条指令③执行指令。(转到步骤0,重复这个过程。)
(4) 8086CPU提供转移指令修改cs,IP的内容。