第三章 8086 的寻址方式和指令系统

71
第第第 8086 第第第第第第第第第第第第第 第第第 第第第第第第第 一、 第第第第第 第第第第 第第第第第第第 第第第 第第 第第 第第第第第第第 第第第 第第第 一、 第第第第第第 第第第第第第第第第 第第第第第 第第第第第第 第第第第第第第 第第3-3(1 4 8 10) 3-6( 第 ) 3-9, 3-10 1 4 ), 3-12 3-14( 第 ) 第第第第第第第第第

Upload: jeremy-castro

Post on 02-Jan-2016

179 views

Category:

Documents


8 download

DESCRIPTION

第三章 8086 的寻址方式和指令系统. 第一节 寻址方式. 二、寄存器寻址. 一、立即寻址. 三、直接寻址. 四、寄存器间接寻址. 六、基址加变址寻址. 五、 寄存器 相对 寻址. 七、相对基址加变址寻址. 第二节 指令系统. 二、算术运算指令. 一、数据传送指令. 四、串操作指令. 三、逻辑运算和移位指令. 六、处理器控制指令. 五、控制转移指令. 习题: 3-3(1 , 4 , 8 , 10) , 3-6( 单 ) , 3-9, 3-10 ( 1 , 4 ), 3-12 , 3-14( 单 ). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三章   8086 的寻址方式和指令系统

第三章 8086 的寻址方式和指令系统第一节 寻址方式

第二节 指令系统

一、立即寻址 二、寄存器寻址三、直接寻址 四、寄存器间接寻址五、寄存器相对寻址 六、基址加变址寻址

一、数据传送指令 二、算术运算指令

三、逻辑运算和移位指令 四、串操作指令

五、控制转移指令 六、处理器控制指令

习题: 3-3(1 , 4 , 8 , 10) , 3-6( 单 ) , 3-9, 3-10 ( 1 ,4 ), 3-12 , 3-14( 单 )

七、相对基址加变址寻址

Page 2: 第三章   8086 的寻址方式和指令系统

计算机的指令一般由操作码和操作数组成,操作码指出了指令的功能;而操作数则给出了指令操作的对象。操作数可以以立即数的形式存放在指令中,但在大多数情况下,操作数是以地址的形式存放在指令(指示操作数在哪儿)。用于说明操作数所在地址的方法称为寻址方式。

3 - 1 8086 的寻址方式

在微机中,操作数存放在: 1 、在指令中; 2 、在 CPU 的某一内部寄存器中; 3 、在内存的数据区中; 4 、 I/O 端口。

在 8086CPU 中,内存地址是由数据段地址和段内偏移地址组成。而指令中给出的地址即为段内偏移地址——有效地址 EA ,有效地址 EA 构成的方法不同,则为不同的寻址方式。

第三章 8086 的寻址方式和指令系统

Page 3: 第三章   8086 的寻址方式和指令系统

操作数( 8 位或 16 的常数)直接包含在指令中,紧跟在操作码后面,与操作码一起放在代码段区域中。操作数 im既可是 8 位的,也可是 16 位的。

例: MOV AX , im

MOV AL , 26H

二、寄存器寻址( Register Addressing)

例: MOV DS , AX

AXDS

一、立即寻址方式( Immediate Addressing)

操作码imL

imH

码段

M

AX

AH ALimH imL

操作数存放在指令给出的寄存器中

Page 4: 第三章   8086 的寻址方式和指令系统

操作数的有效地址 EA 是指令的一部分,它与操作码一起放在代码段区域中。 操作数的物理地址为数据段寄存器 DS 加上 16 位地址偏移量。

例:若( DS ) =3000H MOV AX , [2000H]

指令中存储单元的地址也可用符号地址表示。例: AREA1 DW 0867H

MOV AX , AREA1

注意区分: AREA1 EQU 0867H MOV AX , AREA1

50

2000

操作码

30

30000

3200032001

码段

数据段

AH AL

30 50

三、直接寻址方式 (Direct Addressing)

Page 5: 第三章   8086 的寻址方式和指令系统

操作数在存储单元中。操作数的有效地址 EA 在指令所指定的寄存器中。可作为间址的寄存器有 SI 、 DI 、 BX 和 BP若:1 、指令中指定的寄存器为 BX 、 SI 或 DI ,则默认操作数存放在数据段中,段地址由 DS 提供2 、以寄存器 BP 间接寻址,则默认操作数存放在堆栈段中,段地址由 SS 提供

例:若( DS ) =2000H ,( SI ) =1000H

MOV AX , [SI]

A0

操作码

50

20000

2100021001

AX

码段

数据段

AH AL50 A0

四、寄存器间接寻址方式 (Register Indirect Addressing)

Page 6: 第三章   8086 的寻址方式和指令系统

操作数在存储单元中。操作数的有效地址是以指令指定的寄存器内容加上指令中给定的 8 位或 16 位位移量。

操作码

50

3000

操作码

30

30000

3500035001

AX

码段

数据段

例:若( DS ) =3000H ,( SI ) =2000H , COUNT=3000H MOV AX , COUNT [SI]或 MOV AX , [COUNT + SI]

若指令指定的寄存器是 BX 、 SI 或 DI ,段寄存器使用 DS ; 若指令指定的寄存器是 BP , 则段寄存器使用 SS 。

30 50

五、寄存器相对寻址方式 (Register Relative Addressing)

物理地址= 16×DS + SI + COUNT

= 30000H+2000H+3000H

=35000H

Page 7: 第三章   8086 的寻址方式和指令系统

操作数在存储单元中。操作数的有效地址是一个基址寄存器( BX 或 BP )和一个变址寄存器( SI 或 DI )的内容之和,两个寄存器均由指令指定。一般由基址寄存器决定所使用的段寄存器。

六、基址变址寻址方式 (Based Indexed Addressing)

若指令指定的寄存器是 BX ,段寄存器使用 DS ;

若指令指定的寄存器是 BP , 则段寄存器使用 SS 。

物理地址= 16×DS + BX+SI

或 = 16×DS + BX+DI

物理地址= 16×SS + BP+SI

或 = 16×SS + BP+DI例: MOV AX , [BX][SI]

若 DS=3000H , SI=2000H , BX=3000H ,( 35000H)=0ABCDH则:物理地址= 16×DS + BX+SI=35000H AX=0ABCDH

Page 8: 第三章   8086 的寻址方式和指令系统

操作数在存储单元中。操作数的有效地址是基址寄存器( BX 或 BP )内容加上变址寄存器( SI 或 DI )的内容、再加上指令中指定的 8 位或 16 位位移量。一般由基址寄存器决定所使用的段寄存器。

例: MOV AX , COUNT [BX] [SI]

七、相对基址变址寻址方式 (Relative Based Indexed Addressing)

若指令指定的寄存器是 BX ,段寄存器使用 DS ;

物理地址= 16×DS + BX+SI + 8 位或 16 位位移量

或 = 16×DS + BX+DI + 8 位或 16 位位移量若指令指定的寄存器是 BP , 则段寄存器使用 SS

物理地址= 16×SS + BP+SI + 8 位或 16 位位移量

或 = 16×SS + BP+DI + 8 位或 16 位位移量

若 DS=3000H , SI=0300H , BX=1500H , COUNT = 0200H ,( 31A00H)=26BFH则:物理地址= 16×DS + BX+SI + COUNT = 31A00H AX=26BFH

Page 9: 第三章   8086 的寻址方式和指令系统

* 立即数可以出现在方括号内,表示直接地址;

1 、指令中使用方括号的地址表达式必须遵循下列规则:

