126
1 第第第 第第第第第第 第第第4.1 8086/8088 指指指 指指 4.2 8086 指指指

第四章 指令系统

Embed Size (px)

DESCRIPTION

第四章 指令系统. 4.1 8086/8088指令系统概述 4.2 8086指令系统. 一、8086/8088指令系统的特点 1.指令系统的兼容性 2. 指令格式的灵活性 3. 寻址方式的多样性 4. 可对多种类型的数据进行处理 5. 可构成多处理机系统. 执行的运算 运算结果的去向 运算数据的来源. 指令中应包含的信息:. 二、指令格式. 指令: 指令是指示计算机完成特定操作的命令 指令系统: 指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。. 目的操作数. 源操作数. 执行何种操作. - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章  指令系统

1

第四章 指令系统第四章 指令系统

4.1 8086/8088指令系统概述

4.2 8086指令系统

Page 2: 第四章  指令系统

2

一、 8086/8088 指令系统的特点 1. 指令系统的兼容性 2. 指令格式的灵活性 3. 寻址方式的多样性 4. 可对多种类型的数据进行处理 5. 可构成多处理机系统

Page 3: 第四章  指令系统

3

二、指令格式二、指令格式指令:指令是指示计算机完成特定操作的命令

指令系统:指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。

指令中应包含的信息:指令中应包含的信息:执行的运算运算结果的去向运算数据的来源

Page 4: 第四章  指令系统

4

指令格式:指令格式: 操作码 [ 操作数 ] , [ 操作数 ]

执行何种操作 目的操作数 源操作数

参加操作的数据

源操作数: 指令加工之前的数据

目的操作数:指令加工之后形成的数据

Page 5: 第四章  指令系统

5

指令中的操作数表征方法指令中的操作数表征方法 ::

表征参加操作的数据本身 立即数

表征数据存放的地址 寄存器

存储器

Page 6: 第四章  指令系统

6

操作数类型

1 、立即数操作数: 表示参加操作的数据本身,可以是 8 位或 16

位 例: MOV AX, 1234H ; AX 1234H

MOV BL, 22H 立即数无法作为目标操作数 立即数可以是无符号或带符号数,其数值应在

可取值范围内

Page 7: 第四章  指令系统

7

2 、寄存器操作数: 表示参加运算的数存放在指令给出的寄存器中,可

以是 16 位或 8 位。

例: MOV AX, BX

MOV DL, CH

Page 8: 第四章  指令系统

8

3 、存储器操作数:

例: MOV AX, [1200H]

MOV AL , [1200H]

22H11H

1200H偏移地址

AH AL

Page 9: 第四章  指令系统

9

例如:

MOV AL,[BP]

该指令生成的机器码是 8A4600H

Page 10: 第四章  指令系统

10

三、寻址方式 计算机可以对存储器、寄存器中的数据进行各种操作,如取数、存数、加运算、减运算等,这就需要找到数据的存放地址,再对其中的数据执行相应的操作,最后将运算结果送往指定的地址单元或寄存器。指令的寻址方式就是寻找指令操作数所在地址的方式,以确定数据的来源和去处。熟练地掌握寻址方式对学习指令系统和汇编语言程序设计具有重要作用。下面介绍 8086/8088 的几种寻址方式。

Page 11: 第四章  指令系统

11

1. 立即寻址 指令操作数部分直接给出指令的操作数,它与指令操

作码相接,顺序存放在代码段中。立即数有 8 位和16 位之分。

例 1 : MOV AH, 36H ; AH 立即数 36H MOV CX, 2A50H ; CX 立即数 2A50H

Page 12: 第四章  指令系统

12

注意: ( 1 ) 立即寻址方式只能用于源操作数,主要用于给寄

存器赋值。( 2 ) 立即寻址方式不执行总线周期,执行速度快。

2. 寄存器寻址操作数放在寄存器内,由指令直接给出某个寄存器

的名字,以寄存器的内容作为操作数。寄存器可以是 16 位的

AX、 BX、 CX、 DX、 SI、 DI、 SP、 BP 寄存器,也可以是 8 位的AH、 AL、 BH、 BL、 CH、 CL、 DH、 DL

寄存器。

Page 13: 第四章  指令系统

13

例 2: MOV AX, CX

DEC AL

注意: ( 1 ) 寄存器寻址方式的指令操作在 CPU 内部执行,

不需要执行总线周期,执行速度快。( 2 ) 寄存器寻址方式既适用于指令的源操作数,也

适用于目的操作数,并且可同时用于源操作数和目的操作数。

Page 14: 第四章  指令系统

14

3. 直接寻址 操作数在存储器中,指令中直接给出操作数所在存储单元

的有效地址 EA ,即段内偏移地址,表示操作数所在存储单元距离段首址的字节数。有效地址是一个无符号的 16 位二进制数。

例 3:MOV AH, [2100H] ;将 DS 段中 2100H 单元的内 容送给 AH

MOV AX, [2100H] ;将 DS 段中 2100H 单元的内 容送给 AL ; 2101H 单元的 内容送给 AH 。 MOV [1000H], AH ; DS:1000H←(AH)

Page 15: 第四章  指令系统

15

DS=3000H

MOV AX, [2000H]

Page 16: 第四章  指令系统

16

注意: ( 1 ) 直接寻址方式的操作数所在存储单元的段地

址一般在数据段寄存器 DS 中。( 2 ) 如果操作数在其他段,则需要在指令中用段

超越前缀指出相应的段寄存器名。

例 4:MOV AH , ES [2000H] ∶ 将附加段寄存器 ES 的内容乘 16 ,再加上 20

00H 作为操作数所在存储单元的地址,取出该存储单元的内容送到寄存器 AH 中。

Page 17: 第四章  指令系统

17

4. 寄存器间接寻址 操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址 EA (偏移地址)。寄存器仅限于 BX、 BP, SI、 DI。

当使用 BX、 SI、 DI 时,操作数所在存储单元的段地址存在数据段寄存器 DS 中 当使用 BP 时,操作数所在存储单元的段地址存在堆栈段寄存器 SS 中。

[SI] [DI] [BX] [BP]

EA=

Page 18: 第四章  指令系统

18

MOV BX, [SI]

Page 19: 第四章  指令系统

19

例 5 :已知: DS=2100H, DI=2000H

指令: MOV AX, [DI]

解: 物理地址 =16×DS+DI

=16×2100H+2000H=23000H

指令执行结果是将 23000H 和 23001H 单元的内容送入寄存器 AX 中。注意:1. 只有 SI, DI, BX, BP 可作为间址寄存器。2. 若操作数所在存储单元不在数据段 DS 中,需要在指令中用段超越前缀表明其所在段的段名。

Page 20: 第四章  指令系统

20

5. 基址寻址 操作数在存储器内,指令中寄存器( BX或BP) 的内容与指令指

定的位移量之和作为操作数所在存储单元的有效地址 EA (偏移地址)。

使用 BX 时,段地址为 DS 的内容; 使用 BP 时,段地址为 SS 的内容。

[BX] 8 位或 16 位 [BP] 位移量 EA= +

