kl800.com省心范文网

第3章 8086 8088指令系统


微 机 原 理 及 应 用
∨∨

∧∧

第3章 8086/8088指令系统
? 指令是计算机能够识别和执行的指挥计算机

操作的命令。 ? 指令系统是该计算机所有指令的集合,它是 综合反映计算机性能的重要因素,不仅直接 影响机器的硬件结构,还影响机器的系统软 件及机器的适用范围。 ? 一般,计算机的CPU不同,其使用的指令系统 就不同。
3-1

微 机 原 理 及 应 用
∨∨

∧∧

8086/8088指令系统的特点
指令系统的 兼容性
指令格式的 灵活性

可构成多 处理机系统

特点

寻址方式的 多样性

多类型 数据处理
3-2

微 机 原 理 及 应 用
∨∨

∧∧

3.1 指令格式与寻址方式
?

3.1.1 指令格式
?

?

操作码:指示计算机执行具体的 操作,如加、减、移位、比较等。 操作数:用来指出操作码所需操 作数的来源和操作结果的动向, 即给出操作数和操作数地址。
一条指令可包括一个或两个操作数。 ? 保持原值不变的称为源操作数 src(source),不保留原值而将处理结 果存入其中的则称为目的操作数 dst(destination)。
?

操作码 操作数

MOV AX, BX 操作码 操作数

3-3

微 机 原 理 及 应 用
∨∨

∧∧

3.1.2 寻址方式
? 包括:操作数的寻址方式和指令的寻址方式。
? 指令通常顺序存放,因此,指令寻址只要通

过对指令指针IP内容自动加1,便可形成下一 条指令地址。 ? 当遇到转移或调用指令时,按照转移目标修 改IP或CS,因此,指令的寻址主要是转移指 令和调用指令的转移目的地址的形成方式, 这里先讨论操作数的寻址方式
3-4

微 机 原 理 及 应 用
∨∨

∧∧

操作数是指令的操作对象。8086/8088指令系统中的

操作数存在形式有4种:
? 立即数操作数:出现在指令中的常数。

? 寄存器操作数:指令中给出寄存器的符号,操作数在寄存器
中。 ? 存储器操作数:指令中给出存储器的地址形式,操作数在存 储器中。 ? I/O操作数:指令中要操作的数来自或送到I/O端口。
3-5

微 机 原 理 及 应 用
∨∨

∧∧

8086/8088的操作数寻址方式
? 1、隐含寻址
? 指令中不指明操作数,但隐含在操作码中。如:

①乘法,其指令开工是单操作数指令(MUL src), 只指示了源操作数src;另一操作数隐含为AL或 AX。同样其乘积的存放地址也是隐含为AX或 AX、DX。 ②进栈、出栈指令(PUSH src,POP dst),另一个操 作数地址也是固定的即椎栈栈顶。隐含寻址的指 令,不需要计算有效地址EA,执行速度快,而 且大多为单字节指令,特别适合在微机中使用。 3-6

微 机 原 理 及 应 用
∨∨

∧∧

? 2、立即数寻址(Immediate

Addressing)

? 操作数直接包含在指令中,随着取指令地起放入

指令队列,执行时直接从指令队列中取出,不必 执行总线周期访问存储器,故称为立即数。立即 数可以是8位或16位数,如果是16数,则其低字 节存放在低地址单元,高字节存放在高地址单元。 ? 这种寻址方式不需要根据地址寻找操作数,其执 行速度快,但由于操作数是指令的一部分,不能 修改,因此立即寻址方式只适用于提供常数,设 定初始值。
3-7

微 机 原 理 及 应 用
∨∨

∧∧

?

?

立即数据总是紧跟在指令操作码之后并和操作码一起存放 在代码段中,因而立即数据总是和操作码一起被放入BIU 中的指令队列里,在指令执行时不需再存取存储器。 使用立即寻址的指令主要用来给寄存器赋初值
【例】 MOV AX,080AH,其寻址如图所示。
操作码 立即数低字节0AH

高址

立即数高字节08H

立即寻址示意图
3-8

… … AX AH AL

微 机 原 理 及 应 用
∨∨

? 3、寄存器(直接)寻址(Register

Addressing)

∧∧

? 操作数包含在CPU内的某个寄存器中,指令中直

接给出该寄存器名。 ? 操作数对应的寄存器: 16位:AX、BX、CX、DX、SI、DI、SP和BP; 8位:AL、BL、CL、DL、AH、BH、CH、DH。
【例】 MOV AX,BX 执行过程如图所示。

AX

BX

寄存器寻址示意图
3-9

微 机 原 理 及 应 用
∨∨

∧∧

若操作数在存储器中,这时指令中给出的是操作数 所在单元的有效地址EA(偏移地址)或产生EA的 计算方式。 ? 由EU计算EA→BIU再根据:PA=(操作数在所段 的段首址×16)+EA,计算出物理地址→再执行总 线周期,按物理地址访问存储器取出操作数送给 EU→由EU执行指令。

3-10

微 机 原 理 及 应 用
∨∨

∧∧

? 由于存储器组织是分段方式,对存储器的操

作数寻址,只能在一段内的64KB内寻址。 ? 操作数在什么段中,规定当前段寄存器为默 认段寄存器。 ? 如果指令中某些操作数在其他段中,就应在 该操作数地址前使用段超越前缀指出段寄存 器名。
3-11

微 机 原 理 及 应 用
∨∨

∧∧

? 8086/8088中默认段寄存器

允许超越的段寄存
偏移地址
IP SP EA EA SI

器如下表示:
存储器操作类型
取指令 堆栈操作 通用数据读写 BP基址寻址 源数据串

默认段寄存器
CS SS DS SS DS

允许超越的段寄存器
无 无 CS、ES、SS CS、ES、SS CS、ES、SS

目的数据串

ES



DI
3-12

微 机 原 理 及 应 用
∨∨

∧∧

? 4、直接寻址(Direct

Addressing)

? 操作数放在存储器中,16位EA由指令直接给出,

如果指令中没有段超越前缀指明操作数在哪个段, 则默认为操作数在数据段。 ? PA=(DS×16)+EA ? 例: MOV AX,[1400H] 该指令EA=1400H,若DS=2000H,则PA=21400H。 该指令将PA所指地址的内容存放到AX。
3-13

