0%

第九章 转移指令

概述

转移指令就是可以控制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
2
3
4
JMP    CX   ;     ;(IP)=(CX)
JMP WORD PTR [BX]; ;(IP)=([BX])
JMP WORD PTR DS:[0];
JMP WORD PTR [BX][SI]

段间转移

段间转移时,程序将从一个代码段转移到另一个代码段中支执行,转移的目的地址由段地址和偏移地址构成,因此段间转移需要同时修改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
2
3
4
5
6
7
8
1)MOV  AL,[1000H]
2)MOV AH,SI
3)MOV AX,[BP]
4)MOV AL,BYTY PTR [BX][SI]
5)ADD AX,[BP+10]
6)ADD AL,ES:[BX]
7)MOV AL,[BX][SI+8]
8)MOV AL,ES:[BX+SI]

(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
2
3
4
5
6
7
8
9
10
11
assume cs:code
code segment
s: mov ax,bx
mov si, offset s
mov di, offset s0
--------
--------
s0: nop
nop
code ends
end s
1
2
mov ax, [si]     
mov [di], ax

判断下列转移指令的转移方式:

1
2
3
4
5
6
7
Jmp  word  ptr  [bx+8 ] ; 段内间接转移
Jmp far ptr s(S为标号) ;段间直接转移
Jmp bx ; 段内间接转移
Jmp near ptr s ; 段内直接近转移
Jmp dword ptr [bx] ; 段间间接转移
Jmp short ptr s ; 段内直接短转移
Jmp word ptr [bx+si] ;段内间接转移

若要使程序中的JMP
指令执行后,CS:IP指向程序的第一指令,在data段中应定义哪些数据?

1
2
3
4
5
6
7
8
9
10
11
assume   cs:code
data segment
?
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
1
2
db  0        ; 偏移地址0(占位,不影响)
dw 0000H

补全程序,使jmp指令
执行后,CS:IP指向
程序的第一条指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2、程序如下:
assume cs:code
data segment
dd 12345678h
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov [bx],---
mov [bx+2],---
jmp dword ptr ds:[0]
code ends mov bx,0
end start
1
2
mov  [bx], 0h 
mov [bx+2], cs