* 只有 BX 、 BP 、 SI 和 DI 可以出现在方括号内,它们可以单独出现,也可以相加后出现,或以寄存器和常数相加的形式出现,但 BX 和 BP 不能同时出现在同一个 [ ] 内, SI 和 DI 也不能同时出现;* 方括号有相加的含义,下面几种写法都是等价的: 1200[BX][SI] [BX+1200][SI] [BX+ SI +1200]

* 方括号内包含 BP ,则隐含使用 SS 提供基地址;其余情况均隐含使用 DS 提供基地址。

需说明的几个问题

Page 10: 第三章   8086 的寻址方式和指令系统

2 、段超越: 在 8086 系统中,数据通常在数据段中,但若需要,数据也可存放在代码段,堆栈段以及附加段中,这种情况就是段超越。应用时,需在指令中加以说明。

存储器操作的类型 约定段 允许超越段 偏移地址

取指令 CS 无 IP

堆栈操作 SS 无 SP

通用数据读写 DS CS、ES、SS EA

源数据串 DS CS、ES、SS SI

目的数据串 ES 无 DI

用 BP作为基寄存器 SS CS、DS、ES EA

例: MOV AX , ES : [0500H]

ES 表示数据在附加段中; : 是修改属性运算符。

Page 11: 第三章   8086 的寻址方式和指令系统

3 、其它寻址方式

( 1 )隐含寻址:指令中不指明操作数

( 2 ) I/O 端口寻址: 8086 有直接端口寻址和间接端口寻址两种方式,端口寻址范围分别为 0~FFH 和 0~FFFFH 。

在直接端口寻址中,端口地址由指令直接提供,是一个 8 位立即数;

在间接端口寻址中,被寻址的端口号由寄存器 DX 提供。

( 3 )转移类指令寻址

( 4 )一条指令有几种寻址方式

Page 12: 第三章   8086 的寻址方式和指令系统

3-2 8086 的指令系统

按照功能, 8086 的指令可以分为六大类:

一、数据传送指令(一)通用传送指令

功能:将源操作数的一个字节( B )或一个字( W )传送到目的操作数。

说明: * 指令中至少要有一项明确指出传送的是字节还是字; * 可用不同的寻址方式; * 不影响标志位; * 源操作数不变; * 存储器之间,立即数至段寄存器,两个段寄存器之间不能用一条指令完成数据传送。

数据传送算术运算逻辑运算和移位串操作控制转移处理器控制

1 、 MOV 目的,源

立即数

存储器

段寄存器 CS 、DS 、 ES 、 SS

通用指针变址寄存器

MOV 指令允许传送数据的途径如下图所示

Page 13: 第三章   8086 的寻址方式和指令系统

2 、堆栈操作指令

进栈指令 PUSH 源功能:将一个字的源操作数压入 SP 所指向的堆栈的顶部 .

堆栈是以“ 先进后出”的方式工作的一个存储区,

例: PUSH AX 指令执行过程: 指令执行后AX=2A8CH

SP →

2000: 0130H

2000: 012EH8CH

指令执行前AX=2A8CH

SP → 2000: 0130H

2000: 0000H

2000: 0000H

2AHSP →

操作: PUSH 操作时,先修改 SP 的值,使 SP 2 SP 后,把源操作数(字)压入堆栈中 SP 指示的堆栈单元。源操作数可以是 16位的通用寄存器,段寄存器,存储器中的字,但不能是立即数。

Page 14: 第三章   8086 的寻址方式和指令系统

出栈指令 POP 目的功能:把当前 SP 所指向的堆栈顶部的一个字送到指定的目的

操作数中。( CS 不能作为目的操作数)操作:每执行一次出栈操作, SP +2 → SP ,指向新的栈顶。

例:设 SS=2000H , SP = 0130H ,( 20130H ) = 396EH , BX=4FAEH ,执行指令 POP BX 的过程如下图所示:

执行指令前BX=4FAEH

2000: 0000H 2000: 0000H

2000: 0130H 2000: 0130HSP →

2000: 0132HSP →

执行指令后BX=

6EH39H

72H72H39H6EH

6EH39

SP →

2000: 0131H

Page 15: 第三章   8086 的寻址方式和指令系统

3 、交换指令指令格式: XCHG 目的,源 功能:把一个字或一个字节的源操作数与目的操作数交换。

交换可在寄存器之间、寄存器与存储器之间进行。

但段寄存器不能作为操作数,也不能直接交换两个存储单元中的内容。

例:设 AX=31B0H , DS=3000H, BX=1800H, ( 31800H ) = 1995H ,执行指令 XCHG AX, [BX] 的过程为:

执行指令前

AX 31B0H

31800H

31801H

31800H

31801H

执行指令后

AX

95H

19H 31H

B0H

1995H

Page 16: 第三章   8086 的寻址方式和指令系统

4 、表转换指令 XLAT

指令格式: XLAT 转换表

功能:将一个字节从一种代

码转换成另一种代码

该指令执行前,先把转换表首地址的偏移量送入 BX 中,而把要查找表内单元的偏移量( 0~255 )送入 AL 中。执行表转换指令后,把该单元的内容送入 AL 中。

例:若十进制数字 0~9 的 LED 七段显示码对照表已存放在内存中,表格的首地址为 TABLE ,用 XLAT 指令求数字 5 的七段显示码值程序如下:

TABLE DB 40H, 79H, 24H, 30H, 19H DB 12H, 02H, 78H, 00H, 18H

; 建立七段显示码表格

5

表格首地址 12H

MOV AL , 5 ; AL

MOV BX , OFFSET TABLE ; BX

XLAT ; AL

Page 17: 第三章   8086 的寻址方式和指令系统

(二)输入输出指令 1 、输入指令 IN

功能:从 8 位端口读入一个字节到 AL ,或从 16 位端口读入一个字到 AX 。

指令格式: IN AL , n 或 IN AX , n ; n 为 255 的端口地址

IN AL , DX 或 IN AX , DX ;端口地址放在 DX 中。第一种格式,端口地址 n ( 00~FFH )直接包含在 IN 指令里,共允许寻址 256 个端口。当端口地址号大于 FFH 时,必须用第二种寻址方式,即先将端口号送入 DX 寄存器,再执行输入操作。

例:用 IN 指令从输入端口读取数据(1) IN AL , 0E3H

E3H 端口 9DH

AL

执行指令前

22H执行指令后

E3H 端口 9DH

AL 9DH

(2) IN AX , 80H

执行指令前

80H 端口81H 端口

5BH

17H

AX 3355H

执行指令后

80H 端口81H 端口

5BH

17H

AX 17 5BH

Page 18: 第三章   8086 的寻址方式和指令系统

2 、输出指令 OUT

指令格式: OUT n , AL 或 OUT n , AX OUT DX , AL 或 OUT DX , AX

功能:将 AL 中的一个字节写到一个 8 位端口,或把 AX 中的一个字写到一个 16 位端口。

例:用 OUT 指令对输出端口进行操作1) OUT 84H , AX

执行指令前

84H

85H

66H

77H

端口

AX 3F46H

执行指令后

84H

85H

端口

AX 3F46H

2) MOV DX , 300H OUT DX , AL 执行指令前

AL 9AH

端口300H 22H

执行指令后

AL 9AH

端口300H 9AH

46H

3FH

Page 19: 第三章   8086 的寻址方式和指令系统

(三)地址目标传送指令这是一类专用于传送地址码的指令,可用来传送操作数的段地址和偏移地址,共包含以下三条指令:

1 、 LEA取有效地址指令指令格式: LEA 目的 , 源

功能:把源操作数的地址偏移量,传送至目的操作数。要求源操作数必须是存储单元;目的操作数必须是一个除段寄存器以外的 16 位寄存器。

