寻址方式与指令系统

164
3 章 寻址方式与指令系统 3.1 指令系统概 3.2 8086 寻址方 3.3 8086 指令系

Upload: jugnootest

Post on 06-Jul-2015

725 views

Category:

Education


2 download

DESCRIPTION

Addressing

TRANSCRIPT

Page 1: 寻址方式与指令系统

第 3 章 寻址方式与指令系统

3.1 指令系统概述

3.2 8086 寻址方式

3.3 8086 指令系统

Page 2: 寻址方式与指令系统

- 2- 目录 上页 下页 结束

3.1 指令系统概述

3.1.1 指令的基本概念

程序 : 是由完成一个完整任务的一系列有序指令组成的有序集合。

指令 : 是指示计算机进行某种操作的命令,通常一条指令对应着一种基本操作。

指令系统 : 计算机所能执行的全部指令的集合,称为处理器的。

3.1.2 指令格式

计算机中的指令通常由操作码( Operation )和操作数( Operand )组

成,如图 3.1 所示。操作码部分规定计算机所执行的操作;操作数部分也称为地址码,用来描述该指令的操作对象。

操作数…操作数操作码

Page 3: 寻址方式与指令系统

3.1.3 8086 汇编语言格式

标号:操作码 操作数 ;注释1 .双操作数指令

大多数指令需要两个操作数,分别称两个操作数为源操作数和目标操作数,指令运算结果存入目标操作数的地址中去。这样,目标操作数的原有数据将被取代。

格式:操作码 DST , SRC其中, DST 为目标操作数, SRC 为源操作数。

2 .单操作数指令

指令中只给出一个操作数。若指令只需要一个操作数,则此操作数通常作为目标操作数,在运算前提供源操作数,运算后存放运算结果。若指令需 2 个操作数,则另一操作数由指令隐含指定。

格式:操作码 DST3 .无操作数指令

格式:操作码

例如:

HLT ; 停机指令,是无操作数指令

INC AX ; 增 1 指令,是单操作数指令

ADD AX,BX ; 加法指令,是双操作数指令

Page 4: 寻址方式与指令系统

- 4- 目录 上页 下页 结束

3.1.4 指令的执行

要执行的程序段的指令,均保存在存储器中,当计算机需要执行一条指令时,首先产生这条指令的相应地址,并根据地址号打开相应的存储单元,取出指令代码, CPU 根据指令代码的要求以及指令中的操作数,去行相应的操作。

Page 5: 寻址方式与指令系统

- 5- 目录 上页 下页 结束

3.2 8086 寻址方式

3.2.1 数据寻址方式1. 立即数寻址 操作数直接存放在指令中,紧跟在指令操作码之后。这样的数

称为立即数,相应的寻址方式称为立即寻址方式。这种寻址方式在汇编语言格式中表示为:

数字表达式 这个数字表达式的值可以是一个 8 位无符号整数,也可以是

一个 16 位无符号整数,但不可以为小数。例如: MOV AX , 251 ;将十进制数 251 送入寄存器 AX ,“ 251” 是立

即数 MOV AL ,‘ 5’ ;将 5 的 ASCII 码送入寄存器 AL ,其中‘ 5’ 是立

即数 MOV AL , 0E8H ;将 8 位立即数 E8H 送入寄存器 AL MOV AX , 2346H ;将 16 位立即数 2346H 送入寄存器 AX 可以看到,立即数寻址方式主要用来给寄存器或存储单元赋值

,因此这种寻址方式不能用于单操作数指令;若用于双操作数指令,也只能用于源操作数字段,不能用于目标操作数字段。

特点:立即寻址方式中操作数可以从指令中直接取得,不需要运行总线周期,所以其显著特征是速度快。

Page 6: 寻址方式与指令系统

- 6- 目录 上页 下页 结束

2. 寄存器寻址 操作数在 CPU 的内部寄存器中,指令指定寄存器

名(机器指令中为寄存器的二进制编号)。这种寻址方式在汇编语言格式中表示为:

寄存器名 对于 16 位操作数,可以使用的寄存器有: AX 、

BX 、 CX 、 DX 、 SI 、 DI 、 BX 、 BP 等;对于 8 位操作数,可以使用的寄存器有: AH 、 AL 、 BH 、 BL 、 CH 、CL 、 DH 、 DL 。

例如: MOV AX , CX ;将 CX 内容送 AX MOV DL , BL ;将 BL 内容送 DL 其中“ AX” ,“ CX” ,“ DL” ,“ BL” 就是寄存器寻址

方式。 机器执行直接寻址方式的指令时,根据地址码字段访问到寄

存器,继而访问到操作数。 这种寻址方式的优点是:寄存器数量一般在几个到几十个,

比存储器单元少很多,因此它的地址码短,从而缩短了指令长度,节省了程序存储空间。另一方面,从寄存器里取数比从存储器里取数的速度快得多,从而提高了指令执行速度。

Page 7: 寻址方式与指令系统

- 7- 目录 上页 下页 结束

3. 存储器寻址方式

⑴ 直接寻址 操作数在存储器中,逻辑段中存储单元的有效偏移地址 EA 由指令

直接给出。这种寻址方式在汇编语言格式中可以表示为以下几种: ① 地址表达式 ② [ 地址表达式 ] ③ [ 数字表达式 ] 假设 TABLE 是在数据段定义的一个字节数组的首地址标号,其偏

移地址为 1000H ,则以下三条指令是等效的: MOV AL , TABLE MOV AL , [TABLE] MOV AL , [1000H] 其中“ TABLE” 、“ [TABLE]” 、“ [1000H]” 都是直接寻址方式。 以下三条指令也是等效的 : MOV AL , TABLE+2 MOV AL , [TABLE+2] MOV AL , [1000H+2]

Page 8: 寻址方式与指令系统

- 8- 目录 上页 下页 结束

假设( DS) =3000H,( 31000H) =12H,( 31001H) =34H,则执行指令

MOV AL, [1000H]操作的示意图如图所示。

数据段

代码段

31000H

存储器

AX

30000H

OP

00H

10H

12H34H

图 3.5 直接寻址操作示意图指令执行完以后,( AX) =3412H 。

Page 9: 寻址方式与指令系统

- 9- 目录 上页 下页 结束

⑵ 寄存器间接寻址 若操作数在存储器中,存储单元有效地址被放在基址寄存器

BX 、 BP 或变址寄存器 SI 、 DI 中,则称为寄存器间接寻址。

寄存器间接寻址方式在汇编格式中表示为: [ 基址寄存器名或变址寄存器名 ] 例如: MOV AX , [BX] ;物理地址 =DS×16+BX MOV AL , [BP] ;物理地址 =SS×16+BP MOV AX , CS : [DI] ;物理地址 =CS×16+DI 其中“ [BP]” 、“ [BX]” 、“ [DI]” 都是寄存器间接寻址方式

机器执行这种寻址方式的指令时,依据地址码字段的值仿问寄存器,将其中的值作为操作数的偏移地址。如果指令中指定的寄存器是 BX 、 SI 、 DI ,则操作数默认在数据段中,取 DS 寄存器的值作为操作数的段地址值;如果指令中指定的寄存器是 BP ,则操作数默认在堆栈段中,取SS 寄存器的值作为操作数的段地址值,从而算得操作数的20 位物理地址,继而访问到操作数。

Page 10: 寻址方式与指令系统

- 10- 目录 上页 下页 结束

如果( DS) =3000H,( BX) =1010H,( 31010H) =12H,( 31011H) =24H。则操作数的 20位物理地址=30000H+1010H=31010H,执行指令MOV AX, [BX] 操作的示意图如图 3.7所示。

存储器AX

30000H

12H

24H数据段

图 3.7 寄存器间接寻址操作图指令执行完以后,( AX) =2412H。这种寻址方式也允许指定段跨越前缀来取得其它段中的数据。这种寻址方式一般用于访问表格或字符串,执行完一条指令后,通过修改

SI或 DI或 BX或 BP的内容就可访问到表格的下一数据项的存储单元。

Page 11: 寻址方式与指令系统

- 11- 目录 上页 下页 结束

⑶ 寄存器相对寻址

若操作数在存储器中,存储单元的有效地址由一个基址或变址寄存器与指令中指定的 8 位或 16 位位移量组成,则称为寄存器相对寻址。这种寻址方式在汇编格式中表示为以下两种形式之一:

① 位移量 [ 基址寄存器名或变址寄存器名 ] ② [ 位移量 + 基址寄存器名或变址寄存器名 ] 例如: MOV AX , 20H[SI] ;物理地址 =DS×16+SI+20H ( 8 位位移

量) MOV CL , [BP+2000H] ;物理地址 =SS×16+BP+2000H ( 16 位

位移量) MOV AX , STR[BX]

当机器执行这种寻址方式的指令时,依据地址码字段的编号访问得寄存器的值,将其与位移量相加(或相减),和(差)作为操作数的偏移地址。如果指令中指定的寄存器是 BX 、 SI 、 DI ,则操作数默认在数据段中,取 DS 寄存器的值作为操作数的段地址值;如果指令中指定的寄存器是 BP ,则操作数默认在附加数据段中,取 ES 寄存器的值作为操作数的段地址值,从而算得操作数的 20 位物理地址,继而访问到操作数。

Page 12: 寻址方式与指令系统

- 12- 目录 上页 下页 结束

例如, TABLE是数据段中定义的一个变量名,假设它在数据段中的偏移地址为 0100H,有指令:

MOV AX, TABLE[SI]若( DS) =2000H,( SI) =00A0H,( 201A0H) =12H,( 201A1H)

=34H,则源操作数 20位物理地址=20000H+0100H+00A0H=2000H+01A0H=201A0H操作的示意图如图 3.9所示:

位移量 TABLE

数据段

代码段

201A0H

存储器

AX

20000H

OP00H01H

12H34H

OP

图 3.9 寄存器相对寻址操作图当然,也可用段跨越前缀重新指定段寄存器,例如:MOV AL, ES: TABLE[SI]这种寻址方式可用于表格或数组数据的访问操作。使用时将表格或数组

首址作为位移量,用寄存器记录下标,通过修改 SI或 DI或 BX或 BP的内容,就可访问不同的数组元素。

Page 13: 寻址方式与指令系统

- 13- 目录 上页 下页 结束

⑷ 基址加变址寻址

操作数在存储器中,存储单元的有效地址是两个指定寄存器的值之和。这种寻址方式在汇编格式中表示为以下两种形式之一:

① [ 基址寄存器名 ][ 变址寄存器名 ] ② [ 基址寄存器名 + 变址寄存器名 ] 例如:

