第 4 章 80x86 微处理器的指令系统

104
第 4 第 80x86 第第第第第第第第

Upload: stacy

Post on 04-Jan-2016

125 views

Category:

Documents


0 download

DESCRIPTION

第 4 章 80x86 微处理器的指令系统. 本章内容 Intel 80x86 的寻址方式 Intel 80x86 指令系统. 4.1 Intel 80x86 的寻址方式. 本章主要介绍 8086/8088 的指令系统以及在指令中为取得操作数地址所使用的寻址方式。. 汇编指令:. 操作码 操作数. 操作码 :指令操作类型; 操作数 :指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX , CX ;将 CX 的内容送入 AX 中。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 4 章  80x86 微处理器的指令系统

第 4 章 80x86 微处理器的指令系统

Page 2: 第 4 章  80x86 微处理器的指令系统

本章内容 Intel 80x86 的寻址方式 Intel 80x86 指令系统

Page 3: 第 4 章  80x86 微处理器的指令系统

4.1 Intel 80x86 的寻址方式

操作码 操作数汇编指令:

操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例: MOV AX , CX ;将 CX 的内容送入 AX 中。

本章主要介绍 8086/8088 的指令系统以及在指令中为取得操作数地址所使用的寻址方式。

Page 4: 第 4 章  80x86 微处理器的指令系统

4.1 Intel 80x86 的寻址方式

寻址 根据指令内容确定操作数地址的过程,称为寻址。

有效地址 根据寻址方式计算所得到的地址叫做有效地址 EA ,也就

是段内偏移地址。有效地址还需要与相应的段基地址组合才是 20 位的物理地址,该工作由 CPU 完成。

寻址方式在两种方式下被涉及: 操作数的寻址方式和对调用或转移指令的寻址方式。

本讲只介绍对操作数的寻址 !!!

Page 5: 第 4 章  80x86 微处理器的指令系统

4.1 Intel 80x86 的寻址方式 计算机中操作数按存放的方法分为:

立即数(指令中) 寄存器数 存储器数 I/O 端口

操作数 寻址方式立即数 立即数寻址

寄存器数 寄存器寻址

串操作寻址

存储器数

直接寻址寄存器间接寻址

基址变址寻址变址寻址

端口寻址 直接寻址寄存器间接寻址

Page 6: 第 4 章  80x86 微处理器的指令系统

4.1.1 立即寻址

操作数紧跟在操作码后面,与操作码一起存放在一个代码段区域中,可以是 8 位也可以是 16 位。

例如: MOV AX , 2345H MOV AL , 80H

23H

45H

操作码AX

AH AL

23H 45H

存储器

代码段

立即数

Page 7: 第 4 章  80x86 微处理器的指令系统

4.1.2 寄存器寻址

操作数存放在指定的寄存器中,寄存器包括 8 位或16 位通用寄存器和段寄存器。可使用的 16 位寄存器: AX 、 BX 、 CX 、 DX 、 SI 、 DI 、 SP 、 BP ;其中: AX 、 BX 、 CX 、 DX 可分成两 8 位使用。

例如: MOV DS , AX MOV AL , BH

AH AL

23H 45H DS

Page 8: 第 4 章  80x86 微处理器的指令系统

4.1.3 存储器操作数寻址方式

段寄存器使用的基本约定

正常来源 其他来源 偏移地址取 指 令 CS 无 IP

堆 栈 操 作 SS 无 SP

串 操 作 源 地 址 DS CS、SS、ES SI

串操作目的地址 ES 无 DI

用BP 间 接 寻 址 SS CS、SS、ES 有效地址EA

一 般 数 据 存 取 DS CS、SS、ES 有效地址EA

操作类型段基址

Page 9: 第 4 章  80x86 微处理器的指令系统

4.1.3 存储器操作数寻址方式

任何存储单元物理地址( PA )都由两部分组成:段基址+段内偏移地址(此单元与段基址的距离)

段基值:是由某个段寄存器提供,由指令隐含给出。 段内的偏移地址又称为有效地址( EA ), EA 由三

个地址分量组合而成。 位移量 ----8/16 位二进制数;常以符号地址形式 ( 变量或

标号 ) 出现在指令中 基地址 BP---- 数据在堆栈段 ( 段寄存器 SS)

BX 变址量 SI---- 源地址

DI---- 目的地址

数据默认在数据段 (DS) ;可用段前缀指定 ( 改变 )

Page 10: 第 4 章  80x86 微处理器的指令系统

1 、直接寻址 有效地址 EA 由指令直接给出,紧跟在操作码之后。 物理地址 PA = 10H (DS) + EA

A1H

00H

30H

....

....

代码段

例如: MOV AX , [3000H]假设 (DS) =1000HPA=1000H 10H+3000H = 13000H

数据段13000H13001H

AX

AH AL

34H 12H

12H

34H

可使用段跨越前缀改变数据所在段地址。例如: MOV AX , ES :[2000H] * 适于处理单个变量

Page 11: 第 4 章  80x86 微处理器的指令系统

2 、寄存器间接寻址 操作数存放在存储器中,操作数的有效地址 EA 存

放在寄存器 BX 、 SI 、 DI 或 BP 之一中。 BX , SI , DI 操作数在数据段 (DS)

BP 操作数在堆栈段 (SS) 物理地址 = 10H (SS) + (BP)

(BX)

(SI)

(DI)

物理地址 = 10H (DS) +

Page 12: 第 4 章  80x86 微处理器的指令系统

2 、寄存器间接寻址

例如: MOV AX , [SI]假设 (DS) =3000H , (SI) =1000HPA=3000H 10H+1000H = 31000H

可以段跨越改变数据所在的段 :MOV ES:[BX] , AX 操作码

....

....

代码段

数据段31000H31001H

AX

AH AL

35H 12H

12H

35H

Page 13: 第 4 章  80x86 微处理器的指令系统

3 、变址寻址(寄存器相对寻址)

EA 是两个地址分量 ---- 基址寄存器或变址寄存器的内容与指令中给出的位移量 (8/16 位 ) 之和

隐含段地址: SI 、 DI 、 BX 为 DS ; BP 为 SS 。可用段跨越。

有效地址 EA=

(BX)

(BP)

(SI)

(DI)

+8 位

16位

位移量

Page 14: 第 4 章  80x86 微处理器的指令系统

3 、变址寻址(寄存器相对寻址)

操作码20H

00H

....

....

代码段

数据段42020H42021H

AX

AH AL

86H 12H

12H

86H

例如: MOV AX , DATA[BX] 或 MOV AX , [DATA+BX]假设 (DS)=4000H , (BX)=2000H , DATA=0020HPA=4000H 10H+2000H+0020H = 42020H

* 一个地址分量在程序执行过程中可进行修改,适于数组、字符串、表格的处理

Page 15: 第 4 章  80x86 微处理器的指令系统

4 、相对基址变址寻址

EA 是三个地址分量 ---- 基址寄存器和变址寄存器的内容与指令中给出的位移量 (8/16 位 ) 之和

有效地址 EA=

(BX)

(BP)+