Page 21: 第四章  指令系统

21

例 6 : SS=2000H, BP=1000H, COUNT=2000H (16 位偏移量 )

指令: MOV AX, COUNT[BP]

解:物理地址 =16×SS+BP+16 位偏移量 =20000H+1000H+2000H=23000H

指令执行结果是将 23000H 和 23001H 单元的内容送入寄存器 AX 中。

MOV BL, 2[BX]

或 MOV BL, [BX+2] ; (DS:[BX+2])BL

Page 22: 第四章  指令系统

22

6. 变址寻址 操作数在存储器内,指令将变址寄存器 SI、 DI 内容与

指令指定的位移量之和作为操作数所在存储单元的有效地址 EA (偏移地址)。段地址规定为 DS 的内容。

[SI] 8 位或 16 位 [DI] 位移量 EA= +

例 7: DS=3000H, SI=1000H, COUNT=2000H

指令: MOV AX, COUNT[SI]

解:物理地址 =16×DS+SI+16 位偏移量 =30000H+1000H+2000H=33000H

指令执行结果是将 33000H 和 33001H 单元的内容送入寄存器 AX 中。

Page 23: 第四章  指令系统

23

MOV AX, 2[DI]; AX← (DS:(DI)+2)

MOV AX, [DI+2]; AX← (DS:(DI)+2)

MOV BX, COUNT [SI]

Page 24: 第四章  指令系统

24

7. 基址加变址寻址 操作数在存储器内。指令将基址寄存器 BX、BP 与变址寄存器 SI、DI 的内容之

和再加上偏移量( 8 位或 16 位),得到操作数所在存储单元的有效地址 EA。

当使用 BX 时,段寄存器为 DS。 当使用 BP 时,段寄存器为 SS。 [BX] [SI] 8 位或 16 位 [BP] [DI] 位移量 EA= + +

Page 25: 第四章  指令系统

25

例 8 :已知: DS=2000H, BX=1000H, SI=0500H,MK=1120H 指令: MOV AX , [MK+ BX+ SI] 解: 物理地址 =20000H+ 1000H+ 0500H + 1120H

=22620H

指令执行结果是将 22620H、 22621H 单元的内容送入寄存器 AX 中。

Page 26: 第四章  指令系统

26

MOV AX, [BX][SI]

Page 27: 第四章  指令系统

27

8. 字符串寻址用于字符串操作指令。规定变址寄存器 SI 中的内

容是源数据串的段内偏移地址,而变址寄存器 DI

中的内容是目标数据串的段内偏移地址。源数据串的段地址规定是数据段 DS ,目标数据串

的段地址规定是附加段 ES 。指令执行后 SI和 DI

的内容自动增量(或减量),增(或减)值为 1 或2 。

例 : MOVSB

执行后: [DI]←[SI] SI←SI±1 DI←DI±1

Page 28: 第四章  指令系统

28

9. I/O 端口寻址 寻找输入输出设备的端口地址,可分为直接端口寻 址

和间接端口寻址。直接端口寻址:由指令直接给出 I/O 设备的端口地址。 它规定端口地址为 8 位,能寻址 256 个端口间接端口寻址:由 DX 给出 I/O 设备的端口地址。由于

DX

是 16 位,因此间接端口寻址能寻址多达 64K

个端口。例: IN AL, 20H ;将地址为 20H 的外设内容读入 AL

中 OUT DX, AL; AL 中内容输出给以 DX 的内容为地址 的外设

Page 29: 第四章  指令系统

29

10、 隐含寻址 指令隐含了的一个或两个操作数的地址,即操作数

在默认的地址中。

例: AAA ; 对 AL 中的内容进行十进制加法调整,并 把调整后的结果放入 AH和 AL 中。这条指令的隐含操作数是 AH和 AL 。

Page 30: 第四章  指令系统

30

例:设 BX=0158H, DI=10A5H, 位移量 =1B57H, DS=2100H ,求各寻址方式下的有效地址和物理地址。

1) 直接寻址 MOV AX,[1B57H]

有效地址 =1B57H

物理地址 =21000H+1B57H=22B57H

2 )寄存器间接寻址 MOV AX, [BX]

有效地址 =0158H

物理地址 =21000H+0158H=21158H

3 )基址寻址 MOV AX, [BX+1B57H]

有效地址 =0158H+1B57H=1CAFH

物理地址 =21000H+1CAFH=22CAFH

4 )变址寻址 MOV AX,[DI+1B57H] EA=10A5H+1B57H=2BFCH 物理地址 =21000H+2BFCH=23BFCH

5 )基址加变址寻址 MOV AX,[BX+DI+1B57H] EA= 0158H+10A5H+1B57H=2D54H 物理地址 =21000H+2D54H=23D54H

Page 31: 第四章  指令系统

31

4.2 80864.2 8086 的指令系统的指令系统

指令系统包括九大类、 133 种基本指令,通过寻址方式的变化与数据形式(字节、字型)的组合,可构成上千条指令。指令系统按功能分为数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理机控制、输入输出、中断等,本节将分别说明。

Page 32: 第四章  指令系统

32

4.2.1 数据传送指令数据传送类指令实现 CPU 内部寄存器之间、 CPU 与存储器之间、 CPU与 I/O 端口之间的数据传送。1. 通用数据传送指令包括 MOV 、进栈、出栈指令、交换指令和换码指令。( 1 )一般数据传送指令 MOV( 8 位 /16 位) 格式: MOV OP 目, OP 源 功能: OP 源 OP 目 要求: OP 目 可以是寄存器(除 CS 外)、存储器 OP 源可以是寄存器、存储器和立即数

Page 33: 第四章  指令系统

33

Page 34: 第四章  指令系统

34

例: MOV AL, BL ; BL 寄存器的内容送 AL

MOV SP, 2AC0H ; 立即数 2AC0H送 SP

MOV [DI] , AX ; AX 中的 16 位数送 DI 和DI+1 单元

MOV SI, ES:[BP] ; 附加段中 BP 所指向的两个单

元的内容送 SI 寄存器 MOV WORD PTR [SI], 6070H

Page 35: 第四章  指令系统

35

注意: MOV 指令的两个操作数(源、目的)均可采用不同

的寻址方式。 源操作数和目的操作数的类型必须一致 不允许把立即数作目的操作数,也不允许向段寄存器

送立即数。 不允许在段寄存器之间、存储器单元之间传送数据。 CS、 IP 寄存器不能用作目的操作数。 MOV CS, AX ╳ 一般传送指令不影响标志位。

Page 36: 第四章  指令系统

36

例:判断下列指令正确与否: MOV AL, BL

MOV CX, BX

MOV BX, DL

MOV DX, 34H

MOV DS, 1234H

MOV ES, AX

MOV CS, BX

MOV [SI], CX

MOV [DI], [SI]

MOV 2000H, AX

√√

× 类型不一致

× 类型不一致 √

× 类型不一致 √

× 立即数不能送段寄存器

× 类型不一致 √

× 立即数不能送段寄存器 √

× 类型不一致 √

× 立即数不能送段寄存器 √

