cpu执行何处的指令取决于CS:IP,可以通过改变、ip中的内容来控制要执行的目标命令
改变CS、IP的值:
~~**指令修改:**~~
8086cpu不提供对cs和ip修改的指令,如下指令是错误的
```
mov cs 2000H
mov ip 2000H
```
![](https://img.kancloud.cn/20/f7/20f7b47334b55a07dc0163874f09d526_358x135.png)
## **修改cs\ip的值**
**方法1**:debug中的R命令可以改变寄存器的值 rcs、rip(只是调试手段,并非程序方式)
```
r+空格+寄存器名(cs\ip)+回车+想要的段地址
```
**方法2:跳转指令jmp**
同时修改cs、ip的内容
```
//用指令中给出的段地址修改cs、偏移地址修改ip
jmp 段地址:偏移地址
```
```
//执行后: CS=2AE3H, IP=0003H, CPU将从2AE33H处读取指令。.
jmp 2AE3:3
//执行后: CS=0003H, IP=0B16H, CPU将从00B46H处读取指令。
jmp 3:0B16
```
仅修改ip的内容:jmp:某一合法寄存器
```
jmp ax //类似于 mov ip,ax
jmp bx //类似于 mov ip,bx
```
用寄存器中的值修改IP
内存中存放的机器码和对应的汇编指令情况如下图所示,
假设CPU初始状态:CS=2000H, IP=0000H.请写出指令执行序列。
![](https://img.kancloud.cn/ad/4b/ad4b86eb97a668abd5e430f36a525e40_1194x570.png)
执行过程如下。
(1)当前CS=2000H, IP=0000H,则CPU从内存2000Hx16+0=20000H处读取指令,读入的指令是: B8 22 66(mov ax,6622H),读入后1P=IP+3-=0003H
(2)执行后, CS=2000 , IP=0003H,则CPU从内存2000H X 16+0003H=20003H处读取指令,读入的指令是: EA 03 00 00 10(jmp 1000:0003), 读入后IP=IP+5=0008H;
(3)指令执行后, CS=1000H, IP=0003H,则CPU从内存1000H × 16+0003H=10003H处读取指令,读入的指令是: B8 00 00(mov ax,0000),读入后IP=IP+3=0006H;
(4)指令执行后, CS=1000H, IP=0006H,则CPU从内存1000H× 16+0006H=10006H处读取指令,读入的指令是: 8B D8(mov bx,ax),读入后IP=IP+2=0008H
(5)指令执行后, CS=1000H, IP=0008H,则CPU从内存1000H × 16+0008H=10008H处读取指令,读入的指令是: FF E3(jmp bx),读入后IP=IP+2=000AH;
(6)指令执行后, CS=1000H, IP=0000H, CPU从内存10000H处读取指令经分析后,可知指令执行序列为:
(1) mov ax,6622F
(2) jmp 1000:3
(3) mov ax,0000
(4) mov bx,ax
(5) jmp bx
(6) mov ax,0123H
(7)转到第3步执行