概述
转移指令就是可以控制CPU执行指令顺序的指令。
8086CPU的转移行为分为:
- 段内转移——只修改IP的值
- 短转移:IP的变化范围为-128—+127
- 近转移:IP的变化范围为-32768—+32767
- 段间转移——同时修改CS和IP的值
8086CPU的转移指令分为:
- 无条件转移指令
- 条件转移指令
- 循环指令
- 过程
- 中断
无条件转移指令(JMP)
1、段内转移
段内转移又可分为下面三种形式:
- 段内直接短转移
- 段内直接近转移
- 段内间接转移
2、段间转移
段间转移又可分为下面二种形式:
- 段间直接转移
- 段间间接转移
段内转移指令的转移范围在JMP指令所在的段内,只需将IP的值加上转移目的地的偏移量就可控制指令的转移
- 只需修改IP的值
- 转移目的地址是由JMP指令到目的地的偏移量决定的
- 偏移量为8位或16位的带符号数(8位偏移量的范围为-128—127;16位的偏移量的范围为-32768—32767,其中负数为向前转移,正数为向后转移)
段内直接短转移
指令格式: JMP SHORT 标号
执行操作: (IP)=(IP)+8位偏移量
段内直接近转移
指令格式: JMP NEAR PTR 标号
执行操作: (IP)=(IP)+16位偏移量
注:上述两种转移指令都可以写作简化格式
JMP 标号
段内间接转移
指令格式:JMP WORD PTR OPR JMP 寄存器
注:OPR为除立即数寻址方式以外的任一种寻址方式。
1 | JMP CX ; ;(IP)=(CX) |
段间转移
段间转移时,程序将从一个代码段转移到另一个代码段中支执行,转移的目的地址由段地址和偏移地址构成,因此段间转移需要同时修改CS和IP的值。
需同时修改CS和IP的值;
偏移量由段地址和偏移地址组成
段间直接转移
指令格式: JMP FAR PTR 标号
执行操作:
(IP)=标号的段内偏移地址
(CS)=标号所在段的段地址
例: JMP FAR PTR S
段间间接转移
指令格式: JMP DWORD PTR [ ]
执行操作:用确定的内存单元中的双字的低字修改IP,高字修改CS的值。
例:JMP DWORD PTR [BX]JMP DWORD PTR [BX][DI]
注:JMP 1000:0020这种格式只能用于DEBUG中,在源程序中出现时编译器不能编译,会报错。
取值运算符OFFSET
功能:取得一个标号的偏移地址。
举例: MOV AX,OFFSET S
条件转移指令JCXZ
格式: JCXZ 标号
功能: 当CX=0时转移到标号处执行。
注:所有的条件转移都为段内短转移
循环指令LOOP
功能:当CX≠0时转移到标号处执行。
注:所有的循环指令都是段内短转移
例题
已知DS=1000H,ES=2000H,SS=3800H,SI=1010H,BX=0200H,BP=0020H,请指出下列指令的源操作数字段是什么寻址方式?源操作数字段的物理地址是多少?
1 | 1)MOV AL,[1000H] |
(1)直接寻址 DS*16+1000H=11000H
(2)寄存器寻址 无(寄存器操作不涉及内存地址)
(3)寄存器间接寻址 SS × 16 + BP
(4)基址变址寻址 DS × 16 + BX + SI
(5)寄存器相对寻址 SS × 16 + BP + 10
(6)寄存器间接寻址 ES × 16 + BX
(7)基址变址相对寻址 DS × 16 + BX + SI + 8
(8)基址变址寻址 ES × 16 + BX + SI
补全下面程序,使该程序在运行中将S处的一条指令复制到S0处。
1 | assume cs:code |
1 | mov ax, [si] |
判断下列转移指令的转移方式:
1 | Jmp word ptr [bx+8 ] ; 段内间接转移 |
若要使程序中的JMP
指令执行后,CS:IP指向程序的第一指令,在data段中应定义哪些数据?
1 | assume cs:code |
1 | db 0 ; 偏移地址0(占位,不影响) |
补全程序,使jmp指令
执行后,CS:IP指向
程序的第一条指令。
1 | 2、程序如下: |
1 | mov [bx], 0h |