(SI)

(DI)+

8 位

16 位位移量

例如: MOV AX , [BX][SI]DATA或 MOV AX , [BX+SI] DATA假设 (DS)=4000H , (BX)=2000H , (SI)=2000 , DATA=0100HPA=4000H 10H+2000H+2000H+0100H = 44100H

Page 16: 第 4 章  80x86 微处理器的指令系统

5 、基址变址寻址 若位移量为 0---- 基址变址寻址方式

有效地址 EA=(BX)

(BP)+

(SI)

(DI)基址 变址

* 因为有两个地址分量可在程序执行过程中进行修改,适用于访问二维数组。

例如: MOV AX , [BX][DI]假设 (DS)=4000H , (BX)=2000H , (DI)=2000 , PA=4000H 10H+2000H+2000H+0100H = 44100H

注意:必须是一个基址寄存器和一个变址寄存器的组合,不可同为基址寄存器( BX 、 BP )或同为变址寄存器( SI 、DI )

Page 17: 第 4 章  80x86 微处理器的指令系统

4.2 Intel 80x86 指令系统 指令:控制计算机完成指定操作的命令 指令系统:所有指令的集合 8086/8088 指令系统共包含 92 种基本指令 8086 指令按照功能分为 6 大类:

数据传送指令 14 条 算术运算指令 20 条 逻辑运算和移位指令 13 条 串操作指令 13 条 控制转移指令 28 条 处理器控制指令 12 条

Page 18: 第 4 章  80x86 微处理器的指令系统

4.2.1 数据传输指令指令类型

指令格式 指令功能 状态标志位 备注O S Z A P C

通用数据传送

MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT

传送字节或字字压入堆栈字弹出堆栈交换字节或字字节翻译

- -- - --- -- - --- -- - --. . . . . .- -- - --

源: R 、 M 、立即数 目标: R 、 M源: R 、 M目标: R ( CS 除外 ) 、 M源:通用 R 、 M 目标:通用 R 、 M

目标地址传送

LEA 目标,源LDS 目标,源LES 目标,源

装入有效地址装入数据段指针到 DS装入附加段指针到 ES

- -- - --- -- - --- -- - --

源:内存操作数 目标: 16 位通用 R源:内存操作数 目标: 16 位通用R源:内存操作数 目标: 16 位通用R

标志位传送

LAHFSAHFPUSHFPOPF

把 FR 低字节装入 AH把 AH 内 容 装 入 FR 低字节把 FR 内容压入堆栈从堆栈中弹出 FR 内容

- -- - --- · · · · ·- -- - --· · · · · ·

I/O 数据传送

IN 累加器 , 端口OUT 端 口 , 累加器

输入字节或字输出字节或字

- -- - --- -- - --

累加器: AL 或 AX端口:地址 0 ~ 255 或间址寄存器DX

说明: · 表示运算结果影响标志位, - 表示运算结果不影响标志位。

Page 19: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令通用数据传送指令包括:1.传送指令 MOV2 .数据交换指令 XCHG3 .查表转换指令 XLAT4. 堆栈操作指令 PUSH 和 POP

1. 最基本的传送指令 MOV MOV 指令是形式最简单、用得最多的指令。它可以实现 CPU 内

部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给 CPU 的内部寄存器或内存单元。

语句格式:语句格式: MOV OPD , OPS 功能:功能:将源操作数传送入目的地址,源地址内容不变。即( OP

S )→ OPD 。 对标志位的影响:对标志位的影响:无

Page 20: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令

例如:例如: MOV AL , BL MOV ES , DX MOV AX , [BX] MOV [DI] , AX MOV CX , [1000] MOV BL , 40 MOV DX , 5040 MOV WORD PTR[SI],6070

Page 21: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令注意:注意:( 1)双操作数指令不允许两个操作数同时为段寄存器或存储

器操作数 MOV seg , seg ;错误 MOV mem , mem ;错误 ( 2)立即数不能传送到段寄存器中。 MOV seg , imm ; 错误( 3)目的操作数不允许使用 CSCS 段寄存器。( 4)指令指针 IP,不能作为 MOV 指令的操作数( 5) dest 与 src 必须类型匹配,即同时是字节或字类型。( 6) MOV 指令不影响标志寄存器的值。

Page 22: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令

例:错误的例:错误的 MOV MOV 指令如下所示:指令如下所示: MOV AX , BL MOV DS , 1000H MOV [BX] , [SI] MOV ES , CS MOV CS , AX例:设例:设 BB 是已定义的字节变量,判断指令的正确性。是已定义的字节变量,判断指令的正确性。 MOV AX , B MOV AL , 0

;类型不匹配;不允许立即数送段寄存器;不允许内存操作数之间传送;不允许段寄存器之间传送; CS 不能作为目的操作数

;错误,类型不匹配;正确, MASM 可以判断出要送字节0

Page 23: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令2. 堆栈操作指令 堆栈概念堆栈概念:存储器的一段区域,按“先进后出”的原则进行存

出操作。 8086/8088 系统,堆栈位于堆栈段,其段地址由 SS指示, SP寄存器作为指针, SP内容始终指向栈顶所在存储单元。

作用作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容

语句格式语句格式:进栈 PUSH SRC操作:( SP)( SP) -2 ;(( SP ) +1 ,( SP ))( SRC )出栈 POP DST操作:( DST )(( SP) +1 ,( SP ));( SP)( SP) +2 注意:注意:( 1)以上两个指令只能对字操作( 2)不能 POP CS

Page 24: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令

例如:例如:将 16位通用寄存器 CX的内容压入堆栈,然后,弹出栈顶至 CX中已知: (SS) = 0200H , (SP) = 0008H , (CX) = 12FAH

Page 25: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令

8086/80888086/8088 系统的堆栈具有如下特点:系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点;

堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;

堆栈有两个基本操作: PUSH (进栈)和 POP (出栈)。 PUSH 操作使栈顶向低地址方向移动,而 POP操作则刚好相反;

堆栈操作只能作字操作; SS : SP 在任何时候都指向当前的栈顶。

Page 26: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令3. 交换指令 交换指令 XCHG 可以实现字节交换,也可以实现字交换。 语句格式:语句格式: XCHG DEST , SRC 功能:功能:将源操作数与目的操作数的内容互换 注意:( 1) dst 与 src 不能同时为内存单元;( 2)不能使用 CS、 IP 作为操作数。( 3)不影响标志位例如:例如:XCHG AL , BL ; AL 和 BL 之间进行字节交换  XCHG BX , CX ; BX 和 CX 之间进行字交换  XCHG [2530] , CX ; CX 中的内容和 2530 , 2531 两单元的内容交换

Page 27: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令

4. 查表指令 XLAT 是一条完成字节翻译功能的指令,它可以使累加器中

的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。

语句格式语句格式: XLAT 功能:功能:将( BX)为首地址( AL)为位移量的字节存储单元

中的数据送 AL寄存器。即( [BX+AL] )→ AL 。 使用换码指令时,要求 BX 寄存器指向表的首地址, AL的内