微 机 原 理 及 应 用
∨∨

∧∧

【例】

MOV

AX,[22A0H] … 操作码

执行过程如图所示。 DS 3000 22A0 3 2 2A0 H

+)

代码段

偏移量A0H 偏移量22H … 322A0H 322A1H AX 直接寻址方式示意图

数据段

322A0H 322A1H

32H 48H …

48

32

3-14

微 机 原 理 及 应 用
∨∨

∧∧

注意:
? 1)直接寻址方式中,如果指令中的有效地址

是一个16位数,为了不与立即数寻址相混淆, 书写时,EA用方括号[EA]标识。如果有效地 址是个符号地址,如MOV AX,DATA则不用 []。 ? 2)如操作数不在数据段而在其他段(堆栈段或 附加段),则用段超越前缀标识,如:MOV AX,ES:[2100H],该指令表明操作数在附 加段,则PA=(ES×16)+2100H 3-15

5.寄存器间接寻址

微 机 原 理 及 应 用
∨∨

∧∧

寄存器中给出操作数的EA
寄存器间接寻址情况一

若以SI、DI、BX间接寻址,操作数通常 在现行数据段中,即DS中的值左移四位 加上SI、DI或BX中的有效地址即为操作数 的物理地址。

? BX ? PA ? ( DS ? 16) ? ? SI ? DI ?

3-16

微 机 原 理 及 应 用
∨∨

∧∧

【例】

MOV

AX,[SI] …

执行过程如图所示。

DS

2000
1000 21000H

+)
代码段 操作码 … 50H 21000H 21001H

SI

数据段

21000H 21001H

A0H
… AX

A0

50

寄存器间接寻址方式示意图
3-17

微 机 原 理 及 应 用
∨∨

5.寄存器间接寻址

寄存器间接寻址情况二

∧∧

若以BP间接寻址,则操作数在堆栈段中, 即操作数的物理地址位堆栈段寄存器 SS中的值左移四位与BP相加。

PA=(SS)×16+(BP)

3-18

微 机 原 理 及 应 用
∨∨

∧∧

【例】

MOV

AX,[BP] …

执行过程如图所示。

SS

3000
2000 32000H

+)
代码段 操作码 … 32000H 32001H

BP

堆栈段

32000H 32001H

B0H

62H
… AX

62

B0

以BP间接寻址方式示意图
3-19

微 机 原 理 及 应 用
∨∨

∧∧

? 6、寄存器相对寻址
? 操作数EA=指令指示的寄存器中的内容加上指

令中指定的8/16位的位移量D,D是一个带符号数, 用补码表示。 ? 间址寄存器仍可为BX、BP、SI和DI。与寄存器 间接寻址类似。 ? 例:设(SS)=3000H,(BP)=8000H MOV AX,0100H [BP]则src的PA=(SS)×16 +(BP)+D=(3000H)×16+8000H+0100H=38100H
3-20

微 机 原 理 及 应 用
∨∨

∧∧

? 7、基址变址寻址
? Src的EA由指令中指定的一个基址寄存器(BX或

BP)的内容和一个变址寄存器(SI或DI)内容之和组 成,即 ?BX ? ? SI ? EA ? ? ? ? ? ? ? BP ? ?DI ?
? 根据基址寄存器是BX还是BP,确定操作数是在

数据段还是在堆栈段。
3-21

微 机 原 理 及 应 用
∨∨

∧∧

? 如:

MOV AX,[BX] [DI]或写成MOV AX,[BX+DI] 设(DS)=2000H,(BX)=0256H,(DI)=6694H,则 PA=(DS)×16+(BX)+(DI)=268EAH ? 指令执行后,将把268EAH和268EBH两单元 的内容送到AX中,即(AH)=3BH,(AL)=20H ? 由于基址寄存器和变址寄存器的内容都是可 以修改,因此,在处理二维数组和表格时用 这种寻址方式较为方便。
3-22

8.相对基址变址寻址
微 机 原 理 及 应 用
∨∨ ∧∧

BX EA= BP 【例】 MOV +

SI

8位偏移量

+
DI

16位偏移量

AX,[BX+SI+250H] … … 操作码

代码段

偏移量50 偏移量02 …
33250H

执行过程如图所示。 DS 3 0 0 0 +) BX 1000 +) SI 2000 +) 0250 33250 H 33250H 33251H

数据段

33251H

30H 20H …

AX

20

30
3-23

相对基址变址寻址方式示意图

微 机 原 理 及 应 用
∨∨

9.数据串寻址

∧∧

●数据串寻址用于数据串操作指令。

【例】

MOVSB
SI←SI±1 DI←DI±1

执行后: [DI] ←[SI]

3-24

10. I/O端口寻址
由指令直接给出输入 输出设备的端口地址。 规定端口地址为8位, 能寻址256个端口。

微 机 原 理 及 应 用
∨∨

∧∧

I/O 端 口 寻 址

直接端口寻址

间接端口寻址

由寄存器DX给出输入输出 设备的端口地址。由于DX 是16位,因此能寻址64K 个端口。

【例】 IN OUT AL,20H ;将地址为20H的外设的内容读入AL中 DX,AL ;将AL中内容输出给以DX的内容为地址的外设
3-25

微 机 原 理 及 应 用
∨∨

∧∧

3.2 数据传送类指令
? 8086/8088有14种数据传送类指令,可以实现

CPU的内部寄存器之间、CPU与存储器之间、 CPU和I/O端口之间的数据传送。 ? 分为四类:
? 通用数据传送指令 ? 地址传送指令 ? 状态标志传送指令 ? I/O端口数据传送指令
3-26

微 机 原 理 及 应 用
∨∨

∧∧

3.2.1 通用数据传送指令
? 1、基本传送指令MOV
? 可以实现寄存器之间,寄存器和存储器之间的字

或字节的复制。 ? 格式:MOV dst,src ? 功能:将源操作数src传送到目的操作数dst中。 ? 例:MOV AL,35H ;将立即数35H复制到AL中 ? 该指令中src可为8/16位通用寄存器、段寄存器、 存储器中的字或字节,也可是立即数。Dst不允 许为立即数,其他同源操作数。 3-27