MOV AX , [BX][SI] ;物理地址 =DS×16+BX+SI MOV AX , [BX+SI] ;物理地址 =DS×16+BX+SI MOV CL , CS : [BX+DI] ;物理地址

=CS×16+BX+DI 其中“ [BX][SI]” 、“ [BX+DI]“ 都是基址变址寻址方式。

当机器执行这种寻址方式的指令时,依据地址码字段的值仿问得基址寄存器和变址寄存器的值,将其相加,和作为操作数的偏移地址。

Page 14: 寻址方式与指令系统

- 14- 目录 上页 下页 结束

例如:MOV AX, [BX][SI]若( DS) =2000H,( BX) =0500H,( SI) =0010H,则偏移地址

=0500H+0010H=0510H, 20位物理地址 =20000H+0510H=20510H。假设( 20510H) =12H,( 20511H) =34H,操作的示意图如图 3.11

所示:

20510H

存储器AX

20000H

12H

34H

数据段

代码段

图 3.11 基址变址寻址操作示意图当然,也可用段跨越前缀重新指定段寄存器,例:MOV AL, ES: [BX][SI]这种寻址方式也可用于表格或数组数据的访问。将表格或数组首地址存入

基址寄存器,通过修改变址寄存器内容可访问到表格或数组的任一数据项的存储单元。由于这种寻址方式两个寄存器内容都可修改,因此它比寄存器相对寻址更灵活。

Page 15: 寻址方式与指令系统

- 15- 目录 上页 下页 结束

⑸ 相对基址加变址寻址

操作数在存储器中,存储单元的有效地址由一个基址寄存器和变址寄存器的内容及指令中指定的 8 位或 16 位位移量的和构成。即 EA=[BX]/[BP]+[SI]/[DI]+[8/16 位位移量 ]

地址表达式可以书写为以下两种形式之一: ① 位移量 [ 基址寄存器 ][ 变址寄存器 ] ② [ 基址寄存器 + 变址寄存器 + 位移量 ] 例如: MOV AX , [BX+DI+20H] ;指令中给出 8 位位移

量 20H 。 MOV AX , ES : 1000H[BP][SI] ;访问 ES 段字存

储单元。

以下三条语句是等价的: MOV AL , TABLE[BX][SI] MOV AL , TABLE[BX+SI] MOV AL , [TABLE+BX+SI]

Page 16: 寻址方式与指令系统

- 16- 目录 上页 下页 结束

3.2.2 程序地址寻址方式

1. 段内直接寻址

这种寻址方式的汇编格式有三种:

① 指令名 SHORT 转移目标地址标号

② 指令名 转移目标地址标号

③ 指令名 NEAR PTR 转移目标地址标号

指令中直接指明了要转移的目标地址,因此叫直接寻址;又因为这种指令只改变 IP 寄存器的值而不改变 CS 寄存器的值,因此又叫段内寻址。汇编这种指令寻址方式时,汇编程序计算转移目标地址标号与本条指令的下一条指令的地址的差值,将其补码称为位移量,写入指令的地址码字段。

Page 17: 寻址方式与指令系统

- 17- 目录 上页 下页 结束

当执行这种寻址方式的转移指令时,机器取出位移量,与当前( IP)相加,和送入 IP寄存器中, CS寄存器内容保持不变,从而实现转移,如图 3.12所示:

转移目标地址的偏移地址

指令

位移量IP寄存器 IP寄存器

图 3.12 段内直接寻址示意图 由此可看出,这种寻址方式实现的是相对转移。 位移量不同,转移范围

不同。当位移量为 8位时,只允许转移到与本条指令的下一条指令相距 -128~ +127范围内的存储单元去。当位移量为 16位时,允许转移到当前代码段内任何地方。

要注意的是:条件转移指令的位移量只能是 8位,而无条件转移的指令可以是 8位,也可以是 16位。 8位叫短跳转, 16位叫近跳转。

Page 18: 寻址方式与指令系统

- 18- 目录 上页 下页 结束

2. 段间直接寻址这种寻址方式的汇编格式有以下两种形式:① 指令名 FAR PTR 转移地址标号

② 指令名 段地址:段偏移地址

指令中直接指明了要转移的目标地址,此转移地址或用地址标号或用数值地址表示,因此叫直接寻址;又因为这种指令不仅改变 IP寄存器的值而且改变 CS寄存器的值,因此又叫段间寻址。

当执行这种寻址方式的转移指令时,机器取指令操作码之后的第一个字,把它送入 IP寄存器中,取操作码之后的第二个字把它送入 CS寄存器中,从而实现转移,如图 3.13所示。

图 3.13 段间直接寻址示意图

转移目标地址的段地址址

转移目标地址的偏移地址址

指令

CS 寄存器

IP 寄存器地址

段地址

Page 19: 寻址方式与指令系统

- 19- 目录 上页 下页 结束

3. 段内间接寻址这种寻址方式的汇编格式为:① 指令名 16 位寄存器名 指令名 WORD PTR 存储器寻址方式转移的目标地址放在寄存器或存储器中,因此叫寄存器间接寻址。这种

指令只改变 IP 寄存器的值而不改变 CS 寄存器的值,因此又叫段内寻址。

当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到一个字,然后把它送入 IP 寄存器中, CS 寄存器的内容不变,从而实现转移,如图 3.14 所示。

图 3.14 段内间接寻址示意图

Page 20: 寻址方式与指令系统

- 20- 目录 上页 下页 结束

4. 段间间接寻址 这种寻址方式的汇编格式为: 指令名 DWORD PTR 存储器寻址方式 转移的目标地址放在存储器中。称作间接寻址。这种指令不仅改变 IP 寄

存器的值而且改变 CS 寄存器的值,因此又叫段间寻址。

当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到存储器中相继的二个字,把第一个字送入 IP 寄存器中,把第二个字送入CS 寄存器,从而实现转移,如图 3.15 所示。

转移目标地址的段地址

CS寄存器

根据寻址方式计算出 20位物理地址

指令

存储器寻址方式

转移目标地址的偏移地址址

IP寄存器存储器

图 3.15 段间间接寻址示意图

Page 21: 寻址方式与指令系统

- 21- 目录 上页 下页 结束

3.3 8086 指令系统 Intel 8086 CPU 提供 133 条基本指令,按功能又可分为以下六类:

① 数据传送指令

② 算术运算指令

③ 逻辑运算和移位指令

④ 串操作指令

⑤ 程序控制指令

⑥ 处理器控制指令

下面将分类介绍这些指令。

Page 22: 寻址方式与指令系统

- 22- 目录 上页 下页 结束

3.3.1 数据传送指令 数据传送指令功能是将数据、地址或立即数传送到寄存器或存储单元中

。这类指令又包括通用数据传送指令、堆栈操作指令、地址传送指令、标志寄存器传送指令、数据交换指令和换码指令,如表 3-1所示。

表 3-1 数据传送类指令

OUT PORT, SRC

IN DST, SRC

(DST)←((SP)+1: (SP)), (SP)←(SP)+2POPF

(SP)←(SP)-2, ((SP)+1: (SP))←(FLAGS)PUSHF

(DST)←((SP)+1: (SP)), (SP)←(SP)+2POP DST

(SP)←(SP)-2, ((SP)+1: (SP))←(SCR)PUSH SRC

(AL)←((BX)+(AL))XLAT

(DST)←(SCR)XCHG DST, SRC

(FLAGS)低 8 ←位 (AH)SAHF

(AH)←(FLAGS)低 8位LAHF

(REG)←(SCR), (ES)←(SCR+2)LES REG, SRC

(REG)←(SCR), (DS)←(SCR+2)LDS REG, SRC

(REG)←(SCR)的有效地址LEA REG, SRC

(DST)←(SCR)MOV DST, SRC

功能说明汇编格式

Page 23: 寻址方式与指令系统

1. 通用数据传送指令 通用数据传送指令 MOV 是形式最简单、用的最多的指令,它可以实现 CPU 内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给 CPU 的内部寄存器或者内存单元。格式:

MOV DST , SCR其中, DST 可以是寄存器和存储器, SCR 可以是寄存器、存储器或立即数。说明:① 指令中两个操作数不能同为存储器操作数。

② CS 不能做为目标操作数。③ 段寄存器之间不能互相传送。④ 立即数不能直接送入段寄存器。

⑤ MOV 指令不影响标志位。

下面举例说明MOV 指令的应用:

Page 24: 寻址方式与指令系统

- 24- 目录 上页 下页 结束

⑴ 立即数传送给通用寄存器或存储器 MOV AL,12H MOV AX,3456H MOV BYTE PTR [BX] , 34H MOV WORD PTR [BP] , 2345H

⑵ 通用寄存器之间相互传送 MOV AX,BX ; 将 BX 中的数据传送到 AX 中。 MOV CL,BH ; 将 BH 中的数据传送到 CL 中, BH 、 CL 就为 8 位

⑶ 通用寄存器和存储器之间相互传送 MOV AX,[BX] ; 将以 BX 为有效地址的 2 个连续内存单元中的数据传

送到 AX 中 MOV [SI],DH ; 将 DH 中的数据传送到由 SI 指定的内存单元中指令中的 [BX] 、 [SI] 和 [DI] 分别表示以 BX 、 SI 和 DI 中的值为有效地址的

内存单元。

⑷ 段寄存器与通用寄存器、存储器之间的相互传送 MOV DS,AX MOV ES, [SI] MOV [DI],SS MOV BX,ES 虽然MOV 指令不能直接实现两个存储单元之间的数据传送,但可

以借助 CPU 内部的寄存器,通过两条指令来完成两个存储单元之间的数据传送。

Page 25: 寻址方式与指令系统

- 25- 目录 上页 下页 结束

2. 堆栈操作指令

堆堆栈( Stack )是主存中一个特殊的区域。

它采用先进后出 FILO ( First In Last Out )或后进先出 LIFO ( Last In First Out )的原则进行存取操作,而不是随机存取操作方式。

堆栈指针——它指示栈顶位置,在8086 中,栈顶由 SS 和 SP共同指示,即 SS:SP 。

用户操作( PUSH/POP 指令)

⑴ 堆栈

Page 26: 寻址方式与指令系统

- 26- 目录 上页 下页 结束

向下生长——向低地址方向生长;

双字节操作——高对高,低对低;

“栈顶总满”——栈顶已经堆有数据。

8088/8086 的堆栈操作特点

Page 27: 寻址方式与指令系统

- 27- 目录 上页 下页 结束

⑵ 堆栈操作指令

说明: ① PUSH 、 POP 指令不能使用立即寻址方式, POP 指令不能使

用 CS 寄存器。② 堆栈中数据的压入弹出必须以字为单位进行,每次 PUSH 操