容为表中某一项与表格首地址之间的偏移量,指令执行时,会将 BX和 AL 中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到 AL中去。

Page 28: 第 4 章  80x86 微处理器的指令系统

(一)通用数据传输指令下图表示了换码指令的功能。 XLAT 指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为 256 字节。

Page 29: 第 4 章  80x86 微处理器的指令系统

(二)地址传送指令

1.1.取有效地址指令取有效地址指令 语句格式:语句格式: LEA OPD , OPS 功能:功能: LEA 的功能是将存储器地址送到一个寄存器,主存按源

地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。 LEA 指令格式中,要求源操作数必须为内存单元地址,目的操

作数必须为一个 16 位的通用寄存器。这条指令常用来使一个寄存器作为地址指针。

例如:例如: LEA   AX ,[ 2728] ;将 2728 单元的偏移量送 AX ,指令执行后, A

X中 为 2728   LEA   BX ,[ BP+SI] ;指令执行后, BX中的内容为 BP+SI 的值  LEA   SP ,[ 0482]  ;使堆栈指针 SP为 482

问题: LEA 指令与 MOV 指令有何区别?

这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下 3条指令: LEA 、 LDS 、 LES

Page 30: 第 4 章  80x86 微处理器的指令系统

(二)地址传送指令

LEA 指令与 MOV 指令的区别:LEA SI , BUFF 指令是将标号 BUFF 的偏移地址送入寄存器中;MOV SI , BUFF 指令是将标号 BUFF 所指存储单元的内容送入SI。

BUFF =

0

1

2

3

4

5

48

00

FE

FF

LEA SI , BUFF ;

执行后:( SI) =0002H段起始地址

MOV SI , BUFF ;

执行后:( SI) =0048H

Page 31: 第 4 章  80x86 微处理器的指令系统

(二)地址传送指令2. 将地址指针装到 DS和另一个寄存器的指令 语句格式:语句格式: LDS OPD , OPS 功能:功能: LDS 指令的功能是把 4 个字节的地址指针 ( 其中包括

一个段地址和一个偏移量 )传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到 DS中。

57H

13H

68H

24H

DS : 2480H

DS : 2481H

DS : 2482H

DS : 2483H 13 57 SI

24 68 DS

LDS SI , [2480]

例:( DS) =C000H ,( C2480H ) =1357H ,( C2482H ) =2468H

Page 32: 第 4 章  80x86 微处理器的指令系统

(二)地址传送指令

3. 将地址指针装到 ES和另一个寄存器的指令 语句格式:语句格式: LES OPD , OPS LES 指令与 LDS 指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节 )传送到 ES 段寄存器,而不是 DS段寄存器。

Page 33: 第 4 章  80x86 微处理器的指令系统

(三)标志传送指令1.读取标志指令 语句格式:语句格式: LAHF 功能:功能:将标志寄存器的低 8位送入 AH寄存器。 该指令的执行对标志位无影响。

2. 设置标志指令 SAHF 语句格式:语句格式: SAHF 功能:功能:将 AH 的内容送入标志寄存器的低 8 位,高 8 位不变。从该指令功能可看出, SAHF 为 LAHF 的逆过程。

Page 34: 第 4 章  80x86 微处理器的指令系统

(三)标志传送指令3.3. 对标志寄存器的压入堆栈指令和弹出堆栈指令对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF 指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针 SP的值减 2 ,此指令在执行时标志寄存器的值不变。

POPF 指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针 SP的值加 2。

PUSHF 和 POPF 指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。

Page 35: 第 4 章  80x86 微处理器的指令系统

(四)输入 / 输出指令

1 .输入指令 IN输入指令用来从指定的外设端口寄存器取信息送入累加器。它有四种形式:( 1)语句格式: IN AL , PORT    功能:( PORT )→ AL( 2)语句格式: IN AX , PORT   功能:( PORT )→ AX( 3)语句格式: IN AL , DX   功能:( [DX] )→ AL( 4)语句格式: IN AX , DX   功能:( [DX] )→ AX PORT 指端口号,即端口寄存器地址。

Page 36: 第 4 章  80x86 微处理器的指令系统

(四)输入 / 输出指令2. 输出指令 输出指令用来把累加器的内容送往指定的外设端口寄存器,

它有四种形式:( 1)语句格式: OUT PORT , AL    功能:( AL)→ PORT( 2)语句格式: OUT PORT , AX    功能:( AX)→ PORT( 3)语句格式: OUT DX , AL    功能:( AL)→ [DX]( 4)语句格式: OUT DX , AX    功能:( AX)→ [DX]

Page 37: 第 4 章  80x86 微处理器的指令系统

(四)输入 / 输出指令直接 IN指令(口地址只能 8 位)

IN AL , 50H IN AX , 80H

间接 IN指令(口地址是 16 位,也可 8 位) MOV DX , 0FFF2H IN AL , DX 直接 OUT 指令(口地址只能 8 位)

OUT 44H , AL OUT 70H , AX

间接 OUT 指令(口地址是 16 位,也可 8 位) MOV DX , 87FEH MOV DX , 80H MOV AL , 40H OUT DX , AL OUT DX , AL

Page 38: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令1. 加法指令 不带进位的加法 ADD

格式: ADD DEST , SRC 功能: DEST+SRC DEST 带进位的加法 ADC

格式: ADC DEST , SRC 功能: DEST+SRC+CF DEST 加 1 指令 INC

格式: INC DEST 功能: DEST+1 DEST (不影响 CF)说明:说明: SRC :立即数、通用 REG 、 M三种寻址方式, DEST :通用 REG 、 M两种寻址方式。

立即数不能做目的操作数, DEST , SRC 不能同为存储器寻址方式, 类型要一致,段寄存器不能做操作数。 这三条指令运算结果将影响状态标志位,但是 INC 指令不影响标志 CF。

Page 39: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令

例如:例如:ADD   AL , 50H   ; AL 和 50H 相加,结果放在 AL中ADD   DI , SI   ; DI 和 SI 的内容相加,结果放在 DI中 ADD [ BX+DI], AX ; BX+DI 和 BX+DI+1 两个存储单元的内容和 AX          ; 中的内容相加,结果放在 BX+DI 和 BX+DI+1 所

;指的存储单元中例如:例如: ADC   AX, SI  ; AX和 SI中的内容以及 CF 的值相加,结果放在 AX中ADC  DX,[ SI] ; SI和 SI+1 所指的存储单元的内容和 DX的内容         ;以及 CF 的值相加,结果放在 DX中

Page 40: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令例如:例如: INC   AL      ; 将 AL 中的内容加 1INC   CX         ; 将 CX 中的内容加 1  INC   BYTE PTR[ BX+DI+500] ; 将 BX+DI+500 所指的存储单元的内容加12.减法指令 不带借位减法 SUB

格式: SUB DEST , SRC ; 功能: DEST - SRC DEST 带借位减法 SBB

格式: SBB DEST , SRC ; 功能: DEST - SRC - CF DEST 减 1 指令 DEC

格式: DEC DEST ; 功能: DEST - 1 DEST 求补指令 NEG