指令 LEA BX , TABLE与指令 MOV BX , OFFSET TABLE 是等价的

例: SI = 1000H , DS = 5000H ,( 51000H )= 1234H

执行指令 LEA BX , [SI] 后, BX = 1000H

执行指令 MOV BX , [SI] 后, BX = 1234H

Page 20: 第三章   8086 的寻址方式和指令系统

2 、 LDS 将双字指针送指令指定的寄存器和 DS 指令指令格式: LDS 目的,源

功能:从源操作数指定的存储单元中取出双字指针送到指令指定的寄存器(常指定 SI )及 DS 寄存器中。

例:设 DS=1200H ,( 13450H ) =3F46H ,( 13452H ) =0A92H 执行指令 LDS SI , [ 1450H ] 后:

SI = 3F46H, DS = 0A92H

Page 21: 第三章   8086 的寻址方式和指令系统

3 、 LES 将双字指针送到寄存器和 ES 指令指令格式: LES 目的,源

功能:从源操作数指定的存储单元中取出双字指针送到指令指定的寄存器(常指定 DI )及 ES 寄存器中。

例:设 DS=0100H, BX=0020H, (01020H) =0300H, (01022H)= 0500H, ES= 3000H.

DI = 0300H, ES = 0500H

执行指令 LES DI , [ BX ] 后

Page 22: 第三章   8086 的寻址方式和指令系统

(四)标志传送指令

1 、 LAHF 标志送到 AH 指令 指令格式: LAHF

功能:把标志寄存器中的 SF 、 ZF 、 AF 、 PF 和 CF 分别送到 AH 寄存器的位 7 、 6 、 4 、 2 和 0 ,位 5 、 3 、 1的内容未定义。

O D I T S Z A P C

15 12 11 10 9 8 7 6 5 4 3 2 1 0

AH

FLAG

操作示意图

2 、 SAHF AH 送标志寄存器指令指令格式: SAHF

功能:把寄存器 AH 中的 7 、 6 、 4 、 2 、 0 位传送到标志寄存器的 SF 、 ZF 、 AF 、 PF 和 CF 位,高位标志 OF 、DF 、 IF 和 TF 不受影响。

Page 23: 第三章   8086 的寻址方式和指令系统

3 、 PUSHF 标志入栈指令指令格式: PUSHF

功能:修改堆栈指针,使 SP 2 → SP ,把整个标志寄存器的内容压入堆栈,指令执行后对标志位无影响。

4 、 POPF 标志出栈指令指令格式: POPF

功能:把当前堆栈指针 SP 所指的一个字,传送给标志寄存器,并修改堆栈指针,使 SP + 2 → SP 。

在过程(子程序)调用和中断服务程序中,可用 PUSHF 和 POPF指令来保护和恢复标志位。另外,这两条指令也可用来改变追踪标志 TF (入栈,修改,出栈)( 8086无直接改变 TF标志的指令)。

Page 24: 第三章   8086 的寻址方式和指令系统

8086 指令系统提供了加、减、乘、除四种基本运算指令,可处理无符号或带符号的 8 位或 16 位二进制数的算术运算(带符号数是用补码表示)。还提供了各种调整操作指令,故可进行压缩的或非压缩的十进制数的算术运算。绝大部分算术运算指令都影响状态标志位。

(一)加法指令1 、 ADD 目的,源

功能:将源和目的操作数相加,结果送到目的操作数中,即 目的← 源+目的

2 、 ADC 目的,源 功能:目的← 源+目的 +CF

这两条指令的源操作数可以是寄存器、存储器或立即数, 目的操作数只能用寄存器和存储单元。注意,源操作数和目的操作数不能同时为存储器,而且它们的类型必须一致,即都是字节或字。 它们影响的标志位为: CF 、 OF 、 PF 、 SF 、 ZF 和 AF 。

二、算术运算指令

Page 25: 第三章   8086 的寻址方式和指令系统

执行指令 ADD AX , CX ; AX=5389H , CF=1 ADC DX , BX ; DX=1128H , CF=0

例:设, AX= 7365H , BX=1025H ,

CX=0E024H DX=0102H

结果: AX=5389H , DX=1128H , BX=1025H , CX=0E024H 标志位 SF =0, ZF =0, CF =0, OF =0, AF =0 , PF=1

3 、 INC 目的 增量指令(单操作数)功能:对目的操作数加 1 ,结果送回目的操作数。即目的← 目的 +

1 。目的操作数可以在通用寄存器或内存中。指令执行后影响 AF 、 OF 、 PF 、 SF 和 ZF ,但不影响 CF 。

例: INC BL

INC CX

例:对内存单元的内容加 1 必须说明该单元的类型 INC BYTE PTR[BX]

INC WORD PTR[BX]

Page 26: 第三章   8086 的寻址方式和指令系统

4 、 AAA 非压缩 BCD 码加法调整指令功能:在用 ADD 或 ADC 指令对两个非压缩 BCD 码作加法后,

运算结果已存在 AL 中,用 AAA 指令对 AL 中的数据进行调整,产生一个非压缩的十进制数的和放在 AX 中。

例:实现两个非压缩十进制数加法运算。设 AL = 08H , BL = 07H ADD AL , BL ;AAA ;

AL = 0FHAX = 0105H 非压缩十进制数的和放在 AX

中5 、 DAA 压缩 BCD 码加法调整指令

例:实现两个压缩十进制数加法运算。设 AL =28H, BL =68H

执行 ADD AL , BL ; AL = 90H, CF = 0, AF = 1 DAA ;AL← AL + 06H , AL =

96H结果 AL = 96H, CF = 0, AF = 0

功能:将两个压缩 BCD 码相加后,存放在 AL 中的结果,调整为正确的压缩 BCD 数。 DAA 指令要紧跟在 ADD 或 ADC 指令之后使用,以实现压缩的十进制数加法运算。

Page 27: 第三章   8086 的寻址方式和指令系统

例:求两个多字节无符号数之和。加数在 DATA1开始的单元中,被加数在 DATA2开始的单元中,字节长度为 5 ,和存放在 DATA2中。

设置循环计数器5 送 CX , 0 送 SI

取加数送 AL

结束

被加数 + 加数送 DATA2

修改循环次数及指针

加完

Y

N

程序框图: 源程序段:

MOV CX , 5

MOV SI , 0

CLC

MOV AL , DATA1[SI]LOP :ADC DATA2[SI] , AL

INC SI

DEC CX

JNZ LOP

HLT

Page 28: 第三章   8086 的寻址方式和指令系统

(二)减法指令1 、 SUB 目的,源 功能:目的← 目的源

2 、 SBB 目的,源 功能: 目的← 目的源 CF

这两条指令均影响 AF 、 CF 、 OF 、 PF 、 SF 和ZF

3 、 DEC 目的 减量指令 功能:目的 ← 目的 1

执行后不影响 CF ,但影响 AF 、 OF 、 PF 、 SF和 ZF

4 、 NEG 目的 取负指令 功能:目的← 0 目的

指令执行后影响 AF 、 CF 、 OF 、 PF 、 SF 和 ZF 。 若字节操作数为 80H ( 128 ),字操作数为 8000H ( 32768 ),执行 NEG 指令后操作数无变化,但 OF =1 。如操作数为 0 ,执行该指令后,结果仍为 0 ,且 CF =0 ,否则 CF = 1 。

Page 29: 第三章   8086 的寻址方式和指令系统

例 1 :设 DX= 3A49H , CF =1 执行指令 SBB DX , 1850H 执行结果 DX= 21F8H , CF=0

例 2 :已知 AL= 13H 执行指令 NEG AL 执行结果 AL= 0EDH