微 机 原 理 及 应 用
∨∨

∧∧

MOV的6种具体格式
? ①通用寄存器间传送
? MOV ? MOV

AL,BL AX,CX DS,AX AX,ES

;AL←BL ;AX←CX ; DS←AX ; AX←ES

? ②通用寄存器和段寄存器间传送
? MOV

? MOV

? ③通用寄存器和存储单元间传送
? MOV ? MOV

AL,[BX] ;AL ←(BX) [1400H],BX; (1400H)←BX

3-28

微 机 原 理 及 应 用
∨∨

∧∧

? ④段寄存器和存储单元之间的传送

DS,[3000H] ;将3000H和3001H两字 节单元的内容送到DS ? MOV [BX+SI],SI ;CS的内容送到BX+SI 和BX+SI+1所指的两个字节存储单元
? MOV

? ⑤立即数送到通用寄存器
? MOV

AX,2F5AH

;立即数2F5AH送到AX

? ⑥立即数送到存储单元
? MOV

WORD PRT[DI],0800H ;立即数 0800H送到DX所指的字节存储单元
3-29

微 机 原 理 及 应 用
∨∨

∧∧

段寄存器 CS DS ES SS

通用寄存器

立即数
存储器 图4-10 数据传送方向示意图

AX BX CX DX
SI DI BX BP

3-30

微 机 原 理 及 应 用
∨∨

∧∧

MOV指令注意事项:
? 1)MOV指令是双操作数指令,源和目的操作数

的类型必须一致,即或都为字,或都为字节。
? MOV

AX,BL ╳ MOV AL,1000H ╳

? 2)MOV指令中源和目的操作数不能同为存储器

操作数,即不允许在两个存储单元间直接传送, 如需要需通过通用寄存器或存储单元
? MOV

MOV

AL,[DI] [BX],AL
3-31

微 机 原 理 及 应 用
∨∨

∧∧

? 3)不能用CS作目的操作数,即CS寄存器的内

容不得随意改变,CS和IP的值 一般只能在 转移指令时改变 ? 4)不在段寄存器间直接传送数据 ? 5)不允许用立即数作dst ? 6)不允许直接向段寄存器传送立即数,如果 需要,则应通过通用寄存器或存储单元传送。
3-32

微 机 原 理 及 应 用
∨∨

∧∧

? 2、堆栈操作指令PUSH,POP
? 堆栈是用来保存数据和地址的一个存储区,位于

堆栈段中。堆栈在存储区的位置由堆栈段寄存器 SS和堆栈指针SP来规定,SS给出当前堆栈的段 基址。 ? 堆栈只有一个出入口,用SP指示,SP任何时候都 指向当前堆栈的栈顶,而且堆栈操作总是字操作。

3-33

微 机 原 理 及 应 用
∨∨

∧∧

? 在调用子程序或进行中断处理时,需要保存返回

地址以及数据(此过程称为保护现场);子程序返 回或中断处理完毕返回时,必须恢复中断前的现 场并回到原来主程序,这些功能要通过堆栈来实 现。保护现场由入栈指令PUSH,恢复现场由出 栈指令POP完成。
? 1)PUSH
? 格式:PUSH

src ? 功能:将src压入堆栈,src可为16位的通用寄存 器、段寄存器或存储单元。
3-34

微 机 原 理 及 应 用
∨∨

∧∧

? 例:

PUSH AX PUSH DS ? 指令执行过程:
? (SP)←(SP)-2 ? 为什么“-”且“2”? ? ((SP))=src的低8位
(SP)→

指令执行前 堆栈段

指令执行后 堆栈段

低地址

低地址

(SP)→

07 22


入栈方向

((SP)+1)=src的高8位
? 例:

(AX)=2207H PUSH AX 如右图示。

(AX)=2207H PUSH AX指令操作过程示意图

3-35

微 机 原 理 及 应 用
∨∨

∧∧

? 2)POP
? 格式:POP

dst ? 功能:将当前SP所指的栈顶部的一个字数据弹出 送到dst所指的16通用寄存器、段寄存器(CS除外) 或字存储单元。 ? 例: POP AX POP DS ? 指令执行过程与PUSH相反。
3-36

微 机 原 理 及 应 用
∨∨

∧∧

使用堆栈指令时注意:
? 1)src和dst可以为16位通用寄存器、段寄存器

或存储单元中的16位字数据,但不能为立即 数,CS不能为dst,但可以为src。 ? 2)每次执行PUSH时,SP自动减2,使SP向低 址方向移动,再将src压栈,且高字节先入栈; 执行POP时,SP自动加2,使SP向高地址方向 移动。 ? 3)使用堆栈操作保存多个寄存器内容或恢复 3-37 时,要按“先进后出”的原则组织。

微 机 原 理 及 应 用
∨∨

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

∧∧

指令功能:实现OP1和OP2内容的相互交换。
操作数为通用寄存器或存储器。

【例】

XCHG

AL,BL ;AL与BL进行字节互换 XCHG BX,CX ;BX与CX进行字互换

注意

●交换可在通用寄存器之间、通用寄存器和存储器之 间进行。段寄存器不能作为本指令的操作数,而且两 个存储单元之间不能直接交换数据。
3-38

微 机 原 理 及 应 用
∨∨

4换码指令(XLAT)
指令格式:XLAT OP
指令功能:将BX的内容和AL的内容相加作为有效地址EA, 在一个表格中找出此单元中的内容并传送至AL中。 即: (AL)←((BX)+(AL)) ●使用此指令时,应首先在数据段中预置一个表格。该表 格的最大长度不能超过256字节。表的起始地址的偏移量 应事先装入BX寄存器,AL中存放查找对象在表中地址与表 的起始地址相差的字节数。

∧∧

3-39

微 机 原 理 及 应 用
∨∨

∧∧

XLAT举例
已知十进制0~9的七段LED显示码分别为40H、79H、 24H、30H、19H、12H、02H、78H、00H、18H。 试用XLAT指令求数字6的七段显示码 ? 程序代码如下:
?
?

TABLE DB 40H,79H,24H,30H,19H DB 12H,02H,78H,00H,18H MOV AL,6 MOV BX,OFFSET TABLE XLAT TABLE