格式: NEG DEST ; 功能: 0 - DEST DEST 比较指令 CMP

格式: CMP DEST , SRC ; 功能: DEST - SRC (只影响标志位,不回送结果,所影响的标志位见课本 65页)

Page 41: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令

例如:例如:SUB   BX , CX ; 将 BX 中的内容减去 CX 中的内容,结果放在 BX中SUB   [BP+2] , CL  ; 将 SS 段的 BP+2 所指的单元中的值减去 CL

; 中的值,结果放在 BP+2 所指的堆栈单元中SUB   AL , 20   ; AL 中的数减去 20 ,结果放在 AL中SUB   WORD PTR [DI] , 1000H ; DI 和 DI+1 所指的两单元中的数减去 1000

H , ;结果放在 DI和 DI+1 所指的单元中例如:例如:

SBB   AX , 2030H  ; 将 AX 的内容减去立即数 2030H ,并减去进位位 CF的值        

SBB   WORD PTR [DI+2] , 1000H  ; 将 DI+2 和 DI+3 所指的   ;两单元的内容减去立即数 1000H ,并减去 CF          ;的值,结果放在 DI+2 和 DI+3 所指的单元中

Page 42: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令例如:例如:DEC   AX   ;将 AX 的内容减 1 ,再送回 AX中  DEC   BL   ;将 BL 的内容减 1 ,结果送回 BL中  DEC   BYTE PTR [ DI+2] ;将 DI+2 所指的单元的内容减 1 ,结果送回此

单元例如:例如:NEG   AL  ; 将 AL 中的数取相反数,送回 AL  NEG   CX  ; 将 CX 中的数取相反数,送回 CX

例如:例如: CMP   AX , 2000H  ; 将 AX 的内容和 2000H 相比较,结果影响标志位 CMP   AL , 50H   ; 将 AL 中的数和 50H比较,结果影响标志位CMP   AX ,[ BX+DI+100] ; 将累加器和两个存储单元的数相比,

;单元地址由 BX+DI+100 和 BX+DI+101 指出CMP   DX , DI  ; 将 DX 和 DI 的内容相比

Page 43: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令3.乘法指令 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个

操作数是隐含规定的。 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为 AL或 AX 。 指令格式:

无符号数乘法 MUL SRC ;( AX ) ( AL ) *( SRC )字节乘法 ;( DX , AX ) ( AX ) *( SRC )字乘法带符号数乘法 IMUL SRC ;操作同上

进行字节运算时,目的操作数必须是累加器 AL,乘积在寄存器 AX中。 进行字运算时,目的操作数必须是累加器 AX,乘积在寄存器 DX, AX 中。

Page 44: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令

例如:例如: MOV AL , 0A3H ;( AL ) =0A3H MOV BL , 11H ;( BL ) =11H MUL BL ;( AX ) =0AD3H

• 注意:注意: 乘法指令运算结果只影响状态标志 CF、 OF 。 SRC 只能是通用 REG 或 M寻址,不能是立即数。 只能是字节乘字节或字乘字。 存储器寻址时加类型说明,如 MUL BYTE PTR [BX] , MUL WORD PTR [BX]

Page 45: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令4.除法指令 指令格式:

无符号数除法 DIV SRC 带符号数除法 IDIV SRC 在除法运算中,如果除数是 8位的,则要求被除数是 16位的;

如果除数是 16位的,则要求被除数是 32位的。

Page 46: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令注意:注意: 当除数是字节数据时,被除数必须放在 AX中;当除数是字数据时,被除数必须放在 DX, AX 中。

除法指令运算结果对状态标志无定义。 8086/8088规定 IDIV 指令运算结果余数的符号与被除数相同。 当被除数位数不够时,需扩展到所需的位数,带符号数需进行符号位扩展。

若商超出字或字节表示的范围,自动产生 0 号中断符号扩展指令:字节扩展到字 CBW ;将寄存器 AL中的符号位扩展到寄存器 AH字扩展到双字 CWD ;将寄存器 AX中的符号位扩展到寄存器 DX

7 0AL7 0AH

015 AXDX15 0

CBW

CWD

Page 47: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令5.十进制(或 BCD码)运算调整指令BCD码:用二进制编码的十进制数,又称二 --十进制数压缩的 BCD码:用 4位二进制数表示 1位十进制数例: (59)10 = (0101 1001)BCD

非压缩的 BCD码:用 8位二进制数表示 1位十进制数例: (59)10 = (0000 0101 0000 1001)BCD

19 压缩 BCD: 0001 1001 + 08 + 0000 1000

27 0010 0001 + 110

(0010 0111)BCD AF=1

问题的提出:问题的提出:

Page 48: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令( 1)压缩 BCD码十进制调整指令加法十进制调整指令 DAA ( Decimal Adjust Addition)功能:用于对两个压缩型 BCD码相加之后的和(和必须放在AL中)进行调整,从而得到正确的压缩型 BCD码。

注意注意 :: * 隐含的操作寄存器为 AL* 紧接在加法指令之后使用* 影响除 OF外的其余 5 个标志位

调整方法:•若 (AL) 低 4位 >9或 AF=1 ,则 (AL)+06H→(AL) ,并使 AF=1•若 (AL)高 4 位 >9或 CF=1 ,则 (AL)+60H→(AL) ,并使 CF=1

Page 49: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令

减法十进制调整指令 DAS功能:用于对两个压缩型 BCD码相减之后的结果(和必须放在 AL中)进行调整,从而得到正确的压缩型 BCD码。调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。

例:进行例:进行 BCDBCD 码加法运算码加法运算 59+68=12759+68=127MOV AL , 59HMOV BL , 68HADD AL , BLDAA

加法运算结果为 C1,AF=1 ,高 4 位大于 9

加 66H 进行压缩 BCD调整, AF=1 , CF=1

0101 1001 59+ ) 0110 1000 68 1100 0001 C1+ ) 0110 0110 66 10010 0111 127

Page 50: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令( 2)非压缩 BCD码十进制调整指令加法十进制调整 AAA功能:对两个非压缩 BCD码相加之后的和(和必须放在 AL中)进行调整

注意注意 : : * 隐含的操作寄存器为 AL* 紧接在加法指令之后使用* 只影响 AF和 CF 两个状态标志位

调整方法:•若 (AL) 低 4位 >9或 AF=1 ,则 (AL)+06H→(AL) , (AH)+1 ,并使 AF=1 ;•屏蔽掉 (AL)高 4 位,即 (AL)←(AL)∧0FH ;•CF←AF

Page 51: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令

减法十进制调整 AAS功能:对两个非压缩 BCD码相减之后的结果(必须放在 AL中)进行调整调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。

例例 :: 9+4=?MOV AL , 09HMOV BL , 04HADD AL , BLAAA

0000 1001+ ) 0000 0100 0000 1101 ;低 4 位 >9 ,加 06H 调整+ ) 0000 0110 0001 0011 ; (AH)←(AH)+1 , AF=1 ; (AL)←(AL)∧0FH , CF←AF