作栈顶向低地址移动两个字节,而 POP 操作栈顶向高地址移动两个字节。③ 这两条堆栈指令不影响标志位。

堆栈只有两种基本操作:进栈和出栈,

用户操作堆栈对应两条指令 PUSH 和 POP 。

进栈指令 PUSH :

进栈指令先使堆栈指针 SP减 2 ,然后把一个字操作

数存入堆栈顶部

出栈指令 POP :

出栈指令把栈顶的一个字

传送至指定的目的操作数

,然后堆栈指针 SP 加 2

Page 28: 寻址方式与指令系统

- 28- 目录 上页 下页 结束

堆栈的实例和图例

push ax

push [2000h]

pop axpop [2000h]

Page 29: 寻址方式与指令系统

- 29- 目录 上页 下页 结束

例:现场的保护和恢复

push ax ;进入子程序后

push bxpush ds...pop ds ;返回主程序前

pop bxpop ax

Page 30: 寻址方式与指令系统

- 30- 目录 上页 下页 结束

3. 地址传送指令

⑴ 有效地址传送指令有效地址传送指令 LEA把源操作数的有效地址(偏移量)

送入指定的寄存器中。格式:

LEA REG, SCR其中,目标操作数 REG 是一个 16 位的通用寄存器。说明:

① REG 不能是段寄存器。 ② 这条指令不影响标志位。

例如:LEA BX, [2345] ;将 2345单元的偏移量送入 BX,

指令执行后, BX中为 2345LEA AX, [BP+SI] ;指令执行后, AX中为 BP+SI的

Page 31: 寻址方式与指令系统

- 31- 目录 上页 下页 结束

⑵ 取地址指针指令格式:LDS REG, SCR;指针送寄存器和 DS指令LES REG, SCR

LDS指令将源操作数 SCR指定的 4个连续字节,前两字节作为

偏移量,传送到 REG中;后两字节作为段地址,传送到 DS中。 LES与 LDS相似,但将段地址送到 ES中。例如,LDS BX, [1230H]

将地址为 1230H和 1231H的内存单元中的 16位数据作为偏移量,送入 BX寄存器;将地址为 1232H和 1233H的内存单元中的 16位数据作为段值,送入 DS寄存器。说明:① LDS和 LES指令中的 REG不允许是段寄存器。② LDS和 LES指令均指令不影响标志位。

Page 32: 寻址方式与指令系统

- 32- 目录 上页 下页 结束

4. 标志寄存器传送指令⑴ 读取标志指令 读取标志指令 LAHF被执行时,将标志寄存器 FLAGS中的低 8位,传送至 AH中。如图 3.18所示。

⑵ 设置标志寄存器指令 设置标志寄存器指令 SAHF与 LAHF 正好相反,把 AH传送至标志寄存器 FLAGS的低 8位。 SAHF指令可能会改变SF、 ZF、 AF、 PF和 CF标志位,但不影响位于高字节的OF、 DF、 IF和 TF标志。

图 3.18 LAHF指令操作格式

Page 33: 寻址方式与指令系统

- 33- 目录 上页 下页 结束

5. 数据交换指令

格式:XCHG DST, SRC说明:

① DST 、 SRC 不允许是段寄存器、立即数和 IP 寄存器。 ② DST 和 SRC 中,必须有一个是寄存器寻址,即两个存储单元

之间不能直换互换数据。 ③ 此指令不影响标志位。

例如:XCHG BX, [BP+SI]

假设该指令执行前:( BX ) =1234H ,( BP ) =0100H ,( SI ) =0020H ,( SS ) =1F00H ,( 1F120H ) =0000H ,即源操作数物理地址 =1F00H : 0100+0020=1F00H :0120H=1F120H ,交换前源操作数为 0000H, 目标操作数为1234H ;则指令执行后,( BX ) =0000H ,( 1F120H ) =1234H

Page 34: 寻址方式与指令系统

- 34- 目录 上页 下页 结束

7. 输入输出指令

8086 通过输入输出指令与外设进行数据传送IN AL/AX,i8/DX

;AL/AX←I/O端口

输入 IN 指令将外设数

据传送给 CPU 内的 AL/

AX

OUT i8/DX,AL/AX

;I/O端口← AL/AX

输出 OUT 指令将 CPU

内的 AL/AX 数据传送

给外设

Page 35: 寻址方式与指令系统

- 35- 目录 上页 下页 结束

例如:

IN AL, PORT ;( AL)← ( PORT)

IN AX, PORT ;( AX)← ( PORT+1,PORT)

IN AL, DX ;( AL)← (( DX))

IN AX, DX ;( AX)← (( DX) +1,( DX))

OUT PORT, AL ;( PORT)← ( AL)

OUT PORT, AX ;( PORT+1,PORT)← ( AX)

OUT DX, AL ;(( DX))← ( AL)

OUT DX, AX ;(( DX) +1,( DX))← ( AX)

以上 IN 和 OUT 指令的前两种方式是直接端口寻址方式,端口地址PORT 是一个 8 位的立即数,其范围是 0~ 255 。两组指令中的后两种格式是间接寻址方式,端口地址 DX 中,其范围为 0~ 65535 ,这种方式通过对DX 寄存器的增量可以处理几个连续端口地址的输入输出。

Page 36: 寻址方式与指令系统

- 36- 目录 上页 下页 结束

3.3.2 算术运算指令

实现二进制 /BCD 码数据的四则运算

1 、加法运算: ADD/ADC/INC

2 、减法运算: SUB/SBB/DEC/NEG/CMP

3 、乘法运算: MUL/IMUL

4 、除法运算: DIV/IDIV

5 、符号扩展: CBW/CWD

6 、十进制调整: DAA/DAS/AAA/AAS/AAM/AAD

Page 37: 寻址方式与指令系统

- 37- 目录 上页 下页 结束

四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。

请注意算术运算指令对标志的影响

重点掌握: ADD/ADC/SUB/SBB/INC/DEC/CMP

比较熟悉: NEG/MUL/IMUL/DIV/IDIV

一般了解: CBW/CWD

认真理解: DAA/DAS/AAA/AAS/AAM/AAD

Page 38: 寻址方式与指令系统

- 38- 目录 上页 下页 结束

1. 加法与减法指令 ⑴ 不带进位加法指令

不带进位加法指令 ADD 完成两个操作数求和运算,并把结果送目标操作数中。 ADD 指令影响 CF 、 OF 、 AF 、 SF 、 ZF 和 PF 标志位。

格式: ADD DST, SRC例如:MOV AL, 46H ; AL=46HMOV BX, 9A4DH ; BX=4A4DHADD AL, 0C5H ; AL+0C5H→AL

指令执行后,对标志位的影响如下: 二进制运算 无符号数 带符号数(AL)=46H= 0 1 0 0 0 1 1 0 70 +70 + 0C5H= 1 1 0 0 0 1 0 1 197 - 59

自然丢掉 1 0 0 0 0 1 0 1 1 267 +11

SF=0 , CF=1 , ZF=0 , AF=0 , OF=0 , PF=1

Page 39: 寻址方式与指令系统

- 39- 目录 上页 下页 结束

⑵ 带进位加法指令两个操作数相加时,还要把进位标志 CF 加上去,结果送到目标操作数中。

格式: ADC DST, SRC带进位加法指令主要用来实现多字节、多精度加法,因为它能加上低位来的

进位。

例如,MOV AX, [0100H]ADD AX, [0200H]MOV [0300H], AX ;低字之和存入 C单元。MOV AX, [0100H]+ 2 ;装入高字。ADC AX, [0100H]+ 2 ;高字求和,考虑低字的进位。 MOV [0300H]+ 2, AX ;存入高字之和。

Page 40: 寻址方式与指令系统

- 40- 目录 上页 下页 结束

⑶ 自增指令自增指令 INC 将操作数 DST 加 1 ,结果再送回 DST 。

格式: INC DSTINC 指令影响 OF 、 AF 、 SF 、 ZF 和 PF 等标志位,但不

影响进位标志 CF 。 例如:INC SI ;将 SI内容加 1,结果送回 SI。

Page 41: 寻址方式与指令系统

- 41- 目录 上页 下页 结束

⑷ 不带借位的减法指令该指令求源操作数与目标操作数之差,结果送到目标操作

数 OPRD1 中。 SUB 指令影响 CF 、 OF 、 AF 、 SF 、 ZF 和PF 等标志位。

格式: SUB DST, SCR

例如: MOV DL, 41H SUB DL, 5AH

上述指令执行后( DL ) =0E7H , SF=1 , ZF=0 , CF=1 , OF=0 , AF=1 ,PF=1 。

Page 42: 寻址方式与指令系统

- 42- 目录 上页 下页 结束

⑸ 带借位的减法指令在两个操作数相减时,还要再减去借位标志 CF ,结果送到目标

操作数中。格式: SBB DST, SCRSBB 指令对状态标志位的影响与 SUB 指令相同。它的用法与

ADC 指令相似,主要用来做多字节、多精度减法,因为它能够减去低位产生的借位。

⑹ 自减指令自减指令 DEC 将目标操作数 DST减 1 ,并将结果再送回

DST 。格式: DEC DST例如:DEC [BX+SI] ; DS段有效地址为 BX+SI的存储单元内容减

1DEC 指令影响 OF 、 AF 、 SF 、 ZF 和 PF 标志位,但不影响

进位标志 CF 。

Page 43: 寻址方式与指令系统

- 43- 目录 上页 下页 结束

⑺ 取负指令 NEG 取负指令 NEG 对指令中给出的操作数 DST 求其相反数的补码形式,再将结果送回 DST 。因为对一个数取其相反数,相当于用 0减去这个数,所以 NEG 指令执行的也是减法操作。

格式: NEG DST 无论操作数 DST 是正数还是负数,执行完该指令后,都

相当于对 DST按位取反,末位加 1 。

例如:NEG AL

若 (AL)=03H ,则 CPU 执行完该指令后, (AL)=0FDH 。

NEG 指令影响 CF 、 OF 、 AF 、 SF 、 ZF 和 PF 标志位。

Page 44: 寻址方式与指令系统

- 44- 目录 上页 下页 结束

CMP 指令将目的操作数减去源操作数,按照定义相应设置状态标志。

CMP 指令执行的功能与 SUB 指令,但结果不回送目的操作数。

⑻ 比较指令

格式: CMP DST, SCR在比较指令执行之后,根据 ZF 、 CF 、 SF 和 OF四个标志位

可以判断两数的大小。

Page 45: 寻址方式与指令系统

- 45- 目录 上页 下页 结束

例:比较 AL 是否大于 100