3-40

微 机 原 理 及 应 用
∨∨

∧∧

3.2.2 地址传送指令
? 用于传送地址码,将操作数的段基址或EA传

送到指定的寄存器中。 ? 1、取有效地址指令 LEA(Load Effective Address:有效地址送寄存器)
? 格式:LEA

dst,src ? 功能:将src的有效地址EA送到dst所指寄存器 ? Src必须是在存储单元地址,dst必须是16位通用 寄存器。注:该指令传送地址,而不是数据。
3-41

微 机 原 理 及 应 用
∨∨

∧∧

? 例:设

(DS)=1000H,(SI)=3000H,(14000H)=7788H LEA BX,[SI+1000H] ;执行后(BX)=4000H MOV BX, [SI+1000H] ;执行后(BX)=7788H
?

LEA AX,TABLE ?MOV AX,OFFSET TABLE
3-42

微 机 原 理 及 应 用
∨∨

∧∧

? 2、将双字地址指针送DS和一个寄存器指令

LDS (Load DS with pointer:指针送寄存器和 DS)
? 格式:LDS

dst,src ? 功能:把src指定的4个存储单元中存放的32位地 址指针(一个16位的段基址和一个16位的偏移地 址)传送到两个16位的寄存器,其中两个低位字 节的内容(偏移地址)送dst指示的寄存器中,后两 个高位字节单元中的内容(段基址)送入DS。
3-43

微 机 原 理 及 应 用
∨∨

∧∧

? 例:设(DS)=3200H,(33550H)=3A78H,

(33552H)=1998H ? LDS SI,[1550] src指定的PA=(DS)×16+1550=33550H, 所以执行指令后 (SI)=3A78H,(DS)=1998H

3-44

微 机 原 理 及 应 用
∨∨

∧∧

? 3、将双字地址指针送到ES和一个寄存器的

指令 LES(Load ES with pointer:指针送寄 存器和ES)
? 格式:LES

dst,src ? 功能:与LDS基本同,不同是将src的后两个字节 单元内容送ES ? LES DI,[3500H] ;执行后,将3500H和3501H 两单元的内容送DI,3502H,3503H的内容送ES
3-45

微 机 原 理 及 应 用
∨∨

∧∧

3.2.3 状态标志传送指令
? 1、标志寄存器(PSW)低8位送AH指令

LAHF(Load AH with Flags)
? 格式:LAHF

? 功能:

(AH)←(PSW低字节)

? 2、AH送PSW低8位指令

SAHF(Store AH

into Flags)
? 格式:SAHF ? 功能:

(PSW低字节) ← (AH)
3-46

微 机 原 理 及 应 用
∨∨

∧∧

? 3、PSW入栈指令
? 格式:PUSHF ? 功能:

PUSHF(PUSH the Flags)

(SP)← (SP)-2 ((SP)+1, (SP))←(PSW)

? 4、PSW出栈指令
? 格式:POPF ? 功能:

POPF(POP the Flags)

(PSW) ←((SP)+1, (SP)) (SP)← (SP)+2
3-47

微 机 原 理 及 应 用
∨∨

∧∧

附:输入、输出专用指令
? PC机里,所有I/O端口与CPU之间的通信都由

IN、OUT实现,外部设备端口使用16位二进 制编址,端口地址由0000H~FFFFH,,其中前 256个端口(00H~FFH),可以使用直接端口寻 址,由指令端口号PORT指明,当端口号大于 255时,必须使用间接端口寻址,不是内存地 址,由于外设端口地址并不分段,因些这些 地址为绝对地址,不需要使用段寄存器。
3-48

微 机 原 理 及 应 用
∨∨

∧∧

输入 ? 直接端口寻址:
? 1、IN(Input)
? 格式:IN