以上 5 条指令实际上都做减法操作,而且都可以进行字或字节运算。对于双操作数指令,源操作数可以是寄存器、存储器或立即数;目的操作数可以是寄存器或存储器,但不能立即数,而且两个操作数不能同时为储存器。

对于单操作数指令,目的操作数可以是寄存器或存储器,但不能立即数, 如果操作数是存储器,还必须指出其类型。

5 、比较指令 CMP 目的,源 功能: 将目的操作数减去源操作数,但不送结果,仅将结果反

映在标志位上, 接着可用条件转移指令决定程序的流向。

Page 30: 第三章   8086 的寻址方式和指令系统

比较指令主要用在希望比较两个数之间的大小,而又不破坏原操作数的场合。即两者是否相等,或两个中哪一个大。一般有下列几种情况:

* 在比较指令之后,根据 ZF标志即可判断两者是否相等。若两者相等,执行 CMP 指令后, ZF=1 ,否则为 0 。

* 若是两个无符号数进行比较,则在比较指令之后,可根据CF 的状态判断大小。

* 若是判断两个带符号数的大小,可根据 SF 和 OF 进行判断。 在执行 CMP AX , BX 后 1 、当无溢出( OF=0 ),若 SF=0 ,则 AX > BX ;否则 AX<BX 。 2 、当产生溢出( OF =1 ),若 SF =1 ,则 AX>BX ;否则 AX<BX 。

即: OF “异或” SF =0 ,则 AX>BX ;

OF “异或” SF =1 ,则 AX<BX 。

比较指令的应用

Page 31: 第三章   8086 的寻址方式和指令系统

6 、 AAS 非压缩 BCD 码减法调整指令 功能:在用 SUB 或 SBB 指令对两个非压缩十进制数进行相减后,对 AL 中所得结果进行调整,在 AL 中得到一个正确的非压缩十进制数之差。如果有借位,则 CF置 1 。

影响 AF 、 CF , 对 OF 、 PF 、 SF 、 ZF 未定义。

7 、 DAS 压缩 BCD 码减法调整指令

功能:在两个压缩十进制数用 SUB 或 SBB 相减后,结果已存放在 AL 中的情况下,用 DAS 对 AL 进行调整,在 AL 中得到正确的压缩十进制数。

影响 AF 、 CF 、 PF 、 SF 、 ZF 。对 OF 未定义。

Page 32: 第三章   8086 的寻址方式和指令系统

例:在 BLOCK开始的内存单元中有 100 个 16 位带符号数,请寻找出最大值并送 MAX 单元。

DEC CX ;比较次数减一 JNZ AGAIN ;未完,继续

MOV BX , OFFSET BLOCK ;设置块指针 MOV AX , [BX] ;取一数送 AX INC BX ;修改指针 INC BX MOV CX , 99 ;设置比较次数AGAIN :CMP AX , [BX] ;比较

JG NEXT ; AX>[BX] 转 NEXT MOV AX , [BX] ;小于,则大数送 AX

NEXT : INC BX ;修改指针 INC BX

MOV MAX , AX ;完,则存大数 HLT

Page 33: 第三章   8086 的寻址方式和指令系统

(三)乘法指令1 、无符号数乘法指

令 MUL 源 功能:完成将 AL (字节)或 AX (字)中的无

符号数与源操作数相乘。 双倍长度的乘积送回到 AX 或 DX : AX 。

影响标志位 CF 、 OF 。 若乘积的高半部分(在字节相乘时为 AH ,在字相乘时为 DX )不为零,则标志 CF=1,OF=1; 否则 CF=0,OF=0 。

2 、带符号数乘法指令IMUL 源

功能:完成两个带符号数相乘, 操作及对标志位的影响与 MUL 指令完全类似。

字节操作数: AX ← AL 源 字操作数: DX : AX ←AX 源

3 、 AAM 功能:把在 AL 中的两个非压缩十进制数相乘的结果,进行十进制数的调整,使得在 AX 中得到正确的非压缩十进制数的乘积。指令执行后影响标志位 PF 、 SF 、 ZF ,对 AF 、 CF 、 OF 未定

义。

例:设 AL=90H , BL=04H 。执行指令 MUL BL 后, AX=0240H , CF =1, OF =1

例:设 AL= 09H , BH=06H 执行 MUL BH ; AL= 36H

AAM ;调整得 AH= 05H , AL= 04H 即 AX= 0504H 为非压缩十进制数 09 和 06 相乘的结果 54

Page 34: 第三章   8086 的寻址方式和指令系统

功能:对两个无符号数进行除法运算。源操作数可以是字节或字。

字节操作数: AL ← AX/ 源(字节)的商(最大为 FFH ), AH ← 余数

字操作数 : AX ← ( DX : AX ) / 源(字)的商(最大为 FFFFH ), DX ←余数若被除数只有 16 位,除数也是 16 位,则必须将 16 位被除数送 AX ,并将 DX清 0 ,然后相除。 DIV 指令执行后,所有标志位均无定义。

2 、带符号数除法指令IDIV 源

功能:该指令执行的操作与 DIV 相同,但操作数都必须是带符号数,商和余数也都是带符号数,而且规定余数的符号和被除数的相同,且所有标志位均无定义。 对于 IDIV 指令,字节操作时要求被除数为 16 位,字操作时要求被除数为 3

2 位。如果被除数不满足这个条件,不能简单地将高位置 0 ,而应该先用下面的符号扩展指令将被除数转换成除法指令所要求的格式,再执行除法指令。

3 、把字节转换为字指令CBW

若 AL<80H , 扩展后 AH = 00H ,若 AL 80H ,扩展后 AH =0FFH 。

该指令执行后,不影响标志位。

功能:把 AL 中字节的符号位扩展到 AH 的所有位。

(四)除法指令 1 、无符号数除法指令 DIV 源

Page 35: 第三章   8086 的寻址方式和指令系统

4 、 CWD 把字转换成双字指令 指令执行后,不影响标志位

功能:把 AX 中字的符号位扩展送到 DX 寄存器的所有位中去。 若AX < 8000H , 则 DX = 0000H ; 若 AX 8000H , 则 DX= 0FFFFH

例:编程求- 38/ 3 的商和余数。 MOV AL , 0BAH ;被除数- 38 送 AL MOV CH , 03H ;除数+ 3 送 CH

CBW ;把字节扩展为字,使 AX= 0FFBAH IDIV CH ; AL=0F4H= - 12(商 ) , AH=0FEH= -2( 余数 )5 、 AAD 非压缩十进制数除法调整指令

功能:把 AX 中的非压缩的十进制数(被除数),在两个数相除以前进行校正。这样在两个非压缩的十进制数相除以后,可以得到正确的非压缩十进制的商。

例:设 AX 中存有两个非压缩 BCD 数 0307H ,即十进制数 37 , BL 中存有一个非压缩十进制数 05H ,若要完成 37/5 的运算,可用以下两条指令:

AAD ; AH 10 + AL= 37 = 25H → AL , 00 → AH DIV BL ; AL = 7 (商 ) , AH = 2 ( 余数 )

注意:加法、减法和乘法的十进制调整指令都是紧跟在加法、减法和乘法运算指令之后,对运算结果进行调整。而除法的十进制调整指令 AAD 则不同,它是在除法运算之前进行调整。

Page 36: 第三章   8086 的寻址方式和指令系统

三、逻辑运算和移位指令8088/ 8086 可以对字节或字操作数按位操作 , 包括逻辑与、

或、非、异或及测试和移位、循环移位指令。

(一)逻辑运算指令1 、 NOT 逻辑非指令(取反指令)

指令格式: NOT 目的

功能:将目的操作数求反后送回目的操作数,即目的← 目的 目的操作数可以是 8 位或 16 位寄存器或存储器。