cmp al,100 ;al-100 jb below ;al<100 ,跳转到 below 执行

sub al,100 ;al≥100 , al←al-100 inc ah ;ah←ah+1below: ...

执行比较指令之后,可以根据标志判断两个数是否

相等、大小关系等。所以, CMP 指令后面常跟条

件转移指令,根据比较结果不同产生不同的分支。

Page 46: 寻址方式与指令系统

- 46- 目录 上页 下页 结束

2. 乘法指令与除法指令

MUL r8/m8

; 无符号字节乘法

;AX←AL×r8/m8

MUL r16/m16

; 无符号字乘法

;DX.AX←AX×r16/m16

IMUL r8/m8

; 有符号字节乘法

;AX←AL×r8/m8

IMUL r16/m16

; 有符号字乘法

;DX.AX←AX×r16/m16

⑴ 乘法运算指令

Page 47: 寻址方式与指令系统

- 47- 目录 上页 下页 结束

乘法指令的功能

乘法指令分无符号和有符号乘法指令: MUL和IMUL

乘法指令的一个源操作数显式给出,另一个操作数隐含使用 AL/AX ,目标操作数为 AX/DX.AX 。

字节量相乘: AL 与 r8/m8 相乘,得到 16 位的结果,存入 AX 中;

字量相乘: AX 与 r16/m16 相乘,得到 32 位的结果,其高字存入 DX ,低字存入 AX 中。

乘法指令利用 OF 和 CF判断乘积的高一半是否具有

有效数值。

Page 48: 寻址方式与指令系统

- 48- 目录 上页 下页 结束

乘法指令对标志的影响

乘法指令如下影响 OF 和 CF 标志:

MUL 指令——若乘积的高一半( AH 或 DX )为 0 ,则

OF=CF=0 ;否则 OF=CF=1 。

IMUL 指令——若乘积的高一半是低一半的符号扩展,则

OF=CF=0 ;否则均为 1 。

乘法指令对其他状态标志没有定义:指令执行后这

些标志是任意的、不可预测(就是谁也不知道是 0还是 1 )。

对标志没有影响是指令的执行不改变标志的状

态。

Page 49: 寻址方式与指令系统

- 49- 目录 上页 下页 结束

例 : 无符号和有符号数的乘法运算

mov al,0b4h;al=b4h=180

mov bl,11h;bl=11h=17

mul bl

;ax=Obf4h=3060 ,

;OF=CF=1;AX 高 8 位不为 0

mov al,0b4h ;al=b4h= - 76

mov bl,11h;bl=11h=17

imul bl

;ax=faf4h= - 1292 ,

;OF=CF=1;AX 高 8 位含有效数字

Page 50: 寻址方式与指令系统

- 50- 目录 上页 下页 结束

⑵ 除法运算指令

DIV r8/m8 ; 无符号字节除法: AX÷r8/m8

AL←商, Ah←余

DIV r16/m16 ; 无符号字除法: DX.AX÷r16/m16

AX←商, DX←余IDIV r8/m8 ; 有符号字节除法: AX÷r8/m8

AL←商, Ah←余IDIV r16/m16 ; 有符号字除法: DX.AX÷r16/m16

AX←商, DX←余

Page 51: 寻址方式与指令系统

- 51- 目录 上页 下页 结束

除法指令的功能

除法指令分无符号和有符号除法指令: DIV和IDIV除法指令的除数显式给出(隐含使用一个操作数 AX和 DX 作为被除数)。

字节量除法: AX除以 r8/m8 , 8 位商存入 AL , 8位余数存入 AH ;

字量除法: DX.AX除以 r16/m16 , 16 位商存入AX , 16 位余数存入 DX 。

除法指令对标志没有定义。

除法指令会产生结果溢出

Page 52: 寻址方式与指令系统

- 52- 目录 上页 下页 结束

除法错中断

当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX 不能表达,便产生溢出 ,8086CPU 中就产生

编号为 0 的内部中断——除法错中断。 对 DIV 指令,除数为 0 ,或者在字节除时商超过 8 位,或者在字除时商超过 16 位,则发生除法溢出。

对 IDIV 指令,除数为 0 ,或者在字节除时商不在 -128~ 127范围内,或者在字除时商不在 -32768~ 32767范围内,则发生除法溢出。

Page 53: 寻址方式与指令系统

- 53- 目录 上页 下页 结束

3. 符号扩展指令

CBW ;AL 的符号扩展至 AH

; 如 AL 的最高有效位是 0 ,则 AH= 00 ;AL 的最高有效位为1 ,则 AH=FFH 。 AL 不变。

CWD;AX 的符号扩展至 DX; 如 AX 的最高有效位是

0 ,则 DX= 00 ; AX的最高有效位为 1 ,则DX= FFH 。 AX 不变。

• 什么是符号扩展• 符号扩展指令常用于获得倍长的数据,如被除数• 符号扩展指令不影响标志位

Page 54: 寻址方式与指令系统

- 54- 目录 上页 下页 结束

mov al,80h ;al=80h

cbw ;ax=ff80h

add al,255 ;al=7fh

cbw ;ax=007fh

例:符号扩展

Page 55: 寻址方式与指令系统

- 55- 目录 上页 下页 结束

4. 十进制调整指令

十进制数调整指令对 BCD码运算的结果进行十进制调整,以得到正确的 BCD 码运算结果。

BCD 码运算分压缩和非压缩两种,它们的调整方法不同。

压缩 BCD 码:一个字节中容纳两个 BCD 码,其范围为: 00H ~ 99H 。

非压缩 BCD 码: 一个字节中仅容纳 1 个 BCD码,其范围为: 00H ~ 09H 。

Page 56: 寻址方式与指令系统

- 56- 目录 上页 下页 结束

BCD 码

一位十进制数用 4 位二进制编码来表示:二进制编码的十进制数( BCD : Binary Coded Decimal )

常用的是 BCD 码是 8421 BCD 码,它用 4 位二进制编码中的 0000~1001 来表示“ 0”~“ 9” 这 10 个数码。

8086支持压缩 BCD 码和非压缩 BCD 码的调整运算。 真值 8( 1位十进制) 64( 2位十进制)

二进制编码 08H 40H

压缩 BCD 码 08H 64H

非压缩 BCD 码 08H 06 04H

Page 57: 寻址方式与指令系统

- 57- 目录 上页 下页 结束

压缩 BCD 码加 /减调整指令

( ADD AL,i8/r8/m8 )

( ADC AL,i8/r8/m8 )

DAA

;AL← 将 AL 的加和调整为压缩 BCD 码

( SUB AL,i8/r8/m8 )

( SBB AL,i8/r8/m8 )

DAS

;AL← 将 AL 的减差调整为压缩 BCD 码

使用 DAA 或 DAS 指令前,应先执行以 AL 为目的操作数的加法或减法指令

DAA 和 DAS 指令对 OF 标志无定义,其他标志受影响,例如 CF反映压缩 BCD 码相加或减的进位或借位状态

Page 58: 寻址方式与指令系统

- 58- 目录 上页 下页 结束

压缩 BCD 码的加减运算

实现压缩 BCD 码加法: 68+ 28= 96

mov al,68h ;al=68h ,压缩 BCD 码表示真值 68mov bl,28h ;bl=28h ,压缩 BCD 码表示真值 28add al,bl ; 二进制加法: al=68h+28h=90hdaa ; 十进制调整: al=96h

实现压缩 BCD 码减法: 68 - 28= 40

mov al,68h ;al=68h ,压缩 BCD 码表示真值 68mov bl,28h ;bl=28h ,压缩 BCD 码表示真值 28sub al,bl ; 二进制减法: al=68h - 28h=40hdas ; 十进制调整: al=40h

Page 59: 寻址方式与指令系统

- 59- 目录 上页 下页 结束

非压缩 BCD 码加、减调整指令

( ADD AL,i8/r8/m8 )

( ADC AL,i8/r8/m8 )

AAA;AL← 将 AL 的加和调整为非压缩 BCD 码

;AH←AH+调整的进位

( SUB AL,i8/r8/m8 )

( SBB AL,i8/r8/m8 )

AAS;AL← 将 AL 的减差调整为非压缩 BCD 码

;AH←AH -调整的借位

使用 AAA 或 AAS 指令前,应先执行以 AL 为目的操作数的加法或减法指令

AAA 和 AAS 指令在调整中产生了进位或借位,则 AH 要加上进位或减去借位,同时CF=AF=1 ,否则 CF=AF=0 ;他们对其他标志无定义

请看实例

Page 60: 寻址方式与指令系统

- 60- 目录 上页 下页 结束

非压缩 BCD 码的加减运算

实现非压缩 BCD 码加法: 68+ 9= 77

mov ax,0608h ;ax=0608h ,非压缩 BCD 码表示真值 68mov bl,09h ;bl=09h ,非压缩 BCD 码表示真值 9add al,bl ; 二进制加法: al=08h+09h=11haaa ; 十进制调整: ax=0707h

实现非压缩 BCD 码减法: 68 - 09= 59

mov ax,0608h ;ax=0608h ,非压缩 BCD 码表示真值 68mov bl,09h ;bl=09h ,非压缩 BCD 码表示真值 9sub al,bl ; 二进制减法: al=08h - 09h=ffhaas ; 十进制调整: ax=0509h

Page 61: 寻址方式与指令系统

- 61- 目录 上页 下页 结束

非压缩 BCD 码乘、除调整指令

( MUL r8/m8 )

AAM

;AX← 将 AX 的积调整为非压缩 BCD 码

( DIV r8/m8 )

AAD

;AX← 将 AX 中的商调整为非压缩 BCD 码

AAM 指令跟在字节乘 MUL 之后,将乘积调整为非压缩 BCD 码

AAD 指令跟在字节除 DIV 之前,先将非压缩BCD 码的被除数调整为二进制数

AAM 和 AAD 指令根据结果设置 SF 、 ZF 和PF ,但对 OF 、 CF 和 AF 无定义

请看实例

Page 62: 寻址方式与指令系统

- 62- 目录 上页 下页 结束

非压缩 BCD 码的乘除运算

实现非压缩 BCD 码乘法: 8×9= 72

mov ax,0608h ;ax=0608h ,非压缩 BCD 码表示真值 68mov bl,09h ;bl=09h ,非压缩 BCD 码表示真值 9mul bl ; 二进制乘法: al=08h×09h=0048haam ; 十进制调整: ax=0702h

实现非压缩 BCD 码除法: 68÷9= 7 (余 5 )

mov ax,0608h ;ax=0608h ,非压缩 BCD 码表示真值 68mov bl,09h ;bl=09h ,非压缩 BCD 码表示真值 9aad ; 二进制扩展: ax= 68= 0044hdiv bl ;除法运算:商 al=07h ,余数 ah=05h