AL,PORT(或IN AL,PORT) ? 功能: (AL)←(PORT)(字节),[或(AX)←(PORT+1和 PORT(字)]
? 间接端口寻址:
? 格式:IN

AL,DX(或IN AX,DX) ? 功能: (AL)←((DX))(字节),[或(AX)←((DX)+1和 (DX)(字)]
3-49

微 机 原 理 及 应 用
∨∨

∧∧

? 2、OUT(Output)

输出

? 直接端口寻址:
? 格式:OUT

PORT ,AL (或OUT PORT ,AX) ? 功能: (PORT)←(AL)(字节),[或(PORT+1和 PORT← (AX) (字) ]
? 间接端口寻址:
? 格式:OUT

DX,AL (或OUT DX ,AX) ? 功能: ((DX))←(AL)(字节),[或(DX)+1和(DX)← (AX) (字) ]
3-50

微 机 原 理 及 应 用
∨∨

∧∧

? 例1:将端口1919H的一个字,送入堆栈:

MOV DX,1919H IN AX,DX PUSH AX ? 例2:将寄存器AL中的数据送到地址为318H 的外设端口寄存器: MOV DX,318H OUT DX,AL
3-51

微 机 原 理 及 应 用
∨∨

数据传送类指令
类 名称 传送(MOV) 入栈(PUSH) 通用传送 指令格式 MOV dst,src PUSH src 操作数类型 B,W W 操作说明 (dst)←(src) 将src压入堆栈

∧∧

出栈(POP)
交换(XCHG) 换码(XLAT) 取有效地址(LEA)

POP dst
XCHG dst,src XLAT LEA dst,src LDS dst,src LES dst,src

W
B,W B DW DW

从堆栈弹出字到dst
(dst)←→(src) (AL)←((BX+AL)) 将src的EA送dst (dst) ←(src), (DS)←(src+2) (dst) ←(src), 3-52 (ES)←(src+2)

地址传送

取指针到DS(LDS) 取指针到ES(LES)

微 机 原 理 及 应 用
∨∨

∧∧



名称 取标志到AH (AH)存入标志 标志压入栈 标志弹出栈 输入(IN)

指令格式 LAHF SAHF PUSHF POPF IN AL(AX),src OUT dst,AL(AX)

操作数类型 B B W W B,W B,W

操作说明 将标志寄存器的 低字节送入AH 将AH送入标志寄 存器的低字节 将标志寄存器内 容压入堆栈 从堆栈弹出字到 标志寄存器 从端口输入字/字 节到AL或AX 将AL/AX的内容 输出到端口
3-53

标志寄存器 传送

I/O端口传送 输出(OUT)

微 机 原 理 及 应 用
∨∨

∧∧

3.3 算术运算指令
? 8086/8088指令系统提供的算术类运算指令包

括加、减、乘、除4种基本运算指令,以及十 进制数运算的各种调整指令。可以完成带符 号或无符号的8位/16位二进制数的算术运算, 也可以完成BCD码表示的十进制数的算术运 算。 ? 对于带符号数和无符号数,加减运算过程相 同,而乘除运算过程完全不同。
3-54

微 机 原 理 及 应 用
∨∨

∧∧

加法运算指令 ? 1、加法指令ADD
? 3.3.1
? 格式:ADD

dst,src ? 功能: (dst)←(dst)+(src) ? 操作数可以是字或字节 ? 例: ADD AX,3A5FH ADD AX,[BX+1000H] ADD [BX+DI],AX
3-55

微 机 原 理 及 应 用
∨∨

∧∧

? 2、带进位加指令
? 格式:ADC

ADC

dst,src ? 功能: (dst)←(dst)+(src)+CF ? 例: ADC AX,BX ; (AX) ← (AX) +(BX)+CF ADC AX,ADDR[BX] ;将AX的内容和物理地 址为DS: (ADDR+BX)的字存储单元的内容相加, 再加进位CP,结果送AX ? 该命令为多字节数相加提供方便。
3-56

微 机 原 理 及 应 用
∨∨

∧∧

? 例:目的操作数存放在DX和AX寄存器中,

其中DX存放高位字。源操作数存放在BX、 CX中,BX存放高位字。 ? 执行指令前:
? (DX)=0002H,(AX)=0F365H

(BX)=0005H,(CX)=0E024H
? 指令序列:
? ADD

AX,CX ADC DX,BX
3-57

微 机 原 理 及 应 用
∨∨

∧∧

? 第一条指令执行后:

(AX)=0D389H SF=1,ZF=0,CF=1,OF=0

 F365 ? E024 D389 1?

? 第二条指令执行后:

(DX)=0008H SF=0,ZF=0,CF=0,OF=0

 0002 0005 ? 1(CF) 0008
3-58

微 机 原 理 及 应 用
∨∨

∧∧

? 3、加1指令(增量指令)
? 格式:INC

INC

dst ? 功能: (dst)←(dst)+1
? 4、压缩BCD码十进制数加法调整指令DAA
? 格式:DAA

? 功能:将两个压缩的BCD码十进制数相加后存入

AL的结果,调整为正确的压缩的BCD码。
3-59

微 机 原 理 及 应 用
∨∨

∧∧

? DAA调整方法
? 1)如果AL寄存器的低4位大于9或标志寄存器中

的AF位为1,则AL寄存器的内容加6H,并将标 志寄存器中的AF位置1 ? 2)如果AL寄存器的高4位大于9或标志寄存器中 的CF位为1,则AL寄存器的内容加60H,并将标 志寄存器中的CF位置1

3-60

微 机 原 理 及 应 用
∨∨

∧∧

? 例:求两个十进制数78+56的正确结果,可用

以下程序段实现 MOV AL,78H ADD AL,56H ;(AL)=CEH DAA ;高、低位均为大于9, 则(AL)←(AL)+66H,并置AF=1,CF=1, 则执行DAA后得CF=1 ,(AL)=34H
3-61

微 机 原 理 及 应 用
∨∨

∧∧

? 5、非压缩BCD码十进制数加法调整指令AAA
? 格式:AAA ? 功能:在用ADD或ADC指令对两个非压缩BCD码

十进制数相加之后(结果放AL中),用AAA指令 对AL中的加法结果进行调整,使之成为一个正确 的非压缩BCD码。

3-62

微 机 原 理 及 应 用
∨∨

∧∧

? 调整过程:
? 1)如AL寄存器低4位在0~9之间,且AF=0,则

执行3); ? 2)如AL寄存器的低4位在A~F之间或AF=1,则 (AL)←(AL)+6; ? 3)清除AL的高4位; ? 4)AF位的值送CF位。
3-63

微 机 原 理 及 应 用
∨∨

∧∧

? 例:ADD

AL,CL

AAA ? 如指令执行前: (AL)=00001001,(CL)=00001000。第一条指令 执行后,(AL)=00010001,因AF=1,故AAA调 整时,将AL的低4位加6,即为:00010111, 然后高4位清零成为:00000111,且AH加1, 则(AH)=00000001,(AL)=00000111,得到 两个非压缩十进制相加的正确结果17。 3-64

微 机 原 理 及 应 用
∨∨

∧∧

3.3.2 减法指令
? 1、减法指令
? 格式:SUB

SUB

dst,src ? 功能: (dst)←(dst)-(src) ? 例: SUB AX,0200H ;(AX)←(AX)-0200H SUB BX,[DI+100H] ;(BX)减去(DI+100H)字单 元中的内容,结果放在BX中

3-65

微 机 原 理 及 应 用
∨∨

∧∧

? 2、带借位的减法指令SBB
? 格式:SBB

dst,src ? 功能: (dst)←(dst)-(src)-CF ? 例: SBB AX,2100H ; (AX)←(AX)-2100H-CF SBB AL,BL ; (AL)←(AL)-(BL)-CF ? 该指令主要用于多字节数相减运算。

3-66

微 机 原 理 及 应 用
∨∨

∧∧

? 3、减1指令(减量指令)
? 格式:DEC

DEC

dst ? 功能: (dst)←(dst)-1
? 4、求补指令
? 格式:NEG

NEG

dst ? 功能: (dst)←0-(dst) ? 0-(dst)?0FFH- (dst) +1或0FFFFH - (dst) +1

?

3-67

微 机 原 理 及 应 用
∨∨

∧∧

? 5、比较指令CMP 格式:CMP dst,src

功能:用dst去减src,并根据所得的差设置有关标志位,为随 后的条件转移指令提供条件。 但并不保留该差值,所以,不会改变指令中的操作数。

注意点:
? 影响标志寄存器AF、CF、PF、OF、ZF、SF 。

?

指令执行后,目的操作数保持原值不变。