Page 52: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令乘法十进制调整 AAM功能:对 AL中非压缩 BCD乘法结果调整,调整结果存于 AX中。调整方法:(AL)/0AH, (AH)←商, (AL)←余数此操作就是对 AL取模 10 的运算注意注意 ::* 隐含的操作寄存器为 AL和 AH* AAM跟在 MUL 指令之后使用* 只影响 PF、 ZF 和 SF三个状态标志位例:例: AH=06H AL=07HAH=06H AL=07HMUL AH ;相乘结果 =002AH→(AX)AAM ; (AL)/0AH 商 =04H→(AH) ,余数 =02H→(AL)

Page 53: 第 4 章  80x86 微处理器的指令系统

4.2.2 算术运算指令除法十进制调整 AAD功能:两个非压缩 BCD 数相除前,对被除数进行十进制除法调整。调整方法:(AL)←(AH)×0AH+ (AL) , AH←0注意注意 ::* 隐含的操作寄存器为 AL和 AH* AAD要在 DIV 指令之前使用* 只影响 PF、 ZF 和 SF三个状态标志位例:被除数例:被除数 AX=00000110 00000010=62AX=00000110 00000010=62BCDBCD 除数除数 BL=00001000=0BL=00001000=088BCDBCD

MOV AX , 0602HAAD ; 00000110×1010 + 00000010=00111110→(AL) , 0→(AH)DIV BL ; AX/BL=00000000 00111110÷00001000 ;商 07BCD→(AL) ,余数 06BCD→(AH)

Page 54: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令

逻辑运算指令可以对 8 位或 16 位的寄存器、存储器内容进行按位操作。

分三类:一般逻辑运算、移位和循环指令。

Page 55: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令1.逻辑运算指令( 1)逻辑“与”指令 AND格式: AND DST, SRC ; (DST)(DST)∧(SRC)功能:完成原操作数和目的操作数按位“与”操作注意注意 :: * 源操作数可以是寄存器、存储器和立即数* 目的操作数只能是寄存器和存储器操作数* 影响 PF 、 SF 和 ZF ,对 AF未定义, CF、 OF清 0

用途:对目的操作数的某些位清 0 ,即屏蔽某些位如:如: AND AL, 0FH ; 屏蔽 AL高 4 位, 0FH 是屏蔽字 AND AX, AX ;AX 不变,将 CF和 OF清 0

Page 56: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令( 2)逻辑“或”指令 OR格式: OR DST, SRC ; (DST)(DST)∨(SRC)功能:完成原操作数和目的操作数按位“或”操作

注意注意 :: * 源操作数可以是寄存器、存储器和立即数* 目的操作数只能是寄存器和存储器操作数* 影响 PF 、 SF 和 ZF ,对 AF未定义, CF、 OF清 0

用途:保持源操作数的某些位不变,而将其他的位置“ 1”如:如: OR AL, 20H ; 置 D5=1 OR AX, 00FFH ;令 AL=FFH

Page 57: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令( 3)逻辑“非”指令 NOT格式: NOT OPR ; (OPR)(OPR)功能:对操作数按位求反注意注意 :: * 操作数可以是寄存器、存储器,不能是立即数* 对标志位无影响如:如: NOT AX ;将 AL内容按位取反→ AL

( 4)逻辑“异或”指令 XOR格式: XOR DST, SRC ; (DST)(DST)(SRC)功能:完成原操作数和目的操作数按位“或”操作用途:检测对应位是 1还是 0。常用操作数自身异或,使操作数清 0 。

Page 58: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令( 5)测试指令 TEST格式: TEST DST, SRC ; (DST)∧(SRC)功能:完成原操作数和目的操作数按位“与”操作,结果反映在标志位上,但并不送回。注意注意 : : * 测试结果不改变原操作数的值* 对标志寄存器的影响同 AND用途:测试 8 位或 16 位操作数中的任何一位如:如: TEST AL, 01H ;AL∧01H ,若 D1=0 ,则 ZF=1 JNZ THERE ;ZF=1 则转移 ……THERE: ……

Page 59: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令例:例:从 4000H开始的单元中存放 32个有符号数,要求统计负数的个数,并将结果存入 BUFFER 单元。分析:用 SI指向表的首地址, CX作计数器, DX作负数个数计数器。然后用 TEST命令对每一个存储单元的符号位进行测试, D7=1 则该数为负数。主程序: XOR DX, DX ;MOV DX, 0 MOV SI, 4000H MOV CX, 32AGAIN: MOV AL, [SI] ;AL←操作数,操作数地址 (DS)×10H + (SI) INC SI TEST AL, 80H ; 测试符号位 D7 JZ NEXT ;为 0转移到 NEXT ,否则顺序执行 INC DXNEXT: LOOP AGAIN ; CX←CX- 1,CX 不为 0转移到 AGAIN MOV BUFFER, DX

Page 60: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令2.非循环移位指令算术左移 SAL OPR , CNL算术右移 SAR OPR , CNT逻辑左移 SHL OPR , CNL逻辑右移 SHR OPR , CNL其中: OPR 可为寄存器或存储器操作数, CNT 可以为 1或 CL( CL 先赋值移位次数),表示移位次数。说明说明 :: * 右移 /左移相当于减半 /增倍。显然,逻辑右移 /左移对无符号数减半 /增倍;算术右移 /左移对有符号数减半 /增倍。* 移位后若符号位改变,则 OF=1 ,若不改变,则 OF=0 。* 影响 CF 、 OF 、 PF 、 SF 和 ZF ,对 AF未定义。

CF

CF 0

0 CF

Page 61: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令例:例:已知 AL=X ,求 X*10MOV AH, 0 ; AL扩展为字,无符号数SAL AX, 1 ; 2XMOV BX, AX ;移至 BX中暂存SAL AX, 1 ; 4XSAL AX, 1 ; 8XADD AX, BX ; 8X+2X例:例:将 AL中的压缩 BCD码转换为 ASCII码MOV AH, AL ;压缩 BCD码 ALAND AL, 0FH ;析取低 4位OR AL, 30H ;低位 ASCII码在 AL中MOV CL, 4 ;SHR AH, CL ;OR AH, 30H ;高位 ASCII码在 AH中

Page 62: 第 4 章  80x86 微处理器的指令系统

4.2.3 逻辑运算和移位指令3.循环移位指令

循环左移 ROL OPR , CNT

循环右移 ROR OPR , CNT

带进位循环左移 RCL OPR , CNT

带进位循环右移 RCR OPR , CNT

说明说明 :: * 只影响 CF和 OF

CF

CF

CF

CF

其中: OPR 可为寄存器或存储器操作数, CNT 可以为 1或 CL( CL 先赋值移位次数),表示移位次数。