例:设 BX=8DCFH, 执行 NOT BX 后, BX=7230H

指令执行后对标志位没有影响

Page 37: 第三章   8086 的寻址方式和指令系统

双操作数指令能对两个操作数按位进行与、或、异或及测试操作。目的操作数可以是寄存器或存储器;源操作数可以是寄存器或存储器,还可以是立即数。

2 、 AND 逻辑与指令格式: AND 目的 ,源

功能:对两个操作数进行按位“逻辑与”操作,结果送回目的操作数。主要用于使操作数的某些位保持不变 (和‘ 1’相与 ), 而使某些位清 0(和‘ 0’相与 )

例 : 设 AX = 3538H , 执行指令 AND AX , 0F0FH 后 ;AX =0508H

3 、 TEST 测试指令格式: TEST 目的,源

功能:对两个操作数进行“逻辑与”操作 , 但不回送结果 , 即指令执行后两操作数不变。该指令常用在要检测某些条件是否满足,但又不希望改变原有操作数的情况下。紧跟在这条指令后面的往往是一条件转移指令,根据测试结果产生分支,转向不同的处理程序。

例如,要判断在 BX 寄存器中 16 位数的最高位是否为‘ 1’ , 可用指令 TEST BX , 8000H 若最高位为‘ 1’ ,指令执行后, ZF = 0 ,若不是‘ 1’ ,则 ZF = 1(结果是 0)

Page 38: 第三章   8086 的寻址方式和指令系统

4 、 OR “ 逻辑或”指令格式: OR 目的,源

功能:对两个操作数进行按位“逻辑或”操作,结果送回目的操作数。该指令主要用于使操作数的某些位保留 ( 和‘ 0’ 相或 ) ,而使某些位置 1 ( 和‘ 1’ 相或 ) 。例如, AX 中存放两个非压缩 BCD 数 0509H ,要将它们分别转换成 ASCII 码,

结果仍放在 AX 中,则可用如下指令实现: OR AX , 3030H ; AX = 3539H

5 、 XOR 异或操作指令格式: XOR 目的,源

功能:对两个操作数进行按位“逻辑异或”运算,结果送回目的操作数。 主要用于使操作数的某些位保留 ( 和‘ 0’ 相异或 ) ,而使某些位取反 ( 和‘ 1’ 相异或 ) 。例如:欲使 BH 寄存器中的高 4 位取反 , 低 4 位保持不变 , 可执行指令

XOR BH , 0F0H

Page 39: 第三章   8086 的寻址方式和指令系统

CF MSB LSB

0 SHL/ SAL 指令

(二)算术逻辑移位指令1 、 SAL 算术左移指令

指令格式: SAL 目的,计数值2 、 SHL 逻辑左移指令

指令格式: SHL 目的,计数值

功能:以上两条指令的功能完全相同,均将寄存器或存储器中目的操作数的各位左移,每移一次,最低有效位 LSB补 0 ,而最高有效位 MSB 进入标志位 CF 。移动一次,相当于将目的操作数乘以 2 。指令中的计数值决定所要移位的次数。若只需要移位一次,可直接将指令中的计数值置 1 ,若移位次数大于 1 ,应先将移位次数送进 CL 寄存器,再把 CL 放在指令的计数值位置上。

Page 40: 第三章   8086 的寻址方式和指令系统

3 、 SHR 逻辑右移指令

指令格式: SHR 目的,计数值

功能:对目的操作数中的各位进行右移,每执行一次移位操作,操作数右移一位,最低位进入 CF ,最高位补 0 。右移次数由计数值决定,同 SAL/SHL 指令一样。若目的操作数是无符号数,每右移一次,使目的操作数除以 2 ,例如,右移 2 次相当于除以 4 ,右移 3 次相当于除以8 等等。但用这种方法作除法时,余数将被丢掉。

4 、 SAR 算术右移指令指令格式: SAR 目的,计数值

功能:它的功能与 SHR 相似,移位次数由计数值决定。每移位一次,目的操作数各位右移一位,最低位进入 CF ,但最高位(即符号位)保持不变,而不是补 0 。每移一次,相当于对带符号数进行除 2 操作。

MSB LSB

MSB LSB

CF

CF

0 SHR 指令

SAR 指令

Page 41: 第三章   8086 的寻址方式和指令系统

指令执行后对标志位的影响:

标志位 CF 总是为目的操作数最后被移出的那一位的值。

标志位 OF :只有当计数值 = 1 时才有效,用以表示移位前后符号位是否改变,若改变, OF = 1 , 否则 OF = 0 。即对左移指令( SAL/ SHL ),若移位后最高有效位与标志位 CF 不相等,则OF = 1 ,否则 OF = 0 。而对右移指令,若移位后,操作数的最高有效位与次高位不同,则 OF = 1 ,否则 OF = 0 。 标志位 ZF 、 SF 根据指令执行后目的操作数的状态来决定, PF 只有当目的操作数在 AL 中时才有效。标志位 AF 未定义。

例 1 :设 BL= 5AH , 执行指令 SHL BL , 1 后

BL= 0B4H ,标志位 CF = 0 , OF = 1

例 2 :设 DS= 2800H , DI= 180AH ,( 2980AH ) = 1256H 执行 MOV CL , 02H SAR [ DI ] , CL

后 ( 2980AH ) = 0495H , CF = 1 , ZF = 0 , SF = 0

Page 42: 第三章   8086 的寻址方式和指令系统

(三)循环移位指令

MSB LSB

2 、 ROR 循环右移指令指令格式: ROR 目的,计数值 操作 CF

3 、 RCL带进位循环左移指令指令格式: RCL 目的,计数值

操作 MSB LSBCF

4 、 RCR带进位循环右移指令指令格式: RCR 目的,计数值

操作 MSB LSBCF

四条指令都按指令中计数值规定的移位次数进行循环移位,移位后的结果仍送回目的操作数。目的操作数可以是 8/ 16 位的寄存器或内存操作数,移位次数可以是 1 ,也可以由 CL 寄存器的值指定。标志位 CF 的值由最后一次被移出的值决定; OF 位仅在计数值为 1 时才有

效,在移位后操作数的最高有效位 ( 符号位 )发生变化时,则 OF=1,否则 OF置 0.

例 : 设 CF=1, AL =0B4H, 若执行指令 ROL AL, 1 ; 则 AL = 69H, CF = 1, OF = 1 若执行指令 RCR AL , 1 ; 则 AL = 0DAH , CF =0, OF = 0

1 、 ROL 循环左移指令 指令格式: ROL 目的,计数值 操作 CF MSB LSB

Page 43: 第三章   8086 的寻址方式和指令系统

四、字符串操作指令

* 字符串操作指令是用于处理存放在存储器中的字或字节数据,字符串长度可达 64K 字节。

* 字符串操作指令共有五种基本指令,可以对字符串进行传送、比较、扫描及装入和存储操作。

* 在字符串操作指令可前加重复前缀,指令就重复执行,直至CX 寄存器中的操作次数满足为止,重复过程可以被中断。

* 串操作指令的源串位于当前数据段中,以 SI 为指针,目的串必须位于当前附加段中,以 DI 为指针。每执行一次串操作指令,指针 SI 和 DI会自动修改,标志位 DF=0 为递增方向,这时在每次操作后 SI 、 DI增量,字节操作时加 1 ,字操作时加 2 ;DF =1 为递减方向,这时在每次操作后 SI 、 DI减量,字节操作时减 1 ,字操作时减 2 。要处理的字符串长度(字节或字数)放在 CX 寄存器中。

Page 44: 第三章   8086 的寻址方式和指令系统

1 、 MOVS 串传送指令 (不影响标志位)