3-68

微 机 原 理 及 应 用
∨∨

∧∧

? 6、压缩型BCD码十进制数减法的数调整指令:DAS 指令格式:DAS

功能:对在AL中两个压缩型BCD数相减的结果,调整成压缩型BCD数在AL中。 注意点:

? 影响标志寄存器CF、PF、AF、ZF、SF,其中CF=1说明结果大于99。
? 必须紧跟在减法指令之后且只能对AL中的内容进行调整。
3-69

微 机 原 理 及 应 用
∨∨

∧∧

7、减法的BCD数调整 1)减法的非压缩型BCD数调整指令: AAS 指令格式:AAS 功能:对在AL中两个非压缩型BCD数相减的结果,调整成非压缩型BCD数在AL中。

注意点:
? 影响标志寄存器AF、CF ? 必须紧跟在减法指令之后且只能对AL中的内容进行调整。 例:SUB AL,BL AAS ;AL和BL中的非压缩BCD数相减 ;调整AL为正确的非压缩BCD数
3-70

综合举例
设x,y,z均为双精度数,分别存放于X,X+2;Y,Y+2;Z,Z+2的存 储单元,用汇编指令实现: w ← x+y+24-z w存放于W,W+2单元. MOV AX , X MOV DX , X+2 ADD AX , Y ADC DX , Y+2 ADD AX , 24 ADC DX , 0 SUB AX , Z SBB DX , Z+2 MOV W , AX MOV W+2 , DX

微 机 原 理 及 应 用
∨∨

∧∧

X+Y

+24

-Z
结果存入W,W+2
3-71

微 机 原 理 及 应 用
∨∨

三、乘法指令
计算机的乘法指令分为无符号乘法指令和有符号乘法指令,
他们的唯一区别就在于:数据的最高位是作为“数值”参与运 算,还是作为“符号位”参与运算。 乘法指令的被乘数都是隐含操作数,乘数在指令中显式地 写出来。CPU会根据乘数是8位、还是16位操作数,来自动选用 被乘数:AL、AX。

∧∧

3-72

微 机 原 理 及 应 用
∨∨

1、无符号数乘法指令
指令格式:MUL src

MUL

∧∧

功能:AX←AL*src(字节乘法);

DX,AX←AX*src(字乘法)

操作数:可以是通用寄存器、存储器,不能是立即数。

注意点: 影响标志寄存器CF和OF(AF、PF、ZF、SF 无定义)

字节乘:若乘积高8位AH<>0,则CF=1,OF=1; 若乘积高8位AH=0,则CF=0, OF=0;

字乘:若乘积高16位DX<>0,则CF=1,OF=1;
CF=0,OF=0; 例: MUL MUL BX BYTE PTR [SI]

若 乘 积 高 1 6 位 DX=0, 则

;DXAX←AX*BX ;AX←AL*(DS:[SI])
3-73

微 机 原 理 及 应 用
∨∨

∧∧

2、带符号数乘法指令
指令格式:IMUL 功能: src

IMUL

AX←AL*src(字节乘法) DX,AX←AX*src(字乘法)

操作数:可以是通用寄存器、存储器,不能是立即数。 注意点: ? 影响标志寄存器CF和OF(AF、PF、ZF、SF 无定义)。

?
?

若乘法结果AH或DX包含有效值,则OF=1、CF=1。
若乘法结果AH或DX只是低半部分的符号扩展,则OF=0、CF=0 。 WORD PTR [DI] ;DX,AX←AX*(DS:[DI])

例:IMUL

3-74

3、字节转换为字指令 CBW
指令格式:CBW

微 机 原 理 及 应 用
∨∨

∧∧

功能:将AL中数的符号位扩展到整个AH中,既当AL为正数,则(AH)=0。否则(AH) =0FFH。 注意点:指令的执行不影响任何标志位。

4、字转换为双字指令 CWD
指令格式:CWD 指令功能:将AX中数的符号位扩展到整个DX中。 注意点:指令的执行不影响任何标志位。 例3-33:MOV CBW CWD IDIV BX AL,-16 ;AL=0F0H(-16)

;AX=0FFF0H(-16) ;DXAX=0FFFFFFF0H(-16) ;DX←余数,AX←商
3-75

微 机 原 理 及 应 用
∨∨

∧∧

5 非压缩BCD码的除法调整指令

指令格式:AAD 指令功能:把AX中的由两个非压缩BCD码进行调整,然后 可按DIV指令实现两个非压缩BCD码的除法运算。 操作过程:将AH中的内容乘以10与AL中的内容相加,结果 送AL中,再将AH清零。 注意 本指令必须在DIV运算前使用。
3-76

3.4
微 机 原 理 及 应 用
∨∨ ∧∧

逻辑运算指令

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

2.逻辑或运算指令
指令格式:OR dst,src

指令功能:对两个操作数进行逻辑或运算,结果回送到目标 操作数。

3-77

3.逻辑异或运算指令
微 机 原 理 及 应 用
∨∨ ∧∧

指令格式:XOR dst,src 指令功能:对两个操作数进行逻辑异或运算,结果回送到目标 操作数。

4.逻辑非运算指令
指令格式:NOT dst
指令功能:对操作数逐位取反后回送到原处。

5.测试指令
指令格式:TEST dst,src 指令功能:将目标操作数与源操作数进行逻辑与运算,不回送 结果,只根据结果置标志位。
3-78

4.2.4 移位指令
1. 一般移位指令
(1)逻辑左移指令
指令格式:SHL dst,CL/1 指令功能:将操作数的内容左移,每移一次,最低位补0, 最高位→CF。 (2)逻辑右移指令 指令格式:SHR dst,CL/1 指令功能:将操作数的内容右移,每移一次,最高位补0, 最低位→CF。
3-79

微 机 原 理 及 应 用
∨∨

∧∧

1. 一般移位指令
(3)算术左移指令 指令格式:SAL dst,CL/1 指令功能:同SHL(逻辑左移指令)

微 机 原 理 及 应 用
∨∨

∧∧

(4)算术右移指令
指令格式:SAR dst,CL/1 指令功能:将操作数的内容右移,每移一次,最高位的值 不变,最低位→ CF 。

? 用移位指令实现Y=10X,假设10X不超出一字节范围.
3-80