Page 63: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令串操作指令有 5种:传送、比较、扫描、装入、存储串操作的特点1) SI寻址源操作数,段地址在 DS; DI寻址目的操作数,段地址在 ES; CX 存放串长度。2)每次操作后, SI、 DI自动修改: DF=0 , SI 、 DI 加 1或( +2), DF=1 , SI 、 DI减 1 或( -2 )。3)通过重复前缀实现串操作重复前缀* REP :无条件重复(重复执行指令规定的操作,直到 CX= 0)* REPE :相等时重复( ZF = 1,且 CX≠0 时重复)* REPZ:结果为零时重复( ZF = 1,且 CX≠0 时重复)* REPNZ:不相等时重复( ZF = 0,且 CX≠0 时重复)* REPZ:结果不为零时重复( ZF = 0,且 CX≠0 时重复)

Page 64: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令1 、串传送指令: MOVSB/MOVSW执行操作: [(ES:DI)] [(DS:SI)] SI SI±1(±2) , DI DI±1(±2)功能:在存储单元之间传送数据

例 : 将 100 个字节,从地址为 AR1 单元传送到地址为 AR2单元区。

LEA SI, AR1 ; SI 指向源串地址LEA DI, AR2 ; DI 指向目的串地址MOV CX, 100 ;置计数器CLD ;设置方向标志 REP MOVSB;将源地址的 100 个字节传

;送到目的地址单元

Page 65: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令2 、串比较指令: CMPSB/CMPSW执行操作: [(ES:DI)] - [(DS:SI)] 结果影响标志位: AF、 CF、 OF、 PF、 SF,ZF SI SI±1(±2) , DI DI±1(±2)功能:比较两个串是否相同例 : 比较两个字符串是否相同,并找出其中第一个不相等字符的地址,将该地址送 BX ,不相等的字符送 AL ,两个字符串的长度均 200 个字节, M1 为源串首地址, M2 为目的串首地址。

Page 66: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令程序段:

LEA SI, M1; (SI)←源首地址LEA DI, M2 ; (DI)←目的串首地址MOV CX, 200 ; (CX)←串长度CLD ; (DF)=0 ,地址按增量方向修改

REPE CMPSB ;若相等,且 (CX)≠0则重复比较

AND CX, 0FFH ;检查 (CX) 是否等于零JZ STOP ; (CX)=0则转 STOPDEC SI ;否则 (SI)-1 ,指向不相单元MOV BX, SI ; (BX)←不相等单元的地址 MOV AL, [SI] ; (AX)←不相等单元的内容

STOP: HLT ;停止

Page 67: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令

例 : 在一个目的串 string中查找关键字‘ A’,串长度为10 。

LEA SI, STRING ;置目标串偏移地址MOV CX, 10 ;置字符串长度MOV AL, ‘A’ ;置关键字节CLD ;置方向标志 REPNE SCASB ;搜索关键字节

3 、串扫描指令: SCASB/SCASW执行操作: [(ES:DI)] - AL/AX DI DI±1(±2)功能:从一个字串中查找一个与 AL 或 AX 中不同的字符,或寻找一个相同的字符。

Page 68: 第 4 章  80x86 微处理器的指令系统

4.2.4 串操作指令4 、串装入指令: LODSB/LODSW执行操作: AL/AX [(DS:SI)] SI SI±1(±2)功能:将位于 DS 段由 SI 指出的内存单元的字节或字的内容取到 AL 或 AX 中。

5 、串存储指令: STOSB/STOSW执行操作: [(ES:DI)] AL/AX DI DI±1(±2)功能:将 AL 或 AX 中的字节或字的内容存入位于 ES 段由 DI 指出的内存单元中。

Page 69: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

无条件转移指令 条件转移指令 循环控制指令 过程调用和返回指令 中断调用和返回指令

* 不影响条件标志位

Page 70: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令1 、无条件转移指令 JMP ( jumps)本指令无条件转移到指定的内存地址,执行从该地址开始的程序段。无断点,无返回,无堆栈操作。分为:段内转移(段内直接转移、段内间接转移)

段间转移(段间直接转移、段间间接转移)

段内转移是指在同一段的范围之内进行转移,此时只需改变IP 寄存器的内容,即用新的转移目标地址代替原有的 IP 的值就可达到转移的目的。 段间转移则是要转到另一个段去执行程序,此时不仅要修改IP 寄存器的内容,还需要修改 CS 寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。

Page 71: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

( 1 )段内直接转移指令格式: JMP SHORT LABLE ;短转移, IP=IP+8 位位移量 JMP NEAR LABLE ;近转移, IP=IP+16 位位移量 JMP LABLE ; NEAR可省略说明说明 ::* LABLE 是一个标号,也称为符号地址,它表示转移的目标地址。* 位移量是汇编程序在汇编源程序时,根据目标地址与 JMP指令的下一条指令之间的距离自动生成的。 * 若位移量为 8 位,称为段内直接短转移,范围是 -128 ~ +127* 若位移量为 16 位,称为段内直接近转移,范围是 -32768 ~ +32767

Page 72: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

例例 11 : : JMP 2500H ;转移到当前代码段的 2500H

例例 2:2: MOV AX, BXJMP SHORT NEXT ; NEXT 段内标号,短转移AND CL, OF ……

NEXT:OR CL, 7F

从 AND 指令到 NEXT 之间的距离就是相对位移量, JMP 转移的地址 IP=当前 (IP)+ 位移量

Page 73: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

( 2 )段内间接转移指令格式: JMP OPRD功能:将指定的 16 位寄存器或存储器相邻两个单元的内容送给 IP ,然后转移到 CS:IP 指示的地址。说明说明 :: * 可采用各种寻址方式

例: 例: JMP BX ; (IP)←(BX) JMP WORD PTR [BX] ;将 [BX] 和 [BX+1]

;两个单元的内容送入 IP

Page 74: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

( 3 )段间直接转移指令格式: JMP FAR LABLE功能:将指令操作码后连续两个字作为立即数,用来修改 CS:IP 内容(低字送入 IP ,高字送入 CS ),然后转移到 CS:IP 指示的地址。

例: 例: JMP 8000H:1200H ; (IP)←1200H , (CS)←8000H JMP FAR PTR NEXT ;远程转移到 NEXT

Page 75: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 4 )段间间接转移指令格式: JMP OPRD功能:将指定的 32 位存储器连续两个字作为地址,低字送入 IP ,高字送入 CS ,然后转移到 CS:IP 指示的地址。说明说明 :: * 可采用各种寻址方式例:例:设 (DS)=0B000H , (BX)=2000H , (SI)=1000H JMP DWORD PTR [BX+SI]

8000HCS

B3000HB3001HB3002HB3003H

20H

00H

80H

00H

2000HIP

Page 76: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令2 、条件转移指令格式: JX OPRD功能: J是转移, X 是转移的条件, OPRD 是短目标地址。当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。说明说明 :: * 状态标志( CF、 PF、 ZF、 SF和 OF)作为转移的条件* 所有条件转移指令都是直接寻址方式的短转移,即只能在以当前 IP 为中心的 -128 ~ +127字节范围内转移。提示提示 :: G( Greater ):大于, L ( Less):小于E ( Equal ):等于, N( No):不A ( Above ):高于, B ( Below):低于

Page 77: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 1 )根据单个条件标志的设置情况转移:

格式 测试条件     JZ(JE) OPR ZF=1JNZ(JNE) OPR ZF=0JS OPR SF=1JNS OPR SF=0JO OPR OF=1JNO OPR OF=0JP(JPE) OPR PF=1JNP(JPO) OPR PF=0JC OPR CF=1JNC OPR CF=0

* 适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况

Page 78: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

( 2 )比较两个无符号数,并根据比较结果转移:格式 测试条件 功能     JB(JNAE) OPR CF=1 A<BJNB(JAE) OPR CF=0 A≥B JA(JNBE) OPR CF=0且ZF=0 A>B JNA(JBE) OPR CF=1 或 ZF=1 A≤B

* 适用于地址或双精度数低位字的比较

Page 79: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

( 3 )比较两个带符号数,并根据比较结果转移:格式 测试条件JL(JNGE) OPR SFOF=1 A<BJNL(JGE) OPR SFOF=0 A≥BJG(JNLE) OPR (SFOF)=0且ZF=0 A>BJNG(JLE) OPR (SFOF)=1 或 ZF=1 A≤B* 适用于带符号数的比较

( 4 )测试 CX 的值为 0则转移:格式 测试条件JCXZ OPR (CX)=0

Page 80: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

例:例:在以 DATA 为首地址的内存中存放 200 个 16 位的带符号数,试找出其中最大和最小的符号数,分别存放在 MAX和 MIN中。分析:可先取出表中一个数作为标准,分别存放在 MAX 和MIN中,然后顺序取出其他的数分别与 MAX 和 MIN进行比较,大于则取代 MAX ,小于则取代 MIN,直到 200 个 16 位数都比较完。关键指令:用 CMP AX, MAX 和 CMP AX, MIN 有符号数条件转移指令 JG LABLE ;AX>MAX则转移到标号处 JL LABLE ;AX<MIN则转移到标号处

Page 81: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令程序段: LEA SI, DATA ;(SI)←数据串首地址

MOV CX, 200 ;(CX)←串长度CLD ;(DF)=0 ,地址按增量方向修改 LODSW ;AX [(DS:SI)] , SI SI+2MOV MAX, AXMOV MIN, AXDEC CX

NEXT: LODSWCMP AX, MAX ;串比较,结果影响标志位JG LARGERCMP AX, MINJL SMALLJMP GOOD

LARGER: MOV MAX, AXJMP GOOD

SMALL: MOV MIN, AXGOOD: LOOP NEXT ; CX CX-1 ,若 CX≠0则转移到标号处

HLT

Page 82: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令3 、循环控制指令( 1 ) LOOP 循环指令 格式: LOOP OPRD 测试条件:( CX )≠ 0( 2 ) LOOPZ/LOOPE ( Loop while zero or equal )当为零或相等时循环指令 格式: LOOPZ(或 LOOPE ) OPRD 测试条件:( CX )≠ 0且ZF=1( 3 ) LOOPNZ/LOOPNE ( Loop while nonzero, or not equal )当不为零或不相等时循环指令 格式: LOOPNZ(或 LOOPNE ) OPRD 测试条件:( CX )≠ 0且ZF=0

* OPRD 一般为要转移的目标地址的符号地址。

Page 83: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令执行步骤:( 1 ) (CX)←(CX)- 1 ( 2 )检查是否满足测试条件,如满足则指令转到目标操作数指定的标号执行,否则退出循环。

注意注意 :: * CX 中存放循环次数。* 控制转移的目标地址是以当前 IP 的内容为中心的 -128 ~ +127的范围内。* 不影响标志位。

DEC CX JNZ AGAIN

    LOOP AGAIN

Page 84: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令例:例:统计 BUFER起始地址的 100 个单元中负数的个数,将统计结果送 NUM 单元。程序段:

XOR BL, BL ;BL←0LEA SI, BUFFER ;数据首地址MOV CX, 100 ;数据长度CLD ;地址按增量方向修改

NEXT:LODSB ; AL[(DS:SI)] , SISI+1TEST AL, 80H ;符号位 =1?JZ GOOD ;AL 的 D7=0则转移INC BL ;D7=1 ,负数计数器加 1

GOOD:LOOP NEXT;CX←CX-1 , CX≠0继续MOV NUM, BL

Page 85: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

例:例:在多重循环的程序结构中, CX 计数器的保存和恢复

MOV CX, M

AGAIN: …… PUSH CX MOV CX, NNEXT: …… LOOP NEXT …… POP CX LOOP AGAIN

MOV DI, M

AGAIN: …… MOV CX, NNEXT: …… LOOP NEXT …… DEC DI JNZ AGAIN

Page 86: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

在编写程序过程中,将反复使用的模块独立出来编成子程序,主程序在需要的时候进行调用,执行完子程序又再返回到主程序继续执行。调用指令: CALL返回指令: RET

CALL 指令分段内调用和段间调用:段内调用:子程序名中包含 NEAR段间调用:子程序名中包含 FAR以上两种调用可以直接寻址也可以间接寻址。

4 、子程序调用和返回指令

Page 87: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

段内调用和返回 段间调用和返回

code1 segment main proc far …… call far ptr sub …… ret main endpcode1 ends

code2 segment sub proc far …… ret sub endpcode2 ends

code segment

code ends

main proc far …… call sub …… retmain endp

sub proc near …… retsub endp

Page 88: 第 4 章  80x86 微处理器的指令系统

75

4.2.5 程序控制指令实验四程序段:实验四程序段:INPT: MOV AH,01H ; 从键盘接收一个输入数据 INT 21H CMP AL,51H ;与大写的 Q比较 JZ EXIT ; 结果为零退出程序 JNZ INPT ; 结果不为零重新输入数据 ……EXIT: MOV AH,4CH INT 21H

0013H

0015H

0034H

0035H

B4

4C

……

1F

74JZ EXIT

MOV AH,4CH

符号地址

位移量

Page 89: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

000BH

000EH

0051H

0052H

005BH

CALL DISPL

MOV AH,02

符号地址

RET

……

B4

02

00

43

……

EB

C3

EB

位移量实验三程序段:实验三程序段:MOV SI, OFFSET DATA1MOV BX,05CALL DISPL ;调用显示子程序CALL CRLF ;调用显示回车换行子程序……DISPL PROC NEAR ; 显示子程序DSL: MOV AH,02 MOV DL,[SI+BX-1] INT 21H DEC BX JNZ DSL RET DISPL ENDP

Page 90: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 1 )段内直接调用: CALL NEAR PROC

例:例:假设 CS=2000H ,当前 IP=000BH , SP=0100H ,位移量为 0043HCALL DISPL ; DISPL 是一个地址标号

执行操作:* 返回地址入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(IP)+16 位位移量

具体执行操作:* (SP)←(SP)-2 即 SP=0010H-2=00FEH* 返回 IP 入栈 即 (00FFH,00FEH)←(000BH+3)* 转程序入口 偏移地址为: IP=(000BH+3)+0043H

=0051H

Page 91: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 2 )段内间接调用: CALL OPRD执行操作:* 返回地址入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(EA)

例:例:假设 CS=1000H , BX=0200H , SI=0300H , (10500H)=3210HCALL BXCALL WORD PTR[BX+SI]