格式: 1) MOVS 目的串,源串

2) MOVSB (字节传送指令) MOVSW (字传送指令)功能:把由 SI 作指针的源串中的一个字节或一个字,传送到由 DI

作指针的目的串中,且自动修改指针 SI 和 DI 。可方便地实现在存储单元之间传送数据。若在指令前加前缀 REP 则可执行至 CX = 0 。

例:编写程序段把数据段中以 SRC为偏移地址,长度为 100 个字节的字符串,传送到附加段中以 LOC为偏移地址的存储区域中。

程序段: LEA SI , SRC LEA DI , LOC MOV CX , 100 CLD

REP MOVSB

AGAIN : MOVS LOC , SRC DEC CX JNZ AGAIN

指令 REP MOVSB 也可用几条指令代替

Page 45: 第三章   8086 的寻址方式和指令系统

2 、 CMPS 串比较指令

格式: 1) CMPS 目的串,源串 2) CMPSB ( 字节操作 ) / CMPSW ( 字操作 )

功能:将以 SI 为指针的源串中的一个字(或字节)与 DI 为指针的目的串中的一个字(或字节)相比较(相减),但不影响两个串的原始值,结果反映在标志位上,操作后自动修改源串和目的串的指针,指向串中的下一个元素。 标志位 AF 、 CF 、OF 、 PF 、 ZF 和 SF反映两个串的相应元素之间的关系。

在 CMPS 指令前可以加重复前缀,即 REPE CMPS 或 REPZ CMPS ;其功能相同,若比较结果为 CX≠0(指定的长度还未比较完)和 ZF=1 (两串相等),则重复比较,直至 CX=0 (比完了)或 ZF=0 (两串不相等)时才停止操作。也可改用重复前缀 REPNE或 REPNZ ,它们表示:若 CX≠0 (串没有结束)和串不等( ZF=0)则重复比较,直至 CX =0 或 ZF=1 时才停止比较。

Page 46: 第三章   8086 的寻址方式和指令系统

例:在自 KA 和 KB 单元开始各有一个由 30 个字符组成的字符串,检查这两个字符串是否相等,并在 GG 单元中建立一个标志(相等为 00 ,不等为 FFH )

程序段:LEA SI , KA LEA DI , KB

MOV CX , 30 CLD REPE CMPSB JNZ L1 MOV GG , 0 JMP L2 L1 : MOV GG , 0FFH L2 : HLT

初始化

(KA) 和 (KB) 相应字符比较

串相等否?

0 送 GG FF 送 GG

暂停

Y

N

初始化: KA 指针送 SI

KB 指针送 DI

串长送 CX

指针增量变化

思考:第一个不相等的字符的地址

Page 47: 第三章   8086 的寻址方式和指令系统

3 、 SCAS 串扫描指令

格式: 1) SCAS 目的串 2) SCASB 或 SCASW

功能: * 将 AL (字节操作)或 AX (字操作)的内容减去附加段中以 DI 为指针的目的串元素,结果反映在标志位上,但不改变目的串元素及累加器的内容。

* 操作后自动修改指针 DI ,使之指向下一个待扫描的串元素。

SCAS 指令前也可加重复前缀 REPE / REPZ ,表示相等继续搜索,不等提前退出; REPNE / REPNZ 表示不等继续搜索,相等提前退出。

利用 SCAS 指令,可在内存中搜索所需要的数据(关键字)。指令执行前应先将关键字存放在累加器中。

Page 48: 第三章   8086 的寻址方式和指令系统

例:内存中以 BUF0 单元开始的区域连续存放着一个长度为 80 的字符串 (ASCII 码串 ) ,查找字符串中是否有字符‘ B’ ,若有,将关键字的地址送 BX ,若没有查到,则将 BX 寄存器清 0 。

程序段: LEA DI , BUF0

MOV AL ,‘ B’ MOV CX , 80 CLD

REPNE SCASBJZ NEXTMOV BX , 0JMP DONE

NEXT: DEC DIMOV BX , DI

DONE:HLT

块首址送 DI关键字送 AL块长送 CX增量调整指针

搜索关键字

搜索到否?

块指针减一 0 送 BX

暂停

Y

N

DI 送 BX

Page 49: 第三章   8086 的寻址方式和指令系统

4 、 LODS 数据串装入指令(从串中取元素指令)格式: 1) LODS 源串 2) LODSB 或 LODSW

功能:把数据段中以 SI 为指针的串元素,传送到 AL( 字节操作 ) 或 AX( 字操作 ) 中,同时修改 SI ,使它指向串中的下一个元素。 该指令一般不加重复前缀。

例:设 DS = 7000H, SI =0100H,

(70100H) =08H, (70101H) =12H, DF=0,

执行指令 LODSW 后 ,

AX =1208H, SI = 0102H .

Page 50: 第三章   8086 的寻址方式和指令系统

5 、 STOS 数据串存储指令

格式: 1) STOS 目的串 2) STOSB 或 STOSW

功能: 把累加器 AL 或 AX 中的一个字节或字, 传送到附加段中以DI 为目标指针的目的串中, 同时修改指针 DI , 以指向串中的下一个单元。

STOS 指令可与 REP重复前缀连用,即执行指令 REP STOS ,能方便地用累加器中的一个常数,对一个数据串进行初始化。

例:设 (DS) =2000H , (ES) = 1000H , (DI) = 0500H , (AL) =20H , (CX) =10 , DF =0

执行指令 REP STOSB 后 , 内存中 10500H ~ 10509H 单元被置为 20H , 同时使 (DI) = 050AH , (CX) =0 。

Page 51: 第三章   8086 的寻址方式和指令系统

例:在以 BLOCK 为起始地址的内存缓冲区中,有一个长度为 100 字节的带符号数,要求把其中的正、负数分开,分别送至同一段的两个缓冲器。存放正数的缓冲区起始地址为 PDATA ,存放负数的缓冲区起始地址为 NDATA 。

初始化:设置源块指针; 设置正数块指针; 设置负数块指针; 设置处理字节计数器。

注:串取和串存指令自动修改块指针

初始化

取源串一个字节送 AL

存入正数区域

HLT

次数减 1

负数 ?

处理完 ?

存入负数区域

N

Y

Y

N

Page 52: 第三章   8086 的寻址方式和指令系统

程序段 :

START: LEA SI , BLOCKLEA DI , PDATALEA BX, NDATAMOV CX , 100

CLD LOP:LODSB ;取源串的一个字节送 AL

TEST AL , 80H ;测试符号位JNZ MINUS ; 是负数 , 转移到 MI

NUS STOSB ;正数存入正数区域JMP NEXT

MINUS:XCHG BX, DI ; 交换正、负数指针STOSB ;负数送入负数区XCHG BX, DI ;恢复正、负数指针

NEXT: DEC CX ; 次数减 1JNZ LOP ;未处理完 ,继续

HLT

Page 53: 第三章   8086 的寻址方式和指令系统

五、控制转移指令

通常,程序中的指令都是顺序地逐条执行的,指令的执行顺序由 CS 和 IP 决定,每取出一条指令,指令指针 IP自动进行调整,指向下一条指令。当程序执行到某些特定位置,需要脱离程序的正常执行顺序,而把它转移到指定的目标时,可以利用控制转移指令来改变 CS 和 IP 的值,从而改变指令的执行顺序。这类指令可分为:无条件转移和过程调用、条件转移、循环控制及中断等几类。。

(一)无条件转移和过程调用指令1 、过程调用指令 指令格式: CALL 过程

名 执行 CALL 指令时,首先保存断点于堆栈中,然后转移到目标地址。该指令的执行对标志寄存器无影响。过程调用有段内调用和段间调用两种类型。根据地址提供方式不同,又可以分为直接调用和间接调用两种方式。