2. 循环移位指令
(1)循环左移指令 指令格式:ROL dst,CL/1 指令功能:将操作数的内容循环左移,每移一次,最高位移 入CF,同时移入最低位。 (2)循环右移指令

微 机 原 理 及 应 用
∨∨

∧∧

指令格式:ROR dst,CL/1
指令功能:将操作数的内容循环右移,每移一次,最低位移 入CF,同时移入最高位。

3-81

2.循环移位指令
(3)带进位的循环左移指令

微 机 原 理 及 应 用
∨∨

∧∧

指令格式:RCL dst,CL/1
指令功能:包括进位位在内,一起循环左移,每移一次,最 高位移入CF,原CF移入最低位。 (4)带进位的循环右移指令 指令格式:RCR dst,CL/1 指令功能:包括进位位在内,一起循环右移,每移一次,最 低位移入CF,原CF移入最高位。

?

(BL)=10110110B MOV CL,3 ROL BL,CL BL的值和标志位????

3-82

3.6
微 机 原 理 及 应 用
∨∨ ∧∧

串操作指令
数据串是存储区中的一个数据序列。组成数据串的每一个字节 或字称为数据串的元素。一个数据串的最大长度为64K。串操 作是指对串中的每个字或字节数据做相同的操作。串操作分为 串传送、串搜索、串比较及串存取等。

所有基本的串操作有如下共同点:
(1)用寄存器SI寻址源操作数,且假定源操作数是在现行的数 据段区域中,用寄存器DI寻址目标操作数,且假定目标操作数 是在现行的附加段区域中。

(2)每执行一次串操作后自动修改指针SI、DI。若方向标志 DF=0,则每次操作后SI和DI自动加1或加2;若DF=1,则每次操 作后SI和DI自动减1或减2。源串地址用DS:SI表示,目的串地 址用ES:DI表示。 (3)串长存放在CX中。
3-83

1. 字符串传送指令
指令格式:MOVS dst,src MOVSB MOVSW 指令功能:从源串中取一个字节/字,传送到目标串中,并 自动修改SI/DI,使之指向下一元素。字符串传 送指令前可以加重复前缀REP,表示每传送完 一个元素使CX减1,直到CX=0。 注意 使用MOVS指令时,必须说明操作数的数据类型,这样 才能确定是字节传送,还是字传送。

微 机 原 理 及 应 用
∨∨

∧∧

3-84

微 机 原 理 及 应 用
∨∨

例:将存储器中 DS:VAL1开始的100个字节传到ES:VAL2

∧∧

CLD MOV SI,OFFSET VAL1 MOV DI,OFFSET VAL2 MOV CX,0064H REP MOVS VAL2,VAL1 (REP MOVSB)

DF 置 0 偏移地址VAL1送SI 偏移地址VAL2送DI 字节数(100) 重复传送直至CX=0

3-85

微 机 原 理 及 应 用
∨∨

2.字符串比较指令

∧∧

指令格式:CMPS dst,src CMPSB

CMPSW
指令功能:取源串一个字节/字,与目标串的一个字节/字相减, 不回送结果,根据结果置标志位,并修改串地址指

针,使之指向下一个字节/字单元。

3-86

3. 字符串搜索指令
指令格式:SCAS dst SCASB SCASW 指令功能:将AL/AX寄存器中的关键字,减去由DI所指向的 目标串中的元素,不回送结果,根据结果置标志 位,并修改DI寄存器内容,指向下一元素。 注意 执行这类指令前,必须先将要查找的关键字送AL/AX中, 串的首偏移地址送DI,串长送CX。

微 机 原 理 及 应 用
∨∨

∧∧

3-87

4. 取字符串和存字符串指令
微 机 原 理 及 应 用
∨∨ ∧∧

(1)取字符串指令

指令格式:LODS OP LODSB LODSW 指令功能:将源串中SI所指向的存储单元中的一个字节/字 取到AL/AX寄存器中,并修改SI的内容,指向下 一字节/字单元。

3-88

4.取字符串和存字符串指令
微 机 原 理 及 应 用
∨∨ ∧∧

存字符串指令 (2)

指令格式:STOS STOSB STOSW

OP

指令功能:将AL/AX中的一个字节/字,存到由DI所指向的 目标串的存储单元,并修改DI的内容,指向下一 个字节/字的存放单元。

注意
LODS指令一般不使用重复前缀,STOS指令常使用REP前缀。

3-89

3.7.2 转移指令
微 机 原 理 及 应 用
∨∨ ∧∧

1. 无条件转移指令
(1)JMP指令
1)段内直接短转移

指令格式:JMP SHORT,OP
指令操作:IP←IP+8位偏移量。

2)段内直接近转移
指令格式:JMP NEAR PTR OP

指令操作:IP←IP+16位偏移量.
3-90

微 机 原 理 及 应 用
∨∨

∧∧

(1)JMP指令 3)段内直接转移 指令格式:JMP WORD 4)段间直接转移 指令格式:JMP FAR 5)段间间接转移 指令格式:JMP DWORD PTR OP PTR OP PTR OP或JMP OP

3-91

微 机 原 理 及 应 用
∨∨

∧∧

(2)调用和返回指令 1)调用指令 指令格式:CALL OP 指令功能:将CALL指令的下一条指令的地址IP或 IP与CS压栈,新的目标地址装入IP或IP 与CS中,控制程序转移到由OP指明入口的子程序。 操作过程:A.当前CS压栈,OP所在段地址→CS,SP-2 →SP B.当前SP压栈,OP的偏移地址→IP,SP-2 →SP

3-92

微 机 原 理 及 应 用
∨∨

∧∧

(2)调整和返回指令 2)返回指令 指令格式:RET 指令功能:通常作为一个子程序的最后一条指令,用以返回

到调用子程序的断点处,即从堆栈弹出断点送IP
和CS。 操作过程:A.从栈顶弹出一个字给IP,SP+2 →SP

B.从栈顶弹出一个字给CS,SP+2 →SP

3-93

2.条件转移指令
微 机 原 理 及 应 用
∨∨ ∧∧

高于/不低于也不等于转移 高于或等于/不低于转移

JA/JNBE 目标标号 JAE/JNB 目标标号

