0207 jmp跳转指令
- 事实:执行何处的指令,取决于CS:IP
- 应用:可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令
如何改变CS、IP的值,以使得命令灵活执行
问题:如何改变CS、IP的值?
方法1:Debug 中的 R 命令可以改变寄存器的值——r cs, r ip
这种方式是可行的,但是Debug是调试手段,并非程序方式!
方法2:用汇编指令修改CS、IP
1 | mov cs, 2000H |
上述代码是不被指令集允许的,8086CPU不提供对CS和IP修改的指令,另辟蹊径:
1 | mov ax,2000H |
使用通用寄存器的值来改变CS中的值,这是允许的,但一般不这么做
1 | mov bx,0 |
使用通用寄存器的值来改变IP中的值,这是不被指令集允许的,IP的内容只支持通过执行命令后的自增运算改变其内容
方法3:转移指令jmp
jmp指令可以
1、jmp 段地址:偏移地址——同时修改CS:IP的内容
1 | jmp 2AE3:3 |
功能:用指令中给出的段地址修改CS的内容,用指令中给出的偏移地址修改IP的内容
2、jmp 某一合法寄存器(一般为通用寄存器)——仅修改IP的内容
1 | jmp ax (类似于 mov IP, ax,但指令集不允许直接mov IP,ax) |
功能:用寄存器中的值修改IP
问题分析
如下图所示,内存中从10000H处开始存在着一些指令,从20000H处开始又存在着另一些指令,当前CS:IP = 2000:0000

从20000H开始,执行指令的顺序是
(1)mov ax,6622
(2)jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)转到第(3)步执行
Debug验证命令执行(上述代码可以看成是汇编语言循环的一种简单实现)
1、在指定内存单元写入汇编命令

2、-r命令指定CS:IP 的内容

3、-t:开始执行CS:IP