Page 63: 寻址方式与指令系统

- 63- 目录 上页 下页 结束

总结

四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。

这一节要重点掌握:

ADD/ADC SUB/SBB INC/DEC CMP 8086除直接支持二进制数的算术运算;还提供对

BCD 码运算的调整指令,实现了间接的十进制算术运算操作。

Page 64: 寻址方式与指令系统

- 64- 目录 上页 下页 结束

表 8086支持的 4 种数据类型的算术运算

Page 65: 寻址方式与指令系统

- 65- 目录 上页 下页 结束

3.3.3 逻辑运算指令

以二进制位为基本单位进行数据的操作

1 、逻辑运算: AND OR XOR NOT TEST

2 、移位: SHL SHR SAR

3 、循环移位: ROL ROR RCL RCR

常用指令,应该特别熟悉;同时,注意这些指令对标志位的影响。

Page 66: 寻址方式与指令系统

- 66- 目录 上页 下页 结束

逻辑与运算:与 1 相“与”结果不变,与 0 相

“与”结果为 0 ; 结果送目的操作数。

AND DST , SRC ; (DST)← ( DST) ( SRC)∧

AND 指令设置 CF=OF=0 ,根据结果设置

SF 、 ZF 和 PF状态,而对 AF未定义。

屏蔽作用——对指定位置 0

逻辑与指令 AND

Page 67: 寻址方式与指令系统

- 67- 目录 上页 下页 结束

逻辑或指令 OR

逻辑或运算:与 0 相“或”结果不变,与 1 相“

或”结果为 1 ;结果送目的操作数。

OR DST , SRC ; (DST)← ( DST) ( SRC)∨

指令设置 CF=OF=0 ,根据结果设置 SF 、 ZF 和PF状态,而对 AF未定义。

对指定位置 1

Page 68: 寻址方式与指令系统

- 68- 目录 上页 下页 结束

逻辑异或指令 XOR 逻辑异或运算:与 0 相“异或”结果不变 ,与

1 相“异或”的结果取反。结果送目的操作数。

XOR DST , SRC ; (DST)← ( DST) ( SRC)≮

指令设置 CF=OF=0 ,根据结果设置 SF 、 ZF 和PF状态,而对 AF未定义。

对指定位取反

Page 69: 寻址方式与指令系统

- 69- 目录 上页 下页 结束

逻辑非指令 NOT逻辑非运算:按位取反。原来是“ 0” 的位

变为“ 1” ;原来是“ 1” 的位变为“ 0” 。

NOT DST ; ( DST) 中各位取反

单操作数指令

不影响标志位

易与 NEG指令混淆

Page 70: 寻址方式与指令系统

- 70- 目录 上页 下页 结束

逻辑运算

mov al,45hand al,31h; 逻辑与 al=01h

mov al,45hor al,31h; 逻辑或 al=75h

mov al,45hxor al,31h; 逻辑异或 al=74h

mov al,45hnot al; 逻辑非 al=bah

45h 0100 010131h 0011 0001

Page 71: 寻址方式与指令系统

- 71- 目录 上页 下页 结束

逻辑指令的应用 AND 指令可用于复位某些位(同 0 相与),不影响其他位

and bl,11110110B; 将 BL 中 D3和 D0位清 0 ,其他位不变

OR 指令可用于置位某些位(同 1 相或),不影响其他位

or bl,00001001B ; 将 BL 中 D3 和 D0 位置 1 ,其他位不变

XOR 指令可用于求反某些位(同 1 相异或),不影响其他位

xor bl,00001001B ; 将 BL 中 D3 和 D0 位求反,其他位不变

Page 72: 寻址方式与指令系统

- 72- 目录 上页 下页 结束

例:测试某些位为 0 或 1

test al,01h ;测试 AL 的最低位 D0

jnz there ; 标志 ZF=0 ,即 D0=1; 则程序转移到 there

... ;否则 ZF=1 ,即 D0=0 ,顺序执行

there: ...

TEST 指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。

Page 73: 寻址方式与指令系统

- 73- 目录 上页 下页 结束

3.3.4 移位指令

移位指令将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 :

SHL DST , COUNT ; 逻辑左移, LSB补 0 , MSB 进CF

SHR DST , COUNT ; 逻辑右移, LSB 进 CF , MSB补0

SAL DST , COUNT ; 算术左移, LSB补 0 , MSB 进CF

SAR DST , COUNT ; 算术右移, LSB 进 CF , MSB 不变

Page 74: 寻址方式与指令系统

- 74- 目录 上页 下页 结束

循环移位指令将操作数从一端移出的位返回到另一

端形成循环,分成不带进位和带进位,分别具有左

移或右移操作 :ROL DST , COUNT ; 不带进位循环左移

ROR DST, COUNT ; 不带进位循环右移

RCL DST, COUNT ;带进位循环左移

RCR DST, COUNT ;带进位循环右移

算术左移 SAL 与逻辑左移 SHL实为同一条指令 .

其中,目标操作数 DST 可以是通用寄存器或存储器操作数, COUNT 为移位次数,如果移位次数是 1次,则可以直接出现在指令中;如果移位次数大于 1次,则由 CL 寄存器间接给出。

Page 75: 寻址方式与指令系统

- 75- 目录 上页 下页 结束

移位指令的功能

Page 76: 寻址方式与指令系统

- 76- 目录 上页 下页 结束

图 a 、 b 不带进位循环移位指令

Page 77: 寻址方式与指令系统

- 77- 目录 上页 下页 结束

图 c 、 d 带进位循环移位指令

Page 78: 寻址方式与指令系统

- 78- 目录 上页 下页 结束

说明:① 移位指令影响标志位 CF 、 PF 、 SF 、 ZF 、 OF 。

OF 的设置方法是:如果移位后,最高位发生了变化,则OF=1 ,否则 OF=0 。其余标志位根据移位后的值来确定,对AF 无定义。② 循环移位指令只影响标志位 CF 和 OF ,不影响其它标志位。 CF 根据移位后的值来设置, OF 的设置方法是:如果移位前后,最高位的值发生了变化,则 OF=1 ,否则 OF=0 。

③ SAL 指令和 SHL 指令是一条机器指令的两种汇编指令表示。④ 对于 SAL/SHL 指令,若目标操作数为无符号数,且移

位后值小于 255 (字节移位)或小于 65535 (字移位),则左移一位,相当于数值乘 2 ;若目标操作数是带符号数,移位后不溢出,则执行一次 SAL 指令相当于带符号数乘 2 。

⑤ SAR 指令可用于用补码表示的带符号数的除 2 运算。 ⑥ SHR 指令可用于无符号数的除 2 运算。

Page 79: 寻址方式与指令系统

- 79- 目录 上页 下页 结束

移位指令示例

MOV AH, 3FH ; AH←3FHSAL AH, 1 ; AH←7EH, CF=0, OF=0MOV AL, 88HSAR AL, 1 ; AL←0C4HMOV CL, 2MOV AL, 08HSHR AL, CL ; AL←02H

循环移位指令示例MOV AL, 46HMOV CL, 2ROL AL, CL ; AL←19H, CF=1, OF=0 。

Page 80: 寻址方式与指令系统

- 80- 目录 上页 下页 结束

例:用移位指令实现乘法功能

求: a×3+b×7 mov si,axshl si,1 ;si←ax×2add si,ax ;si←ax×3mov dx,bxmov cl,03hshl dx,cl ;dx←bx×8sub dx,bx ;dx←bx×7add dx,si ;dx←bx×7 + ax×3

逻辑左移 1 位相当于无符号数乘 2

逻辑右移 1 位相当于无符号数除 2

Page 81: 寻址方式与指令系统

- 81- 目录 上页 下页 结束

对串数据类型进行操作

串寻址方式

5 条指令

串传送: MOVS串存储: STOS串读取: LODS串比较: CMPS串查找: SCAS

3 个串操作重复前缀

无条件重复

REP

有条件重复

REPZ/REPE REPNZ/REPNE

3.3.5 串操作指令

Page 82: 寻址方式与指令系统

- 82- 目录 上页 下页 结束

本节要求

串操作指令是 8086指令系统中比较独特的一类指令,在操作主存连续区域的数据时,特别好用、因而常用。

重点掌握: MOVS STOS LODS

CMPS SCAS REP

一般了解: REPZ/REPE REPNZ/REPNE

Page 83: 寻址方式与指令系统

- 83- 目录 上页 下页 结束

什么是串

串——主存中连续存放的字节或字形式的数据

串操作指令的操作对象有两种:

以字节( B )为单位的字节串( MOVSB );

以字( W )为单位的字串( MOVSW )。

Page 84: 寻址方式与指令系统

- 84- 目录 上页 下页 结束

串操作数两种情况:

1 、两个操作数均为串数据;MOVS —— 用于将一串从源移动到目的

CMPS —— 用于将两串逐一比较

2 、两个操作数一为 AL/AX ,另一为串STOS —— 用于将 AL/AX 中字节 / 字填充到目的串

LODS —— 用于从源串中取字节 / 字到 AL/AX

SCAS —— 用于从目的串中查找特定的字节 / 字

Page 85: 寻址方式与指令系统

- 85- 目录 上页 下页 结束

串寻址方式

源操作数用寄存器 SI 寻址,默认在数据段 DS 中, 即 DS : [SI] ,但允许段超越;

目的操作数用寄存器 DI 寻址,默认在附加段 ES中,即 ES : [DI] ,不允许段超越。

执行串操作指令后, SI 和 DI 将自动修改:

对于字节串—— ±1对于字串—— ±2DF=0 (执行指令 CLD 指令)—— 增址;

DF=1 (执行指令 STD 指令)—— 减址。

Page 86: 寻址方式与指令系统

- 86- 目录 上页 下页 结束

⑴ 串传送指令 MOVS ( move string )

把字节或字操作数从主存的源地址传送至目的地址

MOVSW ; 字串传送: ES:[DI]←DS:[SI] ,

; SI←SI±2 , DI←DI±2

MOVSB ; 字节串传送: ES:[DI]←DS:[SI] ,

; SI←SI±1 , DI←DI±1

1. 基本串操作指令

Page 87: 寻址方式与指令系统

- 87- 目录 上页 下页 结束

MOVSB 字节串正向传送

主存

地址低端

地址高端

30H

30H

源操作数 DS:[SI]

目的操作数 ES:[DI]

DF= 0 ,正向传送

演示反向传送 返回

源操作数 DS:[SI]

目的操作数 ES:[DI]

然后:

SI←SI+1 , DI←DI+1

Page 88: 寻址方式与指令系统