低于/不高于也不等于转移
低于或等于/不高于转移 大于/不小于也不等于转移

JB/JNAE 目标标号
JBE/JNA 目标标号 JG/JNLE 目标标号

大于或等于/不小于转移
小于/不大于也不等于转移 小于或等于/不大于转移 注意

JGE/JNL 目标标号
JL/JNGE 目标标号 JLE/JNG 目标标号

其中,A表示“高于”,B表示“低于”,G表示“大于”,L表示 “小于”,N表示“不”,E表示“等于”。
3-94

2.条件转移指令
微 机 原 理 及 应 用
∨∨ ∧∧

进位为1转移 进位为0转移 等于/结果为0转移 不等于/结果不为0转移 溢出转移 不溢出转移 奇偶位为0/奇偶性为奇转移 奇偶位为1/奇偶性为偶转移 符号标志位为0转移 符号标志位为1转移

JC JNC JZ/JE

目标标号 目标标号 目标标号

JNZ/JNE 目标标号 JO JNO 目标标号 目标标号

JNP/JPO 目标标号 JP/JPE JNS JS 目标标号 目标标号 目标标号
3-95

3.循环控制指令
微 机 原 理 及 应 用
∨∨ ∧∧

(1)计数循环 指令格式:LOOP 目标标号 指令功能:CX-1→CX,若CX≠0,循环转移到目标标号, 直到CX=0退出循环。 (2)结果为0/相等循环 指令格式:LOOPZ/LOOPE 目标标号

指令功能:CX-1→CX,若CX≠0且ZF=1时,循环转移到目 标标号,直到CX=0或ZF=0退出循环。

3-96

3. 循环控制指令
微 机 原 理 及 应 用
∨∨ ∧∧

(3)结果不为0/不相等循环 指令格式:LOOPNZ/LOOPNE 目标标号

指令功能:CX-1→CX,若CX≠0且ZF=0时,循环转移到目 标标号,直到CX=0或ZF=1时退出循环。 (4)计数为0转移 指令格式:JCXZ 目标标号 指令功能:若CX=0时,则控制转向目标标号,否则顺序执行。

3-97

3.8
微 机 原 理 及 应 用
∨∨ ∧∧

处理器控制指令

1. 标志操作指令
指令格式: CLC
STC CMC

;置CF= 0
;置CF=1 ;置CF=CF

CLD
STD CLI

;置DF=0
;置DF=1 ;置IF=0

STI
注意

;置IF=1

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

2. CPU控制指令
(1)处理器暂停指令 指令格式:HLT 指令操作:使处理器处于暂时停机状态。 (2)处理器等待指令 指令格式:WAIT 指令操作:执行WAIT指令后,处理器处于等待状态,直到 检测到TEST引脚信号有效后,才退出等待状态, 继续执行后续指令。
3-99

微 机 原 理 及 应 用
∨∨

∧∧

2.CPU控制指令
(3)处理器交权指令 指令格式:ESC EXTOPCD,OP源 指令操作:用来为协处理器提供一个操作码和操作数,以便

微 机 原 理 及 应 用
∨∨

∧∧

完成主机对协处理器的某种操作要求。
(4)空操作指令 指令格式:NOP 指令操作:在执行本指令期间,CPU不完成任何操作,只是 每执行一条NOP指令,耗费3个时钟周期的时间。

3-100

2. CPU控制指令
(5)总线封锁前缀 指令格式:LOCK 指令操作:当CPU执行带有LOCK前缀的指令时,不允许其 他设备对总线进行访问。LOCK可作为任意指令 前缀使用。

微 机 原 理 及 应 用
∨∨

∧∧

注意 此类指令均不影响标志位。

3-101


赞助商链接

习题3-8086指令系统

第三章8086微处理器指令... 3页 免费 8086微处理器指令系统习... 11页 免费...( JZ GOON ) 3.10 8086/8088 用什么途径来更新 CS 和 IP 的值? 【答】...

8086指令系统

8086指令系统3 44页 2财富值喜欢此文档的还喜欢 8086指令系统总结 9页 免费 8086-8088 汇编语言指令表 5页 免费 第三章 8086指令系统 31页 免费 2、8086指...

[汇编]8086指令系统---算术指令(二)

80868088汇编指令系统 6页 免费 汇编教程 第三章 8086的指... 21页 1财富...[汇编]8086 指令系统---算术指令(二) 4 除法指令 DIV src 无符号数除法(uns...

80X86汇编语言程序设计_8086_8088寻址方式和指令系统

80X86 汇编语言程序设计 第二章 8086/8088 寻址方式和指令系统(3~20) 一.8086/8088 寄存器组: (14 个 16 位寄存器,8 个 8 位寄存器) 1.数据寄存器:AX(...

微机原理(8086指令系统)

微机原理8086指令系统PPT 32页 5财富值 微机原理第3章 8086的指令... 23页 2财富值喜欢此文档的还喜欢 汇编语言指令大全(详解版) 22页 免费 8086-8088 汇编...

8086指令系统

8086-8088 汇编语言指令表 5页 免费 第四章 8086指令系统(改) 133页 免费 8086+汇编指令速查手册 5页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功...

8086 指令系统

第四章 8086指令系统(改) 133页 免费 8086指令系统 146页 免费 8086-8088 汇编...3-2 8086 指令系统包括:数据传送类指令、算术运算类指令、逻辑运算与移位指令...

8086CPU指令系统

第三章 8086CPU 指令系统本章重点: 本章重点: 1.寻址方式: 立即寻址,寄存器...(Macro Assembler Language 宏汇编 语言) ,因此我们以 8086/8088 MASM 为主要...

80X86汇编语言程序设计 第二章⑤.8086 8088指令系统(二...

80X86汇编语言程序设计 第二章 8086/8088寻址方式和指令系统(二)加减运算指令 1.加法指令 ADD 格式:ADD OPRD1,OPRD2 执行的操作: (OPRD1)←(OPRD1)+(OPRD2...

第三章8086微处理器指令系统习题答案

微处理器指令系统习题答案 第三章 8086 微处理器指令系统习题答案一、单项选择...第3章_8086_微处理器及其... 91页 1下载券 第3章 8086(8088)CPU指令.....