修改CS,IP的指令

段寄存器

8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址,段地址在8086CPU的段寄存器中存放,8086CPU有4个段寄存器:CS,DS,SS,ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。

CS和IP

CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地方,CS为代码段寄存器,IP为指令指针寄存器,在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存MX16+N单元开始,读取一条指令并执行。

修改CS,IP的指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制,CPU从何处执行指令是CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令。
我们如何改变CS,IP的值?显然,8086CPU必须提供相应的指令,我们如何修改AX中的值,可以用mov指令,如mov ax,123将ax中的值设为123,但是,mov不能用于设置CS,IP的值,8086CPU为CS,IP提供了另外的指令来改变它们的值。能够改变CS,IP的指令被称为转移指令。
jmp指令:

  • 若想同时修改CS,IP的内容,可用形如:“jmp段地址:偏移地址”的指令完成
  • jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令
  • jmp段地址:偏移地址指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP
  • 若要仅修改IP的内容:可用形如:jmp某一合法寄存器的指令完成
  • jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
  • 指令执行后:ax=1000H,CS=2000H,IP=1000H
  • "jmp某一合法寄存器"指令的功能为:用寄存器的值修改IP

内存中存放的机器码和对应的汇编指令情况如图所示,设CPU初始状态:CS=2000H,IP=0000H
在这里插入图片描述

  • 当前CS=2000H,IP=0000H,则CPU从内存2000Hx16+0=20000H处读取指令,读取指令是:B8 22 66(mov ax,6622H),读入后IP=IP+3=0003H
  • 指令执行后,CS=2000H,IP=0003H,则CPU从内存2000Hx16+0003H=20003H处读取指令,读入的指令是:EA 03 00 00 10(jmp 1000:0003),读入后IP=IP+5=0008H
  • 指令执行后,CS=1000H,IP=0003H,则CPU从内存1000Hx16+0003H=10003H处读取指令,读入的指令是:B8 00 00(mov ax,0000),读入后IP=IP+3=0006H
  • 指令执行后,CS=1000H,IP=0006H,则CPU从内存1000Hx16+0006H=10006H处读取指令,读入的指令是:8B D8(mov bx,ax),读入后IP=IP+2=0008H
  • 指令执行后,CS=1000H,IP=0008H,则CPU从内存1000Hx16+0008H=10008H处读取指令,读入的指令是:FF E3(jmp bx),读入后IP=IP+2=000AX
  • 指令执行后,CS=1000H,IP=0000H,CPU从内存10000H处读取指令…

经分析后,可知指令执行序列为:

  • mov ax,6622H
  • jmp 1000:3
  • mov ax,0000
  • mov bx,ax
  • jmp bx
  • mov ax,0123H
  • 转到第3步执行
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值