- 88- 目录 上页 下页 结束

MOVSB 字节串反向传送主存

地址低端

30H

30H源操作数 DS:[SI]

目的操作数 ES:[DI]

DF= 1 ,反向传送

演示正向传送 返回

源操作数 DS:[SI]

目的操作数 ES:[DI]

然后:

SI←SI - 1 , DI←DI- 1

地址高端

Page 89: 寻址方式与指令系统

- 89- 目录 上页 下页 结束

MOVSW 字串正向传送主存

地址低端

地址高端

32H

31H

32H

31H

源操作数 DS:[SI]

目的操作数 ES:[DI]

DF= 0 ,正向传送

演示反向传送 返回

然后:

SI←SI+2 , DI←DI+2 源操作数 DS:[SI]

目的操作数 ES:[DI]

Page 90: 寻址方式与指令系统

- 90- 目录 上页 下页 结束

MOVSW 字串反向传送主存

地址低端

地址高端32H

31H

DF= 1 ,反向传送

演示正向传送 返回

32H

31H

目的操作数 ES:[DI]

然后:

SI←SI - 2 , DI←DI- 2

源操作数 DS:[SI]

源操作数 DS:[SI]

目的操作数 ES:[DI]

Page 91: 寻址方式与指令系统

- 91- 目录 上页 下页 结束

例:字节串传送

mov si, offset sourcemov di, offset destinationmov cx,100 ;cx←传送次数cld ; 设置 DF=0 ,实现地址增加

again:movsb ;传送一个字节(可否用 movsw )dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0

; 不为 0 ,则转移 again 位置执行;;否则,结束

offset是什么? 该段程序的功能是什么?

Page 92: 寻址方式与指令系统

- 92- 目录 上页 下页 结束

例:字串传送mov si,offset sourcemov di,offset destinationmov cx,50 ;cx←传送次数cld ; 设置 DF=0 ,实现地址增加

again:movsw ;传送一个字(用movsb)dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0

; 不为 0; ,则转移 again 位置执行;

;否则,结束

offset是什么? 该段程序的功能是什么?

Page 93: 寻址方式与指令系统

- 93- 目录 上页 下页 结束

上例中的解释

offset 是什么?

Offset 是汇编语言提供的汇编伪指令,它指示变量的偏移地址(本例中 source 和destination 均为变量)。

该段程序的功能是什么?

将数据段中由 source 指示的 100 个字节数据,传送到附加段由 destination 指示的主存区。

Page 94: 寻址方式与指令系统

- 94- 目录 上页 下页 结束

( 2 )串比较 CMPS ( compare string )

将主存中的源操作数减(假减)目的操作数,以便设置标志,进而比较两操作数之间的关系。

CMPSB ; 字节串比较: DS:[SI] - ES:[DI] ,

;SI←SI±1 , DI←DI±1

CMPSW ; 字串比较: DS:[SI] - ES:[DI] ,

;SI←SI±2 , DI←DI±2

Page 95: 寻址方式与指令系统

- 95- 目录 上页 下页 结束

例:比较字符串是否相同

mov si,offset string1mov di,offset string2mov cx,countcld

again: cmpsb ; 比较两个字符jnz unmat ; 有不同字符,转移到 unmatdec cxjnz again ; 进行下一个字符的比较mov al,0 ; 字符串相等,设置 00h 标记jmp output ;转向 output

unmat: mov al,0ffh ; 设置 ffh 标记output: mov result,al ;输出结果标记

Page 96: 寻址方式与指令系统

- 96- 目录 上页 下页 结束

( 3 )串扫描 SCAS ( scan string )

将 AL/AX减(假减)目的操作数,以便设置标志,进而比较 AL/AX 与操作数之间的关系。

SCASB ; 字节串扫描: AL - ES:[DI] ,;DI←DI±1

SCASW ; 字串扫描: AX - ES:[DI] ,;DI←DI±2

Page 97: 寻址方式与指令系统

- 97- 目录 上页 下页 结束

例:查找字符串中的空格

mov di,offset stringmov al,20hmov cx,countcld

again: scasb ;搜索jz found ; 为 0 ( ZF=1 ),发现空

格dec cx ; 不是空格jnz again ;搜索下一个字符... ; 不含空格,则继续执行

found: ...

Page 98: 寻址方式与指令系统

- 98- 目录 上页 下页 结束

( 4 )串读取 LODS ( load string )

把指定主存单元的数据传送给 AL 或 AX

LODSB ; 字节串读取: AL←DS:[SI] ,;SI←SI±1

LODSW ; 字串读取: AX←DS:[SI] ,;SI←SI±2

Page 99: 寻址方式与指令系统

- 99- 目录 上页 下页 结束

( 5 )串存储 STOS ( store string )

把 AL 或 AX 数据传送至目的地址

STOSB; 字节串存储: ES:[DI]←AL ,

;DI←DI±1 STOSW ; 字串存储: ES:[DI]←AX ,

;DI←DI±2

Page 100: 寻址方式与指令系统

- 100- 目录 上页 下页 结束

例:串存储

mov ax,0mov di,0

mov cx,8000h ;cx←传送次数 ( 32×1024 )

cld ;DF=0 ,地址增加

again: stosw ;传送一个字

dec cx ;传送次数减 1 jnz again ;判断传送次数 cx 是否为 0

Page 101: 寻址方式与指令系统

- 101- 目录 上页 下页 结束

例:正负数据的分离 ——上段:

准备

mov si,offset block ; 源地址

mov di,offset dplus ; 目标地址(正)

mov bx,offset dminus ; 目标地址(负)

mov ax,dsmov es,ax ; 所有数据都在一个段中,

; 所以设置 es=dsmov cx,count ;cx← 字节数

cld

Page 102: 寻址方式与指令系统

- 102- 目录 上页 下页 结束

例:正负数据的分离 ——下段:判断

go_on: lodsb ; 从 block 取出一个数据test al,80h ;检测符号位,判断是正是负jnz minus ; 符号位为 1 ,是负数,

;转向minusstosb ; 符号位为 0 ,是正数,

; 存入 dplusjmp again ; 程序转移到 again 处继续执行

minus: xchg bx,distosb ;把负数存入 dminusxchg bx,di

again: dec cx ; 字节数减 1jnz go_on ; 完成正负数据分离

Page 103: 寻址方式与指令系统

- 103- 目录 上页 下页 结束

2. 重复前缀指令( repeat )

串操作指令执行一次,仅对数据串中的一个字节或

字量进行操作。但是串操作指令前,都可以加一个

重复前缀,实现串操作的重复执行。重复次数隐含

在 CX 寄存器中。

重复前缀分 2 类,共 3 条:

配合不影响标志的 MOVS 、 STOS (和 LODS )

指令的 REP前缀

配合影响标志的 CMPS 和 SCAS 指令的 REPZ和REPNZ前缀

Page 104: 寻址方式与指令系统

- 104- 目录 上页 下页 结束

REP 重复前缀指令

REP 前缀配合指令 MOVS/STOS/LODS 使用

REP在串未结束( CX≠0 )的情况下操作重复

具体操作: CX减 1 ,并判断 CX ,若 CX≠0 ,则操作重复。

例2.36和例2.37中,程序段的最后 3 条指令,可以分别替换为:

REP MOVSBREP STOSW

Page 105: 寻址方式与指令系统

- 105- 目录 上页 下页 结束

例 2.36 :串传送mov si,offset sourcemov di,offset destinationmov cx,100 ;cx←传送次数

cldrep movsb

again: movsb ;传送一个字节

dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0 ; 不为 0 ( ZF=0 ),则转移 again 位置

执行; ;否则,结束

Page 106: 寻址方式与指令系统

- 106- 目录 上页 下页 结束

例 2.37 :串存储

mov ax,0mov di,0mov cx,8000hcldrep stosw

again: stosw ;传送一个字

dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为

0

Page 107: 寻址方式与指令系统

- 107- 目录 上页 下页 结束

2. REPZ/REPNZ 重复前缀指令

这两个指令前缀配合指令 CMPS/SCANS 使用

REPE / REPZ在串未结束且串相等的情况下操作重复

具体操作: CX减 1 ,并判断 CX 和 ZF ,若 CX≠0且 ZF= 1 (比较相等),则操作重复。

REPNE / REPNZ在串未结束且串不等的情况下操作重复。

具体操作: CX减 1 ,并判断 CX 和 ZF ,若CX≠0 且 ZF= 0 (比较不等) ,则操作重复。

Page 108: 寻址方式与指令系统

- 108- 目录 上页 下页 结束

例:比较字符串是否相同

mov si,offset string1mov di,offset string2mov cx,countcldrepz cmpsb ; 比较两个字符(相等则重复

)jnz unmat ; 字符串不等,转移到 unmatmov al,0 ; 字符串相等,设置 00h 标记jmp output ;转向 output

unmat: mov al,0ffh ; 设置 ffh 标记output: mov result,al ;输出结果标记

Page 109: 寻址方式与指令系统

- 109- 目录 上页 下页 结束

例题的解释

退出 repz cmpsb 的条件:当出现不相等的字符( ZF=0 )或比较完所有字符( CX=0 )

退出时,如果ZF=0 ,说明最后一次比较,字符不等;

ZF=1 ,表示所有比较都相等,也就是两串相同。

Page 110: 寻址方式与指令系统

- 110- 目录 上页 下页 结束

例:查找字符串中的空格mov di,offset stringmov al,20hmov cx,countcldrepne scasb ;搜索jz found ; 为 0 ( ZF=1 ),发现空

格... ; 不含空格,则继续执行

found: ...

Page 111: 寻址方式与指令系统

- 111- 目录 上页 下页 结束

3.3.6 程序控制指令改变 IP (和 CS )值,实现程序执行顺序的改变 用于实现分支、循环、过程等程序结构

1 、无条件转移: JMP

2 、条件转移: Jcc

3 、循环: LOOP LOOPE / LOOPZ

LOOPNE / LOOPNZ

4 、子程序: CALL RET

5 、中断: INT i8 IRET INTO

利用中断指令,可以实现系统功能调用

Page 112: 寻址方式与指令系统

- 112- 目录 上页 下页 结束

要求

控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令。

重点掌握: JMP Jcc LOOP

CALL RET INT n IRET

一般了解: LOOPE / LOOPZ

LOOPNE / LOOPNZ INTO

另外,本节还要求掌握常用的 DOS 系统功能调

用(即 INT 21H )

Page 113: 寻址方式与指令系统

- 113- 目录 上页 下页 结束

(1) 无条件转移指令 JMP ( jump )

JMP label ; 程序转向 label 标号指定的地址 执行 JMP ,将使程序转移到指定的目标地址处,从那里开始执行指令。