Page 54: 第三章   8086 的寻址方式和指令系统

例: CALL PROG-N : PROG-N 是一个近标号, 设调用前: CS=2000H , IP=1050H , SS=5000H , SP=0100H ,PROG-N 与 CALL 指令的字节距离( DISP )为 1234H ,则指令执行过程为:

# SP-2 SP , SP=0100-2=00FEH

# 返回地址入栈, IP=1053H 入栈(三字节指令)

# 计算新的 IP=IP+DISP=1053H+1234H=2287H ,实现调用

1) 段内调用: CALL 指令和被调用的过程在同一代码段中。

段内直接调用: CALL 指令后面直接给出过程名的标号,即指令中给出了偏移量。执行的操作是: (SP) 2 SP , IP 入栈; (IP) + 偏移量 IP ( 给出目标地址 )

Page 55: 第三章   8086 的寻址方式和指令系统

段内间接调用:目标地址包含在 CALL 指令中指定的 16 位通用寄存器或存储单元中。

例:设 (BX) = 0200H ,执行指令 CALL BX 后, CPU 转向何处执行程序 ?

例: DS=1000H , BX=200H , SI=300H ,( 10500H ) =3210H ;

执行指令 CALL WORD PTR [BX+SI] 后,

IP= ( DS * 16+BX+SI ) = ( 10500H ) =3210H

解:该指令的操作数是 BX 寄存器,它包含了过程的 16 位偏移地址 EA = 0200H ,执行 CALL 指令后, 0200H IP ,即转到段内偏移地址为 0200H 处执行程序。

Page 56: 第三章   8086 的寻址方式和指令系统

2) 段间调用: CALL 指令和被调用的过程不在同一代码段中。

段间直接调用:目标地址直接在 CALL 指令中给出了

该指令操作为: SP- 2 → SP ,把现行的码段寄存器 CS 的内容入栈; SP- 2 → SP , IP 入栈;转过程的入口,即将被调用过程的段地址和偏移地址送 CS 和 IP 。

例: CALL FAR PTR PROG-F : PROG-F 是一个远标号, 设调用前: CS=1000H , IP=205AH , SS=2500H , SP=0050H ,PROG-F 所在单元的地址指针 CS=3000H , IP=0500H ,则指令执行过程为: # SP-2 SP , SP=0050H-2=004EH , CS=1000H 入栈; # SP-2 SP , SP=004EH-2=004CH , IP=205FH 入栈; # 转子程序入口, 3000H 送 CS , 0500H 送 IP ; # 实现调用

Page 57: 第三章   8086 的寻址方式和指令系统

例: CALL DWORD PTR [ BX ]

设执行 CALL 指令前 , (DS) = 1000H , (BX) = 0200H ,

(10200H) = 31F4H , (10202H) = 5200H 。

执行指令时,先将返回地址的偏移量和段地址都入栈,再转向过程入口。指令中操作数的物理地址 = DS16+BX = 10200H , 从该单元开始取得的双字就是过程的入口地址。 所以,入口地址的 CS: IP 分别为: (10200H) = IP 即 (IP ) = 31F4H

(10202H) = CS (CS) = 5200H

段间间接调用:这类指令的操作数必须是存储单元,从该单元开始存放的双字表示过程的入口地址,其中前 2 个字节是偏移量,后两个字节为代码段基地址。指令中用 DWORD PTR 说明是对存储单元进行双字操作。

Page 58: 第三章   8086 的寻址方式和指令系统

指令格式: JMP 目的

段内直接转移:指令码中直接给出转移的目的地址。格式 1 : JMP SHORT 标号 ; 直接短转移指令

2 、无条件转移指令

指令功能:使程序无条件地转移到指令中指定的目的地址去执行。指令的执行不影响标志位 . 也分为段内转移 (近转移 ) 和段间转移 (远转移 ) 。根据地址提供方式不同,也可以分为直接转移和间接转移两种方式。

转移范围在- 128 ~ +127 个字节之内。( IP ) +8 位偏移量 IP 格式 2 : JMP NEAR PTR 标号 (或 JMP 标号 );直接近转移指令

转移范围在- 32768 ~ +32767 个字节之内。

(IP) + 16 位偏移量 IP

Page 59: 第三章   8086 的寻址方式和指令系统

段间直接转移:指令中用远标号直接给出了转向的段地址和偏移量。只要用指令中给出的偏移地址和段地址分别送入 IP 和 CS ,就使程序从一个代码段转到另一代码段去执行。

指令格式为: JMP FAR PTR PROG-F

段间间接转移:目的地址事先放在存储器的 4 个连续单元中。转移指令中给出存放目标地址的存储单元的首地址。低地址中的字为偏移量,高地址中的字为段地址。例如:

JMP DWORD PTR [SI]

段内间接转移:指令转向的 16 位有效地址放在 16 位寄存器或字存储单元中。例: JMP WORD PTR [BX]

例:若 JMP BX 指令执行前, (BX) =4500H ,则指令执行时,将4500H → IP ,程序转到代码段内偏移地址为 4500H 处执行。

PTR :修改属性运算符

Page 60: 第三章   8086 的寻址方式和指令系统

3 、返回指令 RET

1) RET 指令:

该通常作为一个子程序的最后一条指令,它用以返回到调用这个子程序的断点处。段内返回指令是把 SP 所指的堆栈顶部的一个字弹出到 IP ,且 SP+2 → SP 。若是段间返回指令,除了上述操作外,把新的 SP 所指的堆栈顶部的一个字的内容弹回到 CS , SP+2 → SP 。 RET 指令对标志位无影响。

2) RET n (带立即数返回指令 ) : 这种指令允许返回地址出栈后,再从堆栈中弹出 n 个字节

的数据,也就是让 SP 再加上 n , n 为 0000 ~ FFFFH 范围内的任何一个偶数。例如,指令 RET 8 表示从堆栈中弹出地址后,再使 SP 的值加上 8 。

RET n 指令可以让调用过程的主程序通过堆栈向过程传递参数。这些参数必须在调用过程前推入堆栈,过程在运行中可以通过堆栈指针找到它们。当过程返回时,这些参数已没有用处,应该把它们从堆栈中弹出。使用带立即数返回指令后,可以在过程返回主程序时,使 SP自动增量,从而不需要用 POP 指令就能把这些参数从堆栈中弹出。

Page 61: 第三章   8086 的寻址方式和指令系统

(二)条件转移指令条件转移指令是根据上一条指令执行后, CPU 设置的状态标志作为判别测

试条件来决定是否转移。若满足指令所规定的条件,则程序转移到指令中给出的目的地址;若不满足条件,则程序顺序往下执行指令。注意:所有条件转移均为段内短转移,即目的地址与转移指令后面的那条指令间的距离为- 128 ~ + 127 个字节之间。且指令执行后不影响标志位。

条件转移指令可以分为以下两大类:1 、根据单个标志位的条件转移指令 指令基本格式: JXX 目标

指令助记符 测试条件 指令功能JC CF = 1 有进位 转移JNC CF = 0 无进位 转移JZ /JE ZF = 1 结果为零/相等 转移JNZ /JNE ZF = 0 结果非零/不等 转移JS SF = 1 符号为负 转移JNS SF = 0 符号为正 转移JO OF = 1 溢出 转移JNO OF = 0 无溢出 转移JP /JPE PF = 1 奇偶位为 1/为偶 转移JNP / JPO PF = 0 奇偶位为 0/为奇 转移

Page 62: 第三章   8086 的寻址方式和指令系统

2 、组合条件的条件转移指令