第一条指令入口偏移地址为: 0200H第二条指令入口偏移地址为: IP=(DS*16+BX+SI) =(10000H+0200H+0300H) =(10500H)=3210H

Page 92: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 3 )段间直接调用: CALL FAR PROC执行操作:* 返回 CS 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(CS)* 返回 IP 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←子程序偏移地址 (CS)←子程序段地址

Page 93: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

例:例:假设 CS=1000H ,当前 IP=205AH , SS=2500H ,当前SP=0050H ,标号 NEXT 所在单元的地址指针 CS=3000H , IP=0500HCALL FAR PTR NEXT

具体执行操作* (SP)←(SP)-2 即 SP=0050H-2=004EH* 返回 CS 入栈 即 CS=1000H 入栈* (SP)←(SP)-2 即 SP=004EH-2=004CH* 返回 IP 入栈 即 IP=205AH+5=205FH 入栈* 转程序入口 将 NEXT 的段地地址和偏移地址送 CS:IP

即 CS←3000H , IP← 0500H

Page 94: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 4 )段间间接调用: CALL OPRD执行操作:* 返回 CS 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(CS)* 返回 IP 入栈: (SP)←(SP)-2 , ((SP)+1,(SP))←(IP)* 转子程序: (IP)←(EA) (CS)←(EA+2)

例:例:假设 DS=1000H , BX=0200H , (10200H)=31F4H , (10202H)=5200HCALL DWORD PTR [BX]

入口偏移地址为: IP=(DS*16+BX)=(10200H)=31F4H入口段地址为: IP=(DS*16+BX+2)=(10202H)=5200H

Page 95: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 5 )段内返回: RET执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2

段内带立即数返回: RET EXP

( 6 )段间返回: RET执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+2

段间带立即数返回: RET EXP

Page 96: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令

中断概念

计算机暂时中止正在运行的程序,转去处理一组专门的服务程序,完毕又返回到原被中止的程序继续执行,这样的过程称为中断。

外部中断也叫硬中断:主要用来处理外设和 CPU 之间的通迅。

内部中断也叫软中断:主要用来处理类似除数为零或中断指令所引起的中断。

3 、中断调用和返回指令

Page 97: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令 类型 0 的 (IP)

类型 0 的 (CS)

类型 1 的 (IP)

类型 1 的 (CS)

类型 N 的 (IP)

类型 N 的 (CS)

类型 255 的 (IP) 类型 255 的 (CS)

00000

00004

4*N

003FC

* 8086/8088CPU 有 256 个中断,中断编号从 0 到 0FFH 。* 每个被使用中断都有对应的中断服务程序,程序的入口地址存放于中断向量表。* 每个中断服务程序的入口地址占 4个字节, 256 个共占 1024 个字节。* 给定一个中断号,即可根据下式计算其对应服务程序入口地址在中断向量表中的偏移地址: 偏移地址= n×4

Page 98: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令( 1 )中断指令 : INT n ; n=0~255

①标志寄存器入栈; ②清标志位 TF、 IF; ③CS 、 IP 值入栈; ④计算中断向量地址: n 4

低地址单元→ IP 高地址单元→ CS( 2 )专用中断 : 除错误中断(类型 0 ),单步中断(类型 1 ),不可屏蔽中断(类型 2 ),断点中断(类型 3 ),溢出中断(类型4 )

( 3 )中断返回 :IRET

Page 99: 第 4 章  80x86 微处理器的指令系统

4.2.5 程序控制指令例:例: INT 21H ; DOS 功能调用操作结果: 1 )标志寄存器入栈, 2 )清 TF 、 IF

3 ) CS 、 IP 入栈 4 )计算中断向量存放地址: 21H 4= 84 H

84H

85H

86H

87H

IP 2000H

CS 3000H

00

20

00

30

Page 100: 第 4 章  80x86 微处理器的指令系统

4.2.6 处理器控制指令

标志处理指令: CLC ( Clear carry ) CF←0 CMC ( Complement carry ) CF←CF STC ( Set carry ) CF←1

CLD ( Clear direction ) DF←0 STD ( Set direction ) DF←1

CLI ( Clear interrupt ) IF←0 STI ( Set interrupt ) IF←1

注意:只影响本指令指定的标志

Page 101: 第 4 章  80x86 微处理器的指令系统

4.2.6 处理器控制指令

其他处理机控制指令: HLT 处理器暂停指令功能:执行该指令 CPU 处于暂停状态,不做任何操作,不影响标志位。在以下情况才能脱离暂停:①在 CPU 的 RESET线上有复位信号。②在 NMI线上有非屏蔽请求信号。③在 INTR线上有可屏蔽中断请求信号。NOP 空操作指令功能:该指令的执行不产生任何的结果,仅消耗 3 个时钟周期的时间,常用来延时。

Page 102: 第 4 章  80x86 微处理器的指令系统

4.2.6 处理器控制指令

WAIT 等待 (等待外中断,之后仍继续等待 )ESC mem 换码 ( (mem) 数据总线 )LOCK 封锁 (维持总线的锁存信号,直到其后的指令执行完 )

注意 : 不影响条件标志

Page 103: 第 4 章  80x86 微处理器的指令系统

课堂习题及答案指令 错误原因

(1) INC [SI] 目的操作数 [SI]类型不明确(2) MOV AX,BL 源操作数和目的操作数类型不一致(3) MOV 2,AX 常数不能作目的操作数(4) MOV AX,[DX] DX不能作地址寄存器(5) MOV AX,[BX+BP] 源操作数寻址方式错 ,两个寄存器都是基址寄存器

(6) MOV AX,[SI+DI] 源操作数寻址方式错 ,两个寄存器都是变址寄存器

(7) MOV AH,300 300超出 AH允许范围(8) MOV [SI],[DI] 源操作数和目的操作数不能同时为内存单元地址

(9) PUSH AL 入栈的数据必须是一个 16或 32位数据(10) POP DH 出栈的数据是一个 16或 32位数据 ,DH是 8位寄存器(11) MOV CS,AX CS值不能由程序员编程该变(12) MOV SS,AX SS值不能由程序员编程该变(13) SHL AX,3 移位次数大于 1,应先将移位次数送 CL

Page 104: 第 4 章  80x86 微处理器的指令系统

课堂习题及答案比较下列两条指令 ,指出它们的区别假设假设 AX=0002HAX=0002H ,, DS=2000HDS=2000H ,, SI=1000HSI=1000H ,, (21000)=00(21000)=0036H36HMOV AX,[SI] ;将内存单元 DS:[SI] 中的内容读到寄存器 AX 中执行后 AX=(21000H)=0036H MOV [SI],AX ;将寄存器 AX 中的内容写入内存单元 DS:[SI]执行后 (21000H)=0002H

MOV AX,[SI] ;将内存单元 DS:[SI] 中的内容读到寄存器 AX 中执行后 AX=(21000H)=0036H LEA AX,[SI] ;将内存单元 DS:[SI] 的偏移地址送到 AX执行后 AX=1000H