操作数 label 是要转移的目标地址(或称目的地址、转移地址):

目标地址的寻址方式:直接寻址和间接寻址

目标地址的分布范围:段内转移和段间转移 JMP 指令分 4 种类型:

⑴段内转移、直接寻址 ⑵段内转移、间接寻址

⑶段间转移、直接寻址 ⑷段间转移、间接寻址

1. 转移指令

Page 114: 寻址方式与指令系统

- 114- 目录 上页 下页 结束

目标地址的寻址方式( JMP 指令)

直接寻址方式:

转移地址直接在指令的机器代码中,就是直接寻址。

间接寻址方式:

转移地址在寄存器或主存单元中,并通过它们来间接寻址。

Page 115: 寻址方式与指令系统

- 115- 目录 上页 下页 结束

段内转移——近转移( near jump )

在当前代码段 64KB范围内转移,不需要更改 CS段地址,只要改变 IP 偏移地址。

短转移——如果转移距离可用一个字节( -128 ~ +127 )来表示,可形成所谓的“短转移 short jump” 。

段间转移——远转移( far jump )

从当前代码段跳转到另一个代码段,需要更改 CS段地址和 IP 偏移地址。目标地址必须用一个 32 位数表达,叫做 32 位远指针,它就是逻辑地址。

目标地址的范围( JMP 指令)

Page 116: 寻址方式与指令系统

- 116- 目录 上页 下页 结束

目标地址的范围( JMP 指令)

• 实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移。

• 程序员也可以用操作符 short 、 near ptr 或 far ptr 进行强制。

Page 117: 寻址方式与指令系统

- 117- 目录 上页 下页 结束

段内转移、直接寻址 JMP label ;IP←IP+ 位移量

位移量是紧接着 JMP 指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移。

当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负。

jmp again ;转移到 again 处继续执行……

again: dec cx ; 标号 again 的指令……jmp output ;转向 output……

output: mov result,al ; 标号 output 的指令

Page 118: 寻址方式与指令系统

- 118- 目录 上页 下页 结束

段内转移、间接寻址

JMP r16/m16 ;IP←r16/m16 将一个 16 位寄存器或主存字单元内容送入 IP 寄存器,作为新的指令指针,但不修改 CS 寄存器的内容。

jmp ax ;IP←AX jmp word ptr [2000h] ;IP←[2000h]

Page 119: 寻址方式与指令系统

- 119- 目录 上页 下页 结束

段间转移、直接寻址

JMP far ptr label ;IP←label 的偏移地址

;CS←label 的段地址

将标号所在段的段地址作为新的 CS 值,标号在该段内的偏移地址作为新的 IP 值;这样,程序跳转到新的代码段执行。

jmp far ptr otherseg

;转移到位于另一个代码段的 otherseg

Page 120: 寻址方式与指令系统

- 120- 目录 上页 下页 结束

段间转移、间接寻址

JMP far ptr mem ;IP←[mem] ,;CS←[mem+2]

用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送 IP 寄存器,高位字送 CS 寄存器。

mov word ptr [bx],0 mov word ptr [bx+2],1500h

JMP far [bx] ;转移到 1500h:0h

Page 121: 寻址方式与指令系统

- 121- 目录 上页 下页 结束

(2) 条件转移指令 Jcc

Jcc label ; 条件满足,发生转移: IP←IP+ 8 位位移量

; 条件不满足,顺序执行。

指定的条件 cc 如果成立,程序转移到由标号 label 指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。

操作数 label 是采用短转移,称为相对寻址方式。

Jcc 指令不影响标志,但要利用标志位(表3.10)。据此将 17 条指令分成 以下 4 种情况:

⑴ 判断单个标志位状态 ⑵ 比较无符号数高低

⑶ 比较有符号数大小 ⑷ 判断计数器CX为0

Page 122: 寻址方式与指令系统

- 122- 目录 上页 下页 结束

相对寻址方式( Jcc )

Jcc 指令的操作数 label 是一个标号,表示目标地址。它是一个 8 位的偏移量,表示 Jcc 指令后那条指令的地址到目标指令地址的偏移量。

8 位偏移量是相对于当前 IP 的,即距当前 IP为 -128 ~+127 个单元的范围内,属于段内短距离转移。

Jcc 目标地址就采用这种相对寻址方式。

Jcc 指令本身为 2 个字节,条件不满足时将顺序执行,即当前指令偏移指针 IP 加 2 。

Page 123: 寻址方式与指令系统

- 123- 目录 上页 下页 结束

表 3-10 条件转移指令中的条件 cc

Page 124: 寻址方式与指令系统

- 124- 目录 上页 下页 结束

判断单个标志位状态的 Jcc 指令

这组指令单独判断 5 个状态标志之一。

1 、 JZ/JE 和 JNZ/JNE利用零标志 ZF ,判断结果是否为零(或相等)2 、 JS 和 JNS利用符号标志 SF ,判断结果是正是负3 、 JO 和 JNO利用溢出标志OF ,判断结果是否产生溢出4 、 JP/JPE 和 JNP/JPO利用奇偶标志 PF ,判断结果中“ 1” 的个数是偶是奇

5 、 JC/JB/JNAE 和 JNC/JNB/JAE利用进位标志 CF ,判断结果是否进位或借位

Page 125: 寻址方式与指令系统

- 125- 目录 上页 下页 结束

例: JZ 和 JNZ 指令

repz cmpsb ;重复比较两个字符

jnz unmat ;ZF= 0 (不等),转移到unmat

mov al,0 ;顺序执行(相等)jmp output

unmat: mov al,0ffhoutput: mov result,al

repz cmpsb ;重复比较两个字符jz mat ;ZF= 1 (相等),转移到 matmov al,0ffh ;顺序执行(不等)jmp output

mat: mov al,0output: mov result,al

Page 126: 寻址方式与指令系统

- 126- 目录 上页 下页 结束

例: JS 和 JNS 指令

计算 |X - Y| (绝对值), X 和 Y 为存放于 X 单元和 Y 单元的 16 位操作数,结果存入 result

mov ax,Xsub ax,Yjns nonneg ; 若 SF=0转 nonnegneg ax ;否则,用 neg 求补

nonneg: mov result,ax

Page 127: 寻址方式与指令系统

- 127- 目录 上页 下页 结束

例: JO 和 JNO 指令

计算 X - Y , X 和 Y 为存放于 X 单元和 Y 单元的16 位操作数。若溢出,则转移到 overflow 处理

mov ax,Xsub ax,Yjo overflow ; 若 OF=1转 overflow... ;否则无溢出

overflow: … ; 有溢出处理

Page 128: 寻址方式与指令系统

- 128- 目录 上页 下页 结束

例: JP 和 JNP 指令

8088/8086 的标志位 PF施行奇校验,加上校验位PF 应为奇数个“ 1” 。

AL 中存有字符的 ASCII 码( 7 位),请在其 D7 位上加上奇校验位:AL 中“ 1” 的个数原为奇数时,令 D7 为“ 0” (同 PF );

AL 中“ 1” 的个数原为偶数时,令 D7 为“ 1” (同 PF )。

and al,7fh ;最高位置“ 0” ,同时判断“ 1” 的个数

jnp next ; 若 PF=0 , “ 1” 个数为奇数,转 nextor al,80h ;否则,最高位置“ 1”

next: ...

Page 129: 寻址方式与指令系统

- 129- 目录 上页 下页 结束

例: JC 和 JNC 指令

记录 BX 中 1 的个数

xor al,alagain: test bx,0ffh ;建立标志 , 等价于 cmp bx,0

jz next ; 若 ZF=1转 nextshl bx,1jnc again ; 若 CF=0转 again inc aljmp again

next: ... ;AL 保存 1 的个数

Page 130: 寻址方式与指令系统

- 130- 目录 上页 下页 结束

比较无符号数高低的 Jcc 指令

无符号数的大小用高( Above )低( Below )表示

利用 CF确定高低、利用 ZF 标志确定相等( Equal )

两数的高低可分成 4 种关系:

低于(不高于等于): JB ( JNAE )

不低于(高于等于): JNB ( JAE )

低于等于(不高于): JBE ( JNA )

不低于等于(高于): JNBE ( JA )

Page 131: 寻址方式与指令系统

- 131- 目录 上页 下页 结束

cmp ax,bx ; 比较 ax 和 bx

jnb next ; 若 ax> bx ,转移到next

xchg ax,bx ; 若 ax< bx ,交换

next: ...

例:比较无符号数的高低

结果: AX 中保存较大的数

Page 132: 寻址方式与指令系统

- 132- 目录 上页 下页 结束

比较有符号数大小的 Jcc 指令 比较有符号数的大( Greater )小( Less ),需组合 OF 、 SF 标志,并利用 ZF 标志确定是否相等( Equal )

两数的大小分成 4 种关系:

小于(不大于等于): JL ( JNGE )

不小于(大于等于): JNL ( JGE )

小于等于(不大于): JLE ( JNG )

不小于等于(大于): JNLE ( JG )

Page 133: 寻址方式与指令系统

- 133- 目录 上页 下页 结束

cmp ax,bx ; 比较 ax 和 bx

jnl next ; 若 ax> bx ,转移到next

xchg ax,bx ; 若 ax< bx ,交换

next: ...

例:比较有符号数的大小

结果: AX 中保存较大的数

Page 134: 寻址方式与指令系统

- 134- 目录 上页 下页 结束

计数器 CX 为 0转移的 JCXZ 指令

条件转移指令中还有一条较特殊的指令JCXZ label ;CX= 0转移: IP←IP+ 8 位位移量

;CX≠0顺序执行。

因为 CX 寄存器通常在程序中用做计数器, JCXZ 指令可以用来判断计数是否为0 。

Page 135: 寻址方式与指令系统

- 135- 目录 上页 下页 结束

计数器为 0 的判断

mov cx,100again: jcxz next ;判断传送次数,为 0退出循环

movsbdec cx ;传送次数减 1

jmp againnext: ...

mov cx,100again: movsb

dec cx ;传送次数减 1jnz again ;判断传送次数是否为 0 ,不为 0

转移

Page 136: 寻址方式与指令系统

- 136- 目录 上页 下页 结束

(3)循环指令( loop )

循环指令利用 CX 计数器自动减 1 ,方便实现计数循

环的程序结构。 label 操作数采用相对寻址方式。

LOOP label ;CX←CX - 1 ,

;CX≠0 ,转标号 label 继续循环LOOPZ label ;CX←CX - 1 ,

; 若 CX≠0且 ZF= 1 ,标号 label 继续循环LOOPNZ label ;CX←CX - 1 ,

