💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
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步执行