这类指令的助记符中不直接给出标志状态位的测试条件,但仍以某一个标志或几个标志的状态组合,作为测试的条件,若条件成立则转移,否则顺序往下执行。这些指令通常放在比较指令 CMP 之后,通过测试状态位来比较两个数的大小。对两个无符号数进行比较后,一定要用无符号数比较测试指令决定程序流向。对带符号数比较后,则要用带符号数比较测试指令。

类别 指令助记符 测试条件 含义无符号数比较测试

JA/JNBEJAE/JNBJB/JNAEJBE/JNA

CF=0 AND ZF=0CF=0 OR ZF=1CF=1 AND ZF=0CF=1 OR ZF=1

A>BABA<BAB

带符号数比较测试

JG/JNLEJGE/JNLJL/JNGEJLE/JNG

SF=OF AND ZF=0SF=OF OR ZF=1SFOF AND ZF=0SFOF OR ZF=1

A>BABA<BAB

Page 63: 第三章   8086 的寻址方式和指令系统

例:某学生的英语成绩在 AL 中,若低于 60 分,则打印‘ F’ ;若高于或等于 85 分,则打印‘ G’ ;若在 60 分和 85 分之间打印‘ P’ ;试编程实现。

程序段: CMP AL , 60 ;与 60 分比较

JB FAIL ;小于 60 分,转 FAIL

CMP AL , 85 ;大于 60 分,与 85 分比较

JAE GOOD ;大于等于 85 分,转 GOOD

MOV AL ,‘ P’ ;其它,‘ P’ 送 AL

JMP PRINT ;转打印程序

FAIL : MOV AL ,‘ F’ ;‘ F’ 送 AL

JMP PRINT ;转打印程序

GOOD : MOV AL ,‘ G’ ;‘ G’ 送 AL

PRINT : ;打印 AL 中的字符

Page 64: 第三章   8086 的寻址方式和指令系统

(三)循环控制指令循环控制指令用来控制一个程序段的重复执行,重复次数由 C

X 寄存器中的内容决定。转移的目标地址等于当前 IP +8 位位移量。 这类指令的执行均不影响标志位。

1 、 LOOP 短标号

功能:用于控制重复执行一系列指令。指令执行前必须先将重复次数放在 CX 寄存器中,每执行一次 LOOP 指令, CX自动减 1 。若减 1 后 CX 0 ,则转移到指令指定的目标地址处继续循环;若自动减 1 后 CX = 0 ,则结束循环,顺序执行 LOOP 指令之后的那条指令。

指令 LOOP AGAIN 相当于 DEC CX JNZ AGAIN

Page 65: 第三章   8086 的寻址方式和指令系统

2 、 LOOPE/LOOPZ 相等或结果为 0 时循环格式: LOOPE 标号 / LOOPZ 标号

功能:用于控制重复执行一组指令。指令执行前,先将重复次数送到 CX 中,每执行一次指令, CX自动减 1 ,若减 1

后 CX 0且 ZF = 1 ,则转到指令所指定的标号处重复执行;若 CX = 0 或 ZF = 0 ,便退出循环,顺序执行下一条指令。

例:设在 BUF1 开始的内存中有一个由 50 个字节组成的数组,现要对数组中的元素进行测试,直到找到第一个非 0 元素或查完了为止。

程序段:LEA SI , BUF1

DEC SI

MOV CX , 50

AG : INC SI

CMP [ SI ] , 0

LOOPE AG

Page 66: 第三章   8086 的寻址方式和指令系统

3 、 LOOPNE / LOOPNZ 不相等或结果不为 0 循环格式: LOOPNE 标号 或 LOOPNZ 标号

功能:用于控制重复执行一组指令。指令执行前,先将重复次数送到 CX 中,每执行一次指令, CX自动减 1 ,若减 1 后 CX 0且 ZF = 0 ,则转到指令所指定的标号处重复执行;若 CX = 0 或 ZF = 1 ,便退出循环,顺序执行下一条指令。

4 、 JCXZ 若 CX 为 0 转移指令

格式: JCXZ 标号

功能:若 CX 寄存器为零,则转移到指令中标号所指定的地址处,否则将往下顺序执行,它不对 CX 寄存器进行自动减 1的操作。

这条指令主要用在循环程序开始处。为了要使程序跳过循环,只要事先把 CX 寄存器清零。

Page 67: 第三章   8086 的寻址方式和指令系统

(四)中断指令

所谓中断是指计算机在执行正常的程序的过程中,由于某些事件发生,需要暂时终止当前程序的运行,转到中断服务程序去为临时发生的事件服务,中断服务程序执行完毕后,又返回正常程序继续运行,这个过程称为中断。

8086 的中断源分为内部中断和外部中断

内部中断包括:除法运算出错和溢出错误等,或是为便于对程序进行调试而设置的。此外,也可在程序中安排中断指令 I

NT n ,产生内部中断。 外部中断主要用以处理 I/O 设备与 CP

U 之间的通信等。当 CPU响应中断时 , 需要保护断点,保存标志位等,然后通过一个中断向量表,转相应的中断服务程序。

Page 68: 第三章   8086 的寻址方式和指令系统

1 、软件中断指令 INT n ; n = 0 ~ 255

操作:

CPU 先将 标志寄存器内容入栈保护,再把当前断点的段基地址 CS 和偏移地址 IP 入栈保护,并清除中断标志 IF 和单步标志 TF 。然后将中断类型号 n

乘以 4 ,找到中断服务程序的入口地址表的表头地址,从中断向量表中获得中断服务程序的入口地址,将其置入 CS 和 IP 寄存器, CPU 就自动转到相应的中断服务程序中去执行。

Page 69: 第三章   8086 的寻址方式和指令系统

2 、 INTO 溢出中断指令

当带符号数进行算术运算时,如果溢出标志 OF = 1 ,则可由 INTO 指令产生类型为 4 的中断,若 OF = 0 ,则 INTO 指令不产生中断, CPU 继续往下执行指令。为此,在带符号数算术运算指令之后,应安排一条 INTO 指令,一旦溢出就能及时向 CPU 提出中断请求。

3 、 IRET 中断返回指令

所有中断服务程序的最后一条指令必须是 IRET ,用以退出中断过程,返回到断点处。该指令执行时,先从堆栈中依次弹出程序断点,送到 IP 和 CS 寄存器中,接着弹出标志寄存器的内容,送回标志寄存器,然后按 CS : IP 的值使 CPU 返回断点,继续执行原来被中断的程序。

Page 70: 第三章   8086 的寻址方式和指令系统

六、处理器控制指令(一)标志操作指令

1 、 CLC 进位标志置零 使 CF = 0

2 、 CMC 进位标志取反 使 CF → CF

3 、 STC 进位标志置 1 使 CF = 1

4 、 CLD 方向标志置零 使 DF = 0

5 、 STD 方向标志置 1 使 DF = 1

6 、 CLI 中断标志置零 使 IF = 0

7 、 STI 中断标志置 1 使 IF = 1

这些指令的执行不影响其它标志位

Page 71: 第三章   8086 的寻址方式和指令系统

(二) 处理器暂停指令

使 CPU 进入暂停状态,当有复位信号时,或有中断请求时,脱离暂停状态。

(三〕 ESC 交权指令:处理器把控制权交给 8087协处理器,以提高系统

的数运算速度。

(五) LOCK 总线锁定指令:它是一种前缀,可加在任何指令前面,用来维持总线的锁存信号,直到该指令执行完为止,使别的处理器不能控制总线。

1 、 HLT

2 、 NOP 空操作指令:单字节三周期指令。

(四) WAIT 处理器等待指令:使 CPU 进入等待状态,不作任何操作。 TEST引脚的低电平使 CPU退出等待状态。