; 若 CX≠0且 ZF= 0 ,转标号 label 继续循环

操作结果为0

Page 137: 寻址方式与指令系统

- 137- 目录 上页 下页 结束

mov cx, count ; 设置循环次数mov si,offset stringxor bx,bx ;bx清 0 ,用于记录空格数mov al,20h

again: cmp al,es:[si]jnz next ;ZF=0 ,非空格,转移

inc bx ;ZF=1 ,是空格,个数加 1next: inc si

loop again ; 字符数减 1 ,不为 0 继续循环

mov result,bx ; 保存结果

例:记录字符串中的空格字符个数

Page 138: 寻址方式与指令系统

- 138- 目录 上页 下页 结束

2. 子程序调用和返回

子程序是完成特定功能的一段程序。

当主程序(调用程序)需要执行这个功能时,

采用 CALL调用指令转移到该子程序的起始处执行;

当运行完子程序功能后,

采用 RET返回指令回到主程序继续执行。

功能演示 实例说明

Page 139: 寻址方式与指令系统

- 139- 目录 上页 下页 结束

主程序与子程序

CALL label

主程序

RET

子程序

回到 CALL 指令后的指令处—— 返回地址

Page 140: 寻址方式与指令系统

- 140- 目录 上页 下页 结束

子程序调用指令 CALL类似 JMP 指令, CALL 指令可分成 4 种类型:

CALL label ; 段内调用、直接寻址

CALL r16/m16 ; 段内调用、间接寻址

CALL far ptr label ; 段间调用、直接寻址

CALL far ptr mem ; 段间调用、间接寻址

但不同于 JMP 指令, CALL 指令需要保存返回地址:

段内调用——入栈偏移地址 IP :

SP←SP - 2 , SS:[SP]←IP

段间调用——入栈偏移地址 IP 和段地址 CS :

SP←SP - 2 , SS:[SP]←IP ; SP←SP - 2 , SS:[SP]←CS

Page 141: 寻址方式与指令系统

- 141- 目录 上页 下页 结束

子程序返回指令 RET 根据段内和段间、有无参数, RET 指令分成 4 种类型:

RET ; 无参数段内返回

RET i16 ; 有参数段内返回

RET ; 无参数段间返回

RET i16 ; 有参数段间返回

RET 指令弹出 CALL 指令压入堆栈的返回地址:

段内返回——出栈偏移地址 IP :

IP←SS:[SP] , SP←SP+ 2

段间返回——出栈偏移地址 IP 和段地址 CS :

IP←SS:[SP] , SP←SP+ 2 ; CS←SS:[SP] , SP←SP+2

i16参数的作用调整堆栈指针 SP

Page 142: 寻址方式与指令系统

- 142- 目录 上页 下页 结束

返回指令 RET 的参数

RET i16 ; 有参数返回

RET 指令可以带有一个立即数 i16 ,

返回时堆栈指针 SP 将增加,即 SP←SP+i16 。

相当于一批参数出栈

这个特点使得程序可以方便地废除若干执行 CALL指令以前入栈的参数。

Page 143: 寻址方式与指令系统

- 143- 目录 上页 下页 结束

返回指令 RET 的参数

断点地址IP

向子程序传递的参

SP (返回前)

SP (返回后)

RET 5

Page 144: 寻址方式与指令系统

- 144- 目录 上页 下页 结束

; 主程序mov al,0fh ; 提供参数 ALcall htoasc ;调用子程序...

;子程序:将 AL低 4 位 (1 位 16 进制数 )转换成 ASCII码

htoasc: and al,0fh ; 只取 al 的低 4 位or al,30h ;al 高 4 位变成 3cmp al,39h ; 是 0~ 9,还是 0Ah~ 0Fhjbe htoendadd al,7 ; 是 0Ah~ 0Fh, 加上 7

htoend: ret ;子程序返回

例:主程序与子程序

Page 145: 寻址方式与指令系统

- 145- 目录 上页 下页 结束

3. 中断和中断返回指令( Interrupt )

中断指令包括 INT N软中断指令、溢出中断指令 INTO 及中断返回指令 IRET 。有关这些指令的使用格式及指令功能等,在第六章中再具体介绍。

Page 146: 寻址方式与指令系统

- 146- 目录 上页 下页 结束

3.3.7 处理器控制指令

对标志位进行设置的指令CLC STC CMCCLD STDCLI STI

对 CPU状态进行控制的指令NOP CS: SS: DS: ES:LOCK HLT ESC WAIT

Page 147: 寻址方式与指令系统

- 147- 目录 上页 下页 结束

进位标志操作指令

CLC ;复位进位标志: CF←0

STC ;置位进位标志: CF←1

CMC ; 求反进位标志: CF←~ CF

用于任意设置进位标志。

Page 148: 寻址方式与指令系统

- 148- 目录 上页 下页 结束

方向标志操作指令

CLD ;复位方向标志: DF←0

STD ;置位方向标志: DF←1

串操作指令中,需要使用。

Page 149: 寻址方式与指令系统

- 149- 目录 上页 下页 结束

中断标志操作指令

CLI ;复位中断标志: DF←0

STI ;置位中断标志: DF←1

在编写中断服务程序时,需要

控制可屏蔽中断的允许和禁止。

Page 150: 寻址方式与指令系统

- 150- 目录 上页 下页 结束

空操作指令 NOPNOP

该指令不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期。

该指令常用于程序调试。

例如:在需要预留指令空间时用 NOP填充,代码空间多余时也可以用 NOP填充,还可以用NOP实现软件延时。

事实上, NOP 和 XCHG AL,AL 的指令代码一样。

Page 151: 寻址方式与指令系统

- 151- 目录 上页 下页 结束

段超越前缀指令

CS: ; 使用代码段的数据

SS: ; 使用堆栈段的数据

DS: ; 使用数据段的数据

ES: ; 使用附加段的数据

在允许段超越的存储器操作数之前,使

用段超越前缀指令,将采用指定的段寄存器寻

址操作数。

Page 152: 寻址方式与指令系统

- 152- 目录 上页 下页 结束

封锁前缀指令

LOCK ; 总线封锁

这是一个指令前缀,可放在任何指令前。

这个前缀使得在这个指令执行时间内, 8086 处理

器的封锁输出引脚有效,即把总线封锁,使别的

控制器不能控制总线;直到该指令执行完后,总

线封锁解除。

Page 153: 寻址方式与指令系统

- 153- 目录 上页 下页 结束

暂停指令

HLT ;进入暂停状态

暂停指令使 CPU 进入暂停状态,这时 CPU 不进行任何操作。当 CPU发生复位或来自外部的中断时, CPU脱离暂停状态。

HLT 指令可用于程序中等待中断。当程序中必须等待中断时,可用 HLT ,而不必用软件死循环。然后,中断使 CPU脱离暂停状态,返回执行 HLT 的下一条指令。

Page 154: 寻址方式与指令系统

- 154- 目录 上页 下页 结束

交权指令

这条指令主要用于 CPU 与外部处理器(如协处理器 8087 )配合工作,指示协处理器完成外部操作码指定的功能。

格式:

ESC DATA , SRC 其中, DATA 是一个外部操作码( 6 位),控制协处理器完成某种指定的操作。

Page 155: 寻址方式与指令系统

- 155- 目录 上页 下页 结束

等待指令

WAIT ; 进入等待状态

8086 就是利用 WAIT 指令和测试引脚实现与8087同步运行的。

浮点指令经由 8086CPU 处理发往 8087 ,并与8086 本身的整数指令在同一个指令序列;而8087 执行浮点指令较慢,所以 8086必须与8087 保持同步。

Page 156: 寻址方式与指令系统

- 156- 目录 上页 下页 结束

第 3 章 总结 本章详细而完整地介绍了 8086 的 16 位指令系统。

应该重点掌握常用的指令,同时要熟悉一些特殊的指令、了解不常使用的指令的功能。

希望同学们进行一下总结和整理:

各种寻址方式

指令支持的操作数形式

指令对标志的影响

常见编程问题

通过整理复习,形成对指令系统的整体知识。

Page 157: 寻址方式与指令系统

- 157- 目录 上页 下页 结束

掌握 8 个 16 位通用寄存器掌握 5 个状态标志:

CF 、 ZF 、 PF 、 SF 、 OF熟悉 3 个控制标志: DF 、 TF 、 IF掌握存储空间分段的概念熟悉 4 个段寄存器和 3 种逻辑段能够采用段前缀指定数据所在的逻辑段

Page 158: 寻址方式与指令系统

- 158- 目录 上页 下页 结束

掌握操作数的寻址方式:立即数寻址

寄存器寻址方式

存储器寻址方式

熟悉 8086 汇编语言指令格式

理解操作数的表达方法

Page 159: 寻址方式与指令系统

- 159- 目录 上页 下页 结束

传送指令是最常使用的一类指令。

重点掌握: MOV PUSH POP

特别熟悉: XCHG XLAT LEA

一般了解: LAHF SAHF

PUSHF POPF

LDS LES

以后展开: IN OUT

Page 160: 寻址方式与指令系统

- 160- 目录 上页 下页 结束

算术运算指令是经常使用的一类指令

请注意算术运算指令对标志的影响

重点掌握: ADD/ADC SUB/SBB INC/DEC CMP

比较熟悉: NEG MUL/IMUL DIV/IDIV一般了解: CBW CWD认真理解: DAA DAS AAA AAS AAM AAD

Page 161: 寻址方式与指令系统

- 161- 目录 上页 下页 结束

这是一类常用的指令,都应该特别熟悉;同时,注意这些指令对标志位的影响。

逻辑运算: AND OR XOR NOT TEST

移位: SHL SHR SAR

循环移位: ROL ROR RCL RCR

Page 162: 寻址方式与指令系统

- 162- 目录 上页 下页 结束

串操作指令是 8086指令系统中比较独特的一类指令,在操作主存连续区域的数据时,特别好用、因而常用。

重点掌握: MOVS STOS LODS

CMPS SCAS REP

一般了解: REPZ/REPE REPNZ/REPNE

Page 163: 寻址方式与指令系统

- 163- 目录 上页 下页 结束

控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令。

重点掌握: JMP Jcc LOOPCALL RET INT n IRET

一般了解: LOOPZ/LOOPE LOOPNZ/LOOPNE INTO

另外,本节还要求掌握常用 DOS 系统功能调用

Page 164: 寻址方式与指令系统

- 164- 目录 上页 下页 结束

这些指令在特定的情况下,必须使用。

重点掌握: CLC STC CMC CLD STD

CS: SS: DS: ES:

特别熟悉: NOP CLI STI

一般了解: LOCK HLT ESC WAIT