× CS 不能作目的操作数

× 类型不一致 √

× 立即数不能送段寄存器 √

× CS 不能作目的操作数 √

× 类型不一致 √

× 立即数不能送段寄存器 √

× CS 不能作目的操作数 √

× 不能同时为存储器操作数

× 类型不一致 √

× 立即数不能送段寄存器 √

× CS 不能作目的操作数 √

× 不能同时为存储器操作数 × 目的不能为立即数

Page 37: 第四章  指令系统

37

( 2 ) 堆栈操作指令堆栈:是按“后进先出”原则工作的一段存储器区域。堆栈寄存器 SS—— 段地址堆栈指针 SP——始终当前栈顶所在的存储单元地址, 即最新入栈数据所在的存储单元的地址。 压栈操作: PUSH OP

功能:把 OP 字数据压入栈中,结果 SP-2SP

原则:高字节压在高地址,低字节压在低地址 执行过程: SP←SP-1 ; [SP] ←OPH

SP←SP-1 ; [SP] ←OPL

Page 38: 第四章  指令系统

38

例: PUSH AX

(1) SP-1 SP ,压 AH

(2) SP-1 SP ,压 AL

SP

SP SP-1

SP

AH

AL SP SP-1

Page 39: 第四章  指令系统

39

出栈操作: POP OP

功能:从栈中弹出数据 OP ,结果 SP+2SP

执行过程: OPL ←[SP] ; SP←SP+1

OPH←[SP] ; SP←SP+1

例: POP DX

(1) 弹出 AL DL, SP+1

SP (2) 弹出 AH DH, SP+1

SP

SP

SP SP+1

SP SP+1

SP

AH

AL

DXDH DL

ALAH

Page 40: 第四章  指令系统

40

例:已知: AX=1122H, BX=3344H, SP=1010H

执行指令: PUSH AX

PUSH BX

POP AX

POP BX

执行后 AX, BX, SP 的结果?

解:执行结果为 AX=3344H

BX=1122H

SP=1010H

Page 41: 第四章  指令系统

41

注意: 堆栈操作总是按字进行的。压入指令, SP-2,数据在栈顶。弹出指令正好相反。 操作数可以是存储器、寄存器或段寄存器操作数

( CS 不能用于 POP ),不能是立即数。 PUSH CS √ POP CS ×

PUSH 1200H × POP 2300H ×

这两条指令主要用来进行现场保护和恢复,以保证子程序调用或中断程序的正常返回。

Page 42: 第四章  指令系统

42

( 3 ) 数据交换指令( 8/16 位) 格式: XCHG OP1, OP2

功能:实现 OP1和 OP2 内容的相互交换。 操作数:通用寄存器或存储器,但不能均为内存 单元。注意: 段寄存器和 IP 不能作为交换指令的操作数。

例: XCHG AX, BX √

XCHG BH, BL √

XCHG AX, 1122H ×

XCHG DS, AX ×

XCHG [SI], BP √

XCHG [SI], [DI] ×

Page 43: 第四章  指令系统

43

46

( 4 ) 换码指令(查表指令、翻译指令) 换码指令是一条完成字节翻译功能的指令。它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。

格式: XLAT

功能: [BX+AL] AL

EA

说明:将 BX和 AL 内容相加作为有效地址 EA ,在一个表格中找出此单元中的内容 AL 中。 BX—— 表格的首地址 AL—— 相对于表格首地址的位移量(要转换的代码)

Page 44: 第四章  指令系统

44

注意: 1. 使用前,先建立被转换代码(字节型)的数据表。2. 换码指令只能使用寄存器 BX、 AL ,不影响标志位。

Page 45: 第四章  指令系统

45

例:数据段中存放有一张 ASCII 码转换表,设首地址为 2000H ,现欲查出表中第 9 个代码的 ASCII码(设 DS=4000H)。

303132...

39

41

42...

45

46...

42000H+0

42000H+9

‘0’‘1’‘2’

‘9’

‘A’

‘B’

‘E’‘F’

可用如下指令实现:MOV BX, 2000H ; BX←

表首地址MOV AL, 09H ; AL← 序

号XALT ; 查表转换 执行后得到: AL=39H

Page 46: 第四章  指令系统

46

2. 目标地址传送指令 此类指令的功能是将操作数所在存储器的地址送入

目标寄存器。 注意: 1. OP 源必须是存储器操作数, OP 目必须是 16 位的通用寄存器 。 2. 地址传送指令不影响状态标志位。

(( 11 )取有效地址)取有效地址 EAEA 指令:指令: 格式:格式: LEA OPLEA OP 目目 , , OPOP 源源 功能: 功能:将源操作数的有效地址将源操作数的有效地址 EAEA送到目的操作数。送到目的操作数。例: 例: LEA AXLEA AX,, [5678H][5678H] ; ; AX ← 5678HAX ← 5678H

LEALEA BXBX,, [BP+SI][BP+SI];; BX ←BP+SIBX ←BP+SI

Page 47: 第四章  指令系统

47

DATA112H34H

1100H 88H

77H

BX=1100H

注意区分下列指令:

LEA SI, DATA1

MOV SI, DATA1

MOV SI, OFFSET DATA1

MOV BX, [BX]

LEA BX, [BX]

符号地址

Page 48: 第四章  指令系统

48

( 2 )指针送寄存器和 DS 指令 格式: LDS OP 目, OP 源 功能:把 OP 源指定的 4个字节内容取出,低地址的两

字节 OP 目,高地址的两字节 DS 。例: LDS DI, [2130H] ; 2130H 和 2131H 单元中

的内容 DI; 2132H 和 2133H 单元中的内容 DS

2130H

2131H

2132H

2133H

DI=1234H

DS=5678H

34H

12H

78H

56H

Page 49: 第四章  指令系统

49

结果: DI = 1234H

AX = 2233H

AX22 33

DI12 34

12H34H

00H60H

1200H 数据段 1

数据段2

33H22H

61234H

例:下列指令执行后 DI ,AX 的值是多少? LDS DI, [1200H]

MOV AX, [DI]

Page 50: 第四章  指令系统

50

(( 33 ))指针送寄存器和指针送寄存器和 ESES 指令指令 格式: LES OP 目, OP 源功能:本指令与 LDS 指令的操作基本相同,所不同的

是将 OP 源 4 个字节中高地址的两字节 ES。例: LES DI, [2130H] ; 2130H 和 2131H 单元中的内容 DI ;

2132H 和 2133H 单元中的内容 ES

2130H

2131H

2132H

2133H

DI=1234H

ES=5678H

34H

12H

78H

56H

Page 51: 第四章  指令系统

51

3. 标志寄存器传送指令(1) 读取标志指令 格式: LAHF ; AH← 标志寄存器低 8 位 特点: 此指令操作结果不影响标志寄存器。(2) 设置标志指令 格式: SAHF ;标志寄存器低 8 位← AH

特点: 此指令直接为标志寄存器的低 8 位赋值。

SF PFAFZF CF

….AH

标志寄存器D15

D7 D0

Page 52: 第四章  指令系统

52

(3) 对标志寄存器的堆栈操作指令 格式: PUSHF ;将标志寄存器的值压栈。

POPF ; 从栈顶弹出一个字送标志寄存器。 特点 : 1.PUSHF 不影响标志寄存器,而 POPF 直接为

标志寄存器赋值。 2. 通常两指令成对出现,用来保护和恢复标志

寄存器的内容。

Page 53: 第四章  指令系统

53

4.2.2 算术运算指令 8086 的算术运算类指令能够对二进制或十进制 (BCD 码 )

数进行加、减、乘、除运算,操作数的数据形式可以是8 位或 16 位的无符号数或带符号数。

1. 加法指令(1) 不带进位的加法指令: 格式: ADD OP 目 , OP 源 ; 功能: OP目← OP 源 + OP 目,根据结果设置标志位 例: ADD AL, 50H ; AL+50HAL ADD DI, SI ; DI+SI DI ADD AX, [DI] ; (DI)、(DI+1) 内容 +AX AX

Page 54: 第四章  指令系统

54

ADD [BX+DI] , AX ; (BX+DI) 和(BX+DI+1)2 个 单 元 的 内 容+AX , 结 果 放 在 BX+DI 和BX+DI+1 所指单元

ADD AX , [BX+2000H] ; BX+2000H 和BX+2001H 所指单元内容和AX 的内容相加,结果在 AX 中注意:两操作数的类型相同,类型明确,不能同为存

储器操作数

Page 55: 第四章  指令系统

55

例:判断下列指令正确与否例:判断下列指令正确与否 ADD AL, BX ×

ADD CL, CH √

ADD AX, [BX] √

ADD [BX], [SI] ×

ADD 1000H, AX ×

ADD [SI], BX √

Page 56: 第四章  指令系统

56

(2) 进位的加法指令: 格式: ADC OP目 , OP源 ;

功能: OP目← OP 源 + OP目 +CF ,置标志位

CF 为前面指令产生的CF

说明:主要用于多字节运算,多字节运算时低位字节产生的进位应加到高位。

例: ADC AX, SI ; AX+SI+CFAX

例 : 两个双字 (32 位 )相加。 123FAB5H+0ABC212AH

MOV DX, 0123H MOV AX, 0FAB5H ADD AX, 212AH ; 先加低字, CF=1 AX=1BDFH ADC DX, 0ABCH ; 高字带进位加 CF=0 DX=0BE0H

0 1 2 3 F A B 5

+ 0 ABC 2 1 2 A

0 BE0 1 B D F

Page 57: 第四章  指令系统

57

MOV AX, FIRST

ADD AX, SECOND

MOV FIRST, AX

MOV AX, FIRST+2

ADC AX, SECOND+2

MOV FIRST+2, AX

例:有两个 4 字节数分别放在自 FIRST和 SECOND

开始的存储区中,低字节在低地址处,编一程序段将两数相加,结果存放于从 FIRST开始的存储区中。

12H34H

00H60H

FIRSTX1

90H00H

SECOND

10H

00H

X2

Y1

Y2

Page 58: 第四章  指令系统

58

( 3 )加 1 指令 格式: INC OP 功能: OP←OP+1 说明:常用于修改偏移地址和计数次数。操作数可以

是 8/16位通用寄存器或存储器操作数,不能为立即数。

例: INC AL ; AL←AL+1 INC BYTE PTR [BX+DI];

[BX+DI]←[BX+DI]+1

例:判断对错 INC CL √INC [DI] × INC BYTE PTR[DI] √INC 2000H ×

Page 59: 第四章  指令系统

59

注意: ① INC 指令不影响 CF 位,影响标志位AF、 OF、 PF、 SF和 ZF 。

② 操作数视为无符号数。

总结:以上三条指令运算结果将影响状态标志位,但 INC 不影响标志 CF。

Page 60: 第四章  指令系统

60

2. 减法指令( 1 )不带借位的减法指令 格式: SUB OP 目, OP 源 功能: OP目← OP目 -OP 源 ,并根据结果设置标志

例: SUB BX, CX ; BX-CXBX

SUB AL, [SI+2] ; AL-(SI+2) 单元中的数 AL

SUB AL, 20 ; AL-20 AL

Page 61: 第四章  指令系统

61

( 2 )带借位的减法指令 格式: SBB OP 目, OP 源 功能: OP目← OP目 -OP 源 -CF ,根据结果设置

标志 说明:主要用于多字节或多精度数据相减的运算

例: SBB AX, 2030H ; AX- 2030H-CF AX

SBB WORD PTR [DI+2], 1000H ;将 DI+2和DI+3 所指两单元的内容 -1

000H-CF , 结果存在DI+2和 DI+3 所指的单元

Page 62: 第四章  指令系统

62

( 3 )减 1 指令 格式: DEC OP

功能: OP←OP-1 ;根据结果置标志位,不影响 CF。

例: DEC AX ; AX-1AX

DEC BL ; BL-1 BL

DEC BYTE PTR [DI+2] ;将 DI+2 所指单元的内容减 1 ,结果送回此单元

Page 63: 第四章  指令系统

63

( 4 )取补指令 格式: NEG OP

功能: 0- OP→ OP, 将操作数取补后送回原操作数

OP 可以是 8/16 位通用寄存器和存储器操作数, 不能为立即数。 例: NEG AL ; 0- AL AL

注意: (1) 对 80H 或 8000H 取补时,操作数没有变化,但

OF=1。(2) 对 CF影响较特殊,只要操作数不是 0 ,总是使

CF=1 。

Page 64: 第四章  指令系统

64

( 5 )比较指令 : 格式: CMP OP 目, OP 源 功能: OP 目 -OP 源,不回送结果,只根据结果置标志位。

例: CMP AX, BX ; AX-BX ,根据结果置标志位 CMP AL, 20H ; AL-20H ,根据结果置标志位说明:本指令主要通过比较(相减)结果置标志位,表示两

个操作数的关系,指令执行的结果不影响目标操作数。

用途:用于比较两个数的大小,可作为条件转移指令转移的条件

Page 65: 第四章  指令系统

65

比较有以下几种情况(以 CMP A, B 示例说明)1. 判断两个操作数是否相等:

根据 ZF判断

2. 判断两个操作数的大小,可分两种情况:( 1 ) 判断两个无符号操作数的大小:

根据 CF判断

ZF=1, A= B JZ

ZF=0, A≠B JNZ

CF=1, A< B JC

CF=0, A≥B JNC

Page 66: 第四章  指令系统

66

( 2 )判断两个带符号操作数的大小 A. 两操作数符号相同

根据 SF判断

B. 两操作数符号不同

根据 SF、 OF判断

SF=1, A< B JS

SF=0, A≥B JNS

SF OF=1⊕ , A <B

SF OF=0⊕ , A≥B

Page 67: 第四章  指令系统

67

例:有两组 50个字节的数据,分别放在自 FIRST和 SECOND开始的存储区中,试比较两组数据是否相同。相同则 0→AL ,否则 0FFH→AL。 MOV SI, OFFSET FIRST MOV DI, OFFSET SECOND MOV CX, 50 P:MOV AL, [SI] CMP AL, [DI] JZ NEXT MOV AL, 0FFH JMP STOP

NEXT: INC SI INC DI DEC CX JNZ P MOV AL, 0 STOP: HLT

Page 68: 第四章  指令系统

68

3. 乘法指令 (1) 无符号数乘法格式: MUL OP

功能: AX←AL×OP 8 位数乘法 (DX、 AX)←AX×OP 16 位数乘法(2) 带符号数乘法格式: IMUL OP

功能: 操作同上,但是操作数为带符号数

Page 69: 第四章  指令系统

69

BX XXHAL ×XXH

AX

例: MUL BYTE PTR[BX]

Page 70: 第四章  指令系统

70

注意:( 1 )进行字节运算时, OP 目必须是 AL ,乘积在AX 中;进行字运算时, OP 目必须是 AX ,乘积在DX、 AX 中。 源操作数不允许使用立即数寻址方式。( 2 )运算结果只影响 CF、 OF ,其他的无定义。( 3)对于 MUL ,若字节型数据相乘之积 AH=0 或字数据相乘之积 DX=0 ,则 CF=OF=0 ,否则CF=OF=1; 对于 IMUL 指令,若字节数据相乘之积 AH 或字数据相乘之积 DX 的内容是低一半的符号扩展,则CF=OF=0 ,否则 CF=OF=1。

Page 71: 第四章  指令系统

71

例:MUL BL ; AL×BLAX 中MUL CX ; AX×CX DX AX

MUL BYTE PTR [DI]; AL ×(DI)AX

IMUL BX ; AX和 BX 中的两个有符号数相乘,结果在 DX和 AX 中

例 : 设在 M1和M2 单元中各有一个 16 位无符号数,求其乘积,将结果存于从 R开始的字单元中。

MOV AX,M1

MUL M2

MOV R, AX

MOV R+2, DX

Page 72: 第四章  指令系统

72

4. 除法指令 指令要求被除数是除数的双倍字长,即当除数是 8/16

位时,要求被除数是 16/32 位的二进制数。( 1 )无符号数除法 格式: DIV OP

功能:

( 2 ) 带符号数除法 格式: IDIV OP

功能:操作同 DIV ,但是操作数为带符号数

字节除法: AX/OP AL =商, AH =余数

字除法: (DX、 AX)/OP AX =商, DX =余数

Page 73: 第四章  指令系统

73

注意: (1) 当除数是字节时,被除数必须放在 AX 中, 当除数是字时,被除数必须放在 DX, AX 中。 (2) 商超出规定的范围时,将产生 0 号中断。 (3) IDIV 运算结果余数的符号与被除数相同。 (4) 带符号数除法运算中,当被除数位数不够时,则需

将被除数扩展到所需的位数。( 8086/8088 设有带符号数扩展指令)

Page 74: 第四章  指令系统

74

例:DIV CL ; AX/CL ,商 AL ,余数 AH

IDIV BYTE PTR[DI] ; AX 中 16位数除以 DI 所指单元中的 8位数,商 AL ,余数 AH

Page 75: 第四章  指令系统

75

(3) 符号扩展指令格式: 字节扩展指令 (8 位 16位 )

格式: CBW

功能:将 AL 中的数的符号位扩展到 AH

规则:若最高位 =1 ,则执行后 AH=FFH

若最高位 =0 ,则 执行后 AH=00H 字扩展指令 (16 位 32位 )

格式: CWD ;

功能:将 AX 中的数的符号位扩展到 DX,

规则:若最高位 =1 ,则执行后 DX=FFFFH

若最高位 =0 ,则执行后 DX=0000H

这两条指令不影响标志位。

Page 76: 第四章  指令系统

76

例:分析指令执行后的结果 MOV AL, 44H

CBW

MOV AX, 0AFDEH

CWD

结果: AX=0044H

结果 DX=FFFFH, AX=0AFDEH

Page 77: 第四章  指令系统

77

例:在内存中,有一个从DATA1开始的存储区。此存储区的前两个字节是一个 16位带符号的被除数,第三、四字节是一个 16位带符号的除数,其后的四个单元依次存放商和余数。 LEA BX, DATA1

MOV AX, [BX]

CWD

IDIV WORD PTR [BX+2]

MOV [BX+4], AX

MOV [BX+6], DX

Page 78: 第四章  指令系统

78

5. 十进制运算调整指令BCD 码:二进制编码的十进制数,又称为二—十进制数。非组合 ( 非压缩 )BCD 码:用一个字节表示一位十进制数。组合 ( 压缩 )BCD 码:用一个字节表示二位十进制数。

0 0 0 0 0 1 0 1

0 0 0 0 0 0 1 1

0 1 0 1 0 0 1 1

例: 53 非组合 BCD 码

组合 BCD 码 5 3

5 3

Page 79: 第四章  指令系统

79

由于 BCD 码是四位二进制编码,四位二进制数共有 16个编码, BCD 码只用其中的 10个,其余没用的编码1010~1111称为无效码。 BCD 码运算结果进入或跳过无效码区时,都会出现错误。为了得到正确结果,必须进行调整。例: 18+27=45 0001 1000 +) 0010 0111 0011 1111 --- 低 4位〉 9 +) 0000 0110 ---加 6 调整 0100 0101

Page 80: 第四章  指令系统

80

(1) 非组合 BCD 码的加法调整指令格式: AAA

功能:对 AL 中的由两个非组合 BCD 码相加的和进行调整,结果(非组合 BCD 码)存于 AX 中。

调整过程:若 AL 的低4位大于 9或 AF=1 ,则AL←AL+6 , AF←1, CF←1, AH←AH+1 ,清除 AL 的高四位;否则清除 AL 的高4位以及AF和 CF 标志;

Page 81: 第四章  指令系统

81

(2) 组合 BCD 码的加法调整指令 格式: DAA

功能:对 AL 中的由两个组合 BCD 码相加的和进行调整,将结果(组合 BCD 码)存于 AL 中。

调整过程: 调整方法与 AAA 类似,只是此指令要分别考虑AL 的高4位和低4位。

若AL低4位大于 9或AF=1 ,则AL+6→AL ,置AF=1;

若AL高4位大于 9或 CF=1 ,则AL+60H→AL ,置CF=1

注意:以上两条指令使用时必须紧跟在 ADD或ADC 之后 。

Page 82: 第四章  指令系统

82

(3) 非组合 BCD 码的减法调整指令 格式: AAS 功能:对 AL 中由两个非组合 BCD 码相减的差进行调整,将

结果(非组合 BCD 码)存于 AL 中。调整过程:调整方法与 AAA 类似,不同的是当 AL 的低4位表

示的数大于 9 或AF=1 时,将 AL-6→AL,AH-1→ AH ,并将 AF和 CF置1,清除AL 的高四位。

(4) 组合 BCD 码的减法调整指令 格式: DAS 功能:对 AL 中由两个组合 BCD 码相减所得的结果进行调整,

并将结果(组合 BCD 码)存于 AL 中。调整过程:调整方法与 DAA 类似,不同的是当 AL 的低 4位 >

9 或者 AF=1 ,则 AL-6→AL ,并置 AF=1 ;而当 AL 的高 4 位大于 9 或者 CF=1 时,则 AL-60H → AL ,并置 CF=1。

注意:使用 AAS、DAS 指令必须紧跟在减法指令之后。

Page 83: 第四章  指令系统

83

(5) 非组合 BCD 码的乘法调整指令格式: AAM功能:对 AX 中的由两个非组合 BCD 码相乘所得的结果

进行调整,并将调整后的结果存于 AX 中。调整过程: AH←AL/0AH (商), AL←AL%0AH(余

数 )注意:本指令必须紧跟在 MUL 指令之后使用 。 (6) 非组合 BCD 码的除法调整指令格式: AAD功能:把 AX 中的两个非组合 BCD 码进行调整,然后可

用DIV 指令实现两个非组合 BCD 码的除法运算 调整过程: AL←10×AH+ AL, AH←0 注意:本指令必须在DIV 运算前使用 。

Page 84: 第四章  指令系统

84

总结: DAA或 DAS必须用在 ADD( ADC )或

SUB( SBB )之后,结果对 OF 无影响,对其他状态标志位均有影响。

AAA或 AAS必须用在 ADD( ADC )或SUB( SBB )之后,结果影响 AF和 CF ,对其他标志位均无意义。

AAM必须用在 MUL 之后,结果影响 SF、 ZF和PF ,对 AF、 CF和 OF 无影响。

AAD必须用在 DIV 之前,结果影响 SF、 ZF和PF ,对 AF、 CF和 OF 无影响。

Page 85: 第四章  指令系统

85

例:设在 AX和 BX 中分别存有用组合 BCD 码表示的十进制数,编写程序段将两个数相加(设相加之后的和仍为 4 位十进制数),结果存于 AX 中。

ADD AL, BL ;低字节相加DAA ;低字节调整MOV CL, AL ;暂存低字节MOV AL, AH

ADC AL, BH ;高字节相加DAA ;高字节调整MOV AH, AL

MOV AL, CL ;存放结果于 AX 中

Page 86: 第四章  指令系统

86

4.2.3 逻辑运算运算指令 OP源 : 8/16 位通用寄存器、存储器操作数或立即数 OP目 : 通用寄存器和存储器操作数。 除“非”运算外,其余指令都会使 OF=CF=0

1. 逻辑与运算指令 格式: AND OP 目, OP 源 功能:对两个操作数按位进行与操作,结果回送 OP

目。 说明:该指令常用于截取(或屏蔽)若干位二进制数例:已知 AL= 46H ,将 AL 的低4位保留,高4位屏蔽。 AND AL, 0FH; AL=06H

Page 87: 第四章  指令系统

87

2. 逻辑或运算指令 格式: OR OP 目, OP 源功能:对两个操作数进行或运算,结果回送到 OP 目。说明:可用于组合某个字,或将某位置 1 。

例: MOV AX, 8888H; OR AX, 00FFH ; AX=88FFH ,将 AX 的低 8

位置 1 ,其他位不变。即对应 1 位置 1 ,对应 0 位则不变。

例:将 AL 中的非组合 BCD 码转换成 ASCⅡ 码。 OR AL, 30H

Page 88: 第四章  指令系统

88

3. 逻辑异或运算指令格式: XOR OP 目, OP 源功能:对两个操作数进行异或运算,结果回送到 OP 目。说明:用于对某个二进制数按位取反或对某寄存器清 0 。例: XOR AL, 0FFH ; AL 数据按位求反例 : MOV AX, 3333H

XOR AX, 00FFH ;

结果: AX=33CCH , AH 数据保持不变,对 AL 数据求反。 即对应 0 不变 , 对应 1求反 。 例:寄存器清 0 (有 4条指令可达到 AX清 0 目的): XOR AL, AL ; AL清 0

MOV AX, 0

SUB AX, AX

AND AX, 0

Page 89: 第四章  指令系统

89

4. 逻辑非运算指令 格式: NOT OP

功能:对操作数逐位取反后回送到原处。 例: MOV AX, 1

NOT AX ; AX=0FFFEH

注意:( 1 )该指令只是执行求反操作,而不是求反码指令,

对符号位也求反。( 2 )不影响标志位。

Page 90: 第四章  指令系统

90

5.  测试指令 格式: TEST OP 目, OP 源 功能:将 OP 目与 OP 源进行与运算,不回送结果,只根

据结果置标志位。 说明:主要用来检测目的操作数的某些位是 1 或 0,根据测

试结果 , 决定转向例:测试 AX 中的 D15 位是 1还是 0

TEST AX, 8000H ;若 D15 为 1, ZF=0 ,否则ZF=1总结:

( 1) AND OR XOR TEST均影响标志, CF=0, OF=0 ,而 PF, SF, ZF 由结果而定, AF 无意义。此类指令可用来清 CF ,常用于拆字,拼字。

( 2) NOT 不影响标志。

Page 91: 第四章  指令系统

91

4.2.4 移位指令移位指令

移位操作一般移位

循环移位

逻辑移位算术移位

不带进位位的移位带进位位的移位

规定:移动一位时由指令中的计数值直接给出;移动两位及以上,则移位次数由 CL 指定,即必须将移位位数 N事先装入 CL 中。

Page 92: 第四章  指令系统

92

⒈ 一般移位指令

算术左移与逻辑左移相同,可用于无符号数乘 2 操作;逻辑右移可用于无符号数除 2 操作;算术右移可以用于有符号数除 2 操作。

Page 93: 第四章  指令系统

93

2. 循环移位指令

Page 94: 第四章  指令系统

94

例:将一组 BCD 码转换成 ASCII 码。设某缓冲区从 BUF 单元开始连续存放着 8 个组合 BCD 码,要求将它们转换成ASCII 码,存放在以 RES 单元开始的缓冲区。高位 BCD 码转换成的 ASCII 码 ,放在地址较高的单元。

解: MOV SI, OFFSET BUF SHR BH, CL MOV DI, OFFSET RES OR BH, 30H MOV BL, 8 MOV [DI], BH TRA:MOV AL, [SI] INC SI MOV BH, AL INC DI AND AL, 0FH DEC BL OR AL, 30H JNZ TRA MOV [DI], AL HLT INC DI MOV CL, 4

Page 95: 第四章  指令系统

95

4 5

3 4 3 5

45H AND 0FH 05HOR 30H 35H

右移 4 位45H 04H OR 30H 34H

45H

34H56H78H

BUF

RES 35H34H

Page 96: 第四章  指令系统

96

4.2.5 字符串操作指令 串操作指令实现对一串字符或数据的操作,分为基本串操作指令和重复前缀指令。基本串操作指令每执行一次只能处理一个数据,与重复前缀指令结合可以处理一串数据。

Page 97: 第四章  指令系统

97

串操作有如下共同点:

(1) 源串一般存放在数据段 (DS) ,偏移地址由 SI 指定, 目标串在附加段 (ES) ,偏移地址由 DI 指定。

(2) 每执行一次串操作后自动修改指针 SI、 DI 。若方向标志 DF=0 ,则每次操作后 SI和 DI 自动加 1( 或加 2) ;若 DF=1 ,则每次操作后 SI和 DI 自动减 1( 或减 2)修改。

(3) 串长 ( 字或字节个数 ) 存放在 CX 中。

注意:在执行指令前必须DS、 ES、 SI、 DI、 DF、 CX置好需要的值,它们是串操作指令的隐含操作数。

Page 98: 第四章  指令系统

98

1. 字符串操作指令( 1 ) 字符串传送指令 格式: MOVS OP 目, OP 源 MOVSB—— 字节传送 MOVSW—— 字传送 功能:把位于数据段由 SI 指定的内存单元的字节 / 字

数据传送到附加段由 DI 指定的内存单元,指令不影响状态标志位。

过程: [DI]←[SI] 若 DF=0

SI←SI+1/2, DI←DI+1/2

[DI]←[SI] 若 DF=1 SI←SI - 1/2, DI←DI-1/2说明:串传送指令常与无条件重复前缀连用

Page 99: 第四章  指令系统

99

( 2 )字符串比较指令 格式: CMPS OP 目, OP 源 CMPSB —— 字节比较

CMPSW —— 字比较 功能:把位于数据段由 SI 指定的字节 / 字数据与附

加段由 DI 指定的字节 / 字数据进行比较,结果不保存,但影响状态标志位,并由 DF状态决定 SI、 DI 的修改方向。

过程: [SI] -[DI] SI←SI±1/2, DI←DI±1/2

说明:串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。

Page 100: 第四章  指令系统

100

( 3 )字符串搜索指令 格式: SCAS OP

SCASB

SCASW

功能 : 把 AL/AX 中的内容与附加段由 DI 指定的一个字节 / 字数据进行比较,结果不保存,但影响状态标志位,并由 DF状态决定 DI 的修改方向。

过程:字节—— AL-[DI], DI←DI±1

字—— AX-[DI], DI←DI±2

Page 101: 第四章  指令系统

101

条件重复

若 CX≠0 且 ZF=1 ,则CX←CX-1继续重复操作,直到CX=0 或 ZF=0 为止

2. 相等 / 为 0 重复 REPE / REPZ

若 CX≠0 ,则 CX←CX-1继续重复操作,直到 CX=0 为止

1. 无条件重复 REP

3. 不相等 / 不为 0 重复 REPNE/ REPNZ 若 CX≠0且 ZF=0 ,则

CX←CX-1继续重复操作,直到CX=0 或 ZF=1 为止

2. 重复前缀指令 基本串操作指令每执行一次只能处理一个数据,与重复前缀指令结合可以处理一串数据。

Page 102: 第四章  指令系统

102

注意: 重复前缀指令不能单独使用,其后必须紧跟基本

串操作指令,控制基本串操作指令重复执行。其执行过程相当于一个循环程序的运行。在每次重复之后,地址指针 SI和 DI都被修改,但指令指针 IP仍保持指向带有前缀的串操作指令的地址。

重复执行次数由数据串长度决定,数据串长度应预置在寄存器 CX 中。

执行重复前缀指令不影响标志位。

Page 103: 第四章  指令系统

103

例 1 :将从 DATA1开始的 100 个字节的数据传送到从DATA2开始的存储区中。⑴ 用一般传送指令实现:

MOV SI, OFFSET DATA1

MOV DI, OFFSET DATA2MOV CX, 64H

PL1:MOV AL, [SI]MOV [DI], AL

INC SI

INC DI

DEC CXJNZ PL1

DONE: HLT

Page 104: 第四章  指令系统

104

(2) 用串传送指令实现: MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 MOV CX, 64H CLD ; DF=0 PL1:MOVSB

DEC CX JNZ PL1

DONE:HLT (3)用重复传送指令 MOV SI, OFFSET DATA1

MOV DI, OFFSET DATA2 MOV CX, 64H

CLD REP MOVSB

HLT

Page 105: 第四章  指令系统

105

例 2 :比较存储器中的两串数是否相同,如完全相同则AL=0 ,否则 AL=0FFH。

MOV SI, OFFSET DATA1

MOV DI, OFFSET DATA2

CLD

MOV CX, 50

REPZ CMPSB

JZ EQQ

MOV AL, 0FFH

JMP STOP

EQQ:MOV AL, 0

STOP: HLT

Page 106: 第四章  指令系统

106

例 3 :在某字串中查找是否存在字符“ $” 。 MOV DI,OFFSET DATA1

MOV AL,‘ $’

MOV CX, 64H

CLD

REPNZ SCASB

JZ FOUND

MOV BX, 0

JMP STOP

FOUND: DEC DI

MOV BX, DI

STOP:HLT

Page 107: 第四章  指令系统

107

1. 寻址方式 控制转移指令在段内、段间转移时,使用直接(相对)寻址或间接寻址方式。

4.2.5 转移指令

( 1 ) 直接寻址方式段内直接寻址方式——目标程序和源程序在同一个程序

段内,只给出源地址和目标地址的差值,此差值是偏移量,它是一个以 IP 为基准的 8 位或 16 位的带符号补码数。

段间直接寻址方式——直接给出转移目标地址的段地址和段内位移量,用前者取代 CS 当前的值,用后者取代 IP 中当前的值,使程序从一个代码段转移到另一个代码段。

Page 108: 第四章  指令系统

108

( 2 ) 间接寻址方式 段内间接寻址方式——指令转移的有效地址存在一

个寄存器或存储器单元中,用它取代当前IP 的值,实现程序转移。

段间间接寻址方式——指令给出一个存储器地址,从该地址开始的 4 个字节单元中存放转移目标地址的段内偏移量和段地址,这两个地址在指令执行时用于取代当前的 IP和CS 的内容,使程序从一个代码段转移到另一个代码段。

Page 109: 第四章  指令系统

109

无条件转移指令 无条件转移到目标地址,执行新的指令

有条件转移指令 在具备一定条件的情况下转移到目标地址

2. 转移指令

通过修改指令的偏移地址或段地址及偏移地址实现程序的转移

Page 110: 第四章  指令系统

110

一、无条件转移指令 JMP 指令 格式: JMP OP

功能:无条件地将控制转移到目标地址去。

目标地址

与 JMP 在同一代码段(段内转移)

与 JMP 不在同一代码段(段间转移)

JMP OP

Page 111: 第四章  指令系统

111

① 调用指令 格式: CALL OP

功能 : 将 CALL 指 令 的 下 一条指 令 的 地 址 (断点 地址) IP或 IP与 CS )压栈,新的目标地址(子程序首地址)装入 IP或 IP与 CS 中,控制程序转移到由 OP 指明入口的子程序。其中 OP 为子程序(过程)的名字。

操作过程: ( 1) SP-2 → SP, 当前 CS压栈, OP 所在段地址 → CS

( 2) SP-2 → SP, 当前 IP压栈, OP 的偏移地址 → IP

对于段内调用只有( 2 )。

二 、调用 和返回指 令 (CALL 和 RET 指令 )

Page 112: 第四章  指令系统

112

段内调用

段间调用

段内直接调用

段内间接调用

段间直接调用

段间间接调用

CALL 指令

例: CALL ABC

CALL FAR CDE

断点

入口地址

Page 113: 第四章  指令系统

113

② 返回指令格式: RET

功能:通常作为一个子程序的最后一条指令,用以返回到 调用子程序的断点处,即从堆栈弹出断点送 IP和CS。

操作过程: ( 1 )从栈顶弹出一个字给 IP, SP+2→SP

( 2 )从栈顶弹出一个字给 CS, SP+2→SP

对于段内调用只有 (1) 。

Page 114: 第四章  指令系统

114

三、条件转移指令条件转移指令将前一条指令执行结果对状态标志位

的影响,作为程序转移的条件。满足条件时转移到指令指定的地址,否则将顺序执行下条指令。可作为判断条件的状态标志位有 CF、 PF、 ZF、 SF和OF。

条件转移指令只能在当前段中实现短转移,不影响状态标志。

Page 115: 第四章  指令系统

115

①对无符号数 高于 / 不低于也不等于转移 JA/JNBE 目标标号 CF AND

ZF=O

高于或等于 / 不低于转移 JAE/JNB 目标标号 CF=0

低于 / 不高于也不等于转移 JB/JNAE 目标标号 CF=1

低于或等于 / 不高于转移 JBE/JNA 目标标号 CF OR

ZF=1

Page 116: 第四章  指令系统

116

②对有符号数

大于 / 不小于也不等于转移 JG/JNLE 目标标号

( SF XOR OF) AND ZF=0

大于或等于 / 不小于转移 JGE/JNL 目标标号

SF XOR OF=0

小于 / 不大于也不等于转移 JL/JNGE 目标标号

SF XOR OF=1

小于或等于 / 不大于转移 JLE/JNG 目标标号

( SF XOR OF) =1OR ZF=1

Page 117: 第四章  指令系统

117

③对标志位 进位为 1转移 JC 目标标号 CF=1

进位为 0转移 JNC 目标标号 CF=0

等于 / 结果为 0转移 JZ/JE 目标标号 ZF=1

不等于 / 结果不为 0转移 JNZ/JNE 目标标号 ZF=0

溢出转移 JO 目标标号 OF=1

不溢出转移 JNO 目标标号 OF=0

奇偶位为 0/奇偶性为奇转移 JNP/JPO 目标标号 PF=0

奇偶位位 1/奇偶性为偶转移 JP/JPE 目标标号 PF=1

符号标志位为 0转移 JNS 目标标号 SF=0

符号标志位为 1转移 JS 目标标号 SF=1

Page 118: 第四章  指令系统

118

MOV BX, OFFSET DATA1 ; BX 指向数据首址 MOV AL, [BX] ;取一个数

MOV CX, 63H ; CX 作计数器 P1 : INC BX ; BX 指向下一个数

CMP AL, [BX] ;两数比较 JAE NEXT ; AL 中的数大,转 NEXT

MOV AL, [BX] ;否则,将 [BX] 中大数→ AL

NEXT: DEC CX ;计数器减 1

JNZ P1 ;没找完,转 P1

MOV MAX, AL ;找完送结果 HLT

例:在 DATA1开始的存储区中存放了 100 个 8 位无符号数,找出其中最大的数存入 MAX 单元。

Page 119: 第四章  指令系统

119

四 .循环控制指令使用循环控制指令之前,必须在 CX (计数器)中预置循环次数的初值。

不影响状态标志位。主要用于数据块比较、查找关键字等操作。

⑴ 计数循环 格式: LOOP 目标标号 功能: CX-1→CX ,若 CX≠0 ,循环转移到目标

标号,直到 CX=0退出循环。

Page 120: 第四章  指令系统

120

⑶ 结果不为 0/ 不相等循环 格式: LOOPNZ/LOOPNE 目标标号 功能: CX-1→CX ,若 CX≠0且 ZF=0 时,循环转移

到目标标号,直到 CX=0或 ZF=1 时退出循环

⑵ 结果为 0/ 相等循环 格式: LOOPZ/LOOPE 目标标号 功能: CX-1→CX ,若 CX≠0且 ZF=1 时,循环转移到目标标号,直到 CX=0或 ZF=0退出循环。

(4) 计数为 0转移 格式: JCXZ 目标标号 功能:若 CX=0 时,则转向目标标号,否则顺序执行。

Page 121: 第四章  指令系统

121

4.2.7 处理器控制指令⒈ 标志操作指令 格式: CLC ;置 CF= 0

STC ;置 CF= 1

CMC ;置 CF= CF

CLD ;置 DF=0

STD ;置 DF=1

CLI ;置 IF=0

STI ;置 IF=1

标志操作指令完成对标志位的置位、复位等操作,这些指令只影响与其相关的标志位。

Page 122: 第四章  指令系统

122

     ⒉ CPU控制指令 ⑴ 处理器暂停指令 格式: HLT

功能:使处理器处于暂时停机状态。 说明 : HLT 引起的暂停, 只 有 RESET (复

位)、 NMI (非屏蔽中断请求)、 INTR (可屏蔽中断请求)信号可以使 CPU退出暂停状态。

⑵ 处理器等待指令 格式: WAIT

功能:执行 WAIT 指令后,处理器处于等待状态,直到检测到 TEST引脚有效,才退出等待状态,执行后续指令。

说明:用于处理器与外设同步。

Page 123: 第四章  指令系统

123

4.2.8 输入输出指令 CPU 对外设端口有两种寻址方式,即直接寻址和间接寻址。直接寻址范围为 00H—0FFH 个端口;间接寻址范围为 0000H—

0FFFFH共 64K 个端口。间接寻址时,只能用 DX 作间址寄存器。1. 输入指令 格式 : : IN 累加器,端口 功能: 把一个字节 / 字由输入端口传送到 AL/AX 中 .

2. 输出指令 格式: OUT 端口,累加器 功能:把 AX 中的 16 位数或 AL 中的 8 位数输出到指定端口。

Page 124: 第四章  指令系统

124

4.2.9 中断指令 1. 溢出中断指令 格式: INTO

功能:检测 OF 标志位。当 OF=1 时,产生一个中断类型 4 的中断 ;当 OF=0 时,本指令不起作用。

注意:影响标志位 IF、 TF。 2. 软中断指令 格式: INT n( n 为中断类型号) 功能:产生一个软件中断,把控制转向一个类型号为

n 的软中断。 注意:影响标志位 IF、 TF。 

Page 125: 第四章  指令系统

125

3. 中断返回指令 格式: IRET

功能:让 CPU 执行完中断服务程序后,正确返回原程序的断点处。

注意:影响所有标志位。

Page 126: 第四章  指令系统

126

至此,我们介绍了 8086/8088 的指令系统,通过学习应掌握每一类(条)指令的助记符、寻址方式和操作,以及指令对标志位的影响,这样才能进一步加深理解 8086/8088 的指令系统和内部结构,为汇编语言程序设计奠定基础。