1
第 3章指令系统
2
主要内容:
指令系统的一般概念
对操作数的寻址方式
六大类指令的操作原理:
操作码的含义指令对操作数的要求指令执行的结果
3
§ 3.1 概述了解:
指令及指令系统;
指令的格式;
指令中的操作数类型。
4
一、指令与指令系统指令:
控制计算机完成某种操作的命令指令系统:
处理器所能识别的所有指令的集合指令的兼容性:
同一系列机的指令都是兼容的。
5
二、指令格式指令中应包含的信息:
运算数据的来源运算结果的去向执行的操作 。
6
指令格式:
操作码 [操作数 ],[操作数 ]
执行何种操作目标操作数 源操作数参加操作的数据或数据存放的地址
7
指令格式:
零操作数指令,操作码单操作数指令,操作码 操作数双操作数指令,操作码 操作数,操作数多操作数指令,三操作数及以上
8
三、指令中的操作数表征参加操作的数据本身 立即数表征数据存放的地址寄存器存储器
9
操作数:
立即数操作数:
表示参加操作的数据本身,可以是 8位或 16位例,MOV AX,1234H
MOV BL,22H
立即数无法作为目标操作数
立即数可以是无符号或带符号数,其数值应在可取值范围内
10
操作数:
寄存器操作数:
表示参加运算的数存放在指令给出的寄存器中,
可以是 16位或 8位。
例,MOV AX,BX
MOV DL,CH
11
操作数:
存储器操作数:
表示当前参加运算的数存放在存储器的某一个或某两个单元中
例,MOV AX,[1200H]
MOV AL,[1200H]
22H
11H
1200H偏移地址
AH AL

12
四、指令字长与机器字长
指令字长 由操作码的长度、操作数地址长度、
操作数个数决定;
8088/8086CPU采用变字长指令格式;
机器字长:
计算机能够直接处理的二进制数的位数。
13
五、指令的执行速度
指令的字长影响指令的执行速度
(常用指令的执行时间见表 3-1)
对不同的操作数,指令执行的时间不同:
存储器 立即数 寄存器快!
14
§ 3.2 寻址方式寻找操作数所在地址的方法寻找转移地址的方法本节
15
一、立即寻址
指令中的源操作数是立即数,即源操作数是参加操作的数据本身
例,MOV AX,1234H
12H
34H
AH AL
MOV
代码段┇
16
二、直接寻址
指令中直接给出操作数的偏移地址
例,MOV AX,[1200H]
22H
11H
1200H
偏移地址
AH AL

11 22
数据段
17
直接寻址
直接寻址方式下,操作数的段地址默认为数据段,但允许段重设,即由指令定义段。
例,MOV AX,ES,[1200H]
18
三、寄存器寻址
参加操作的操作数在 CPU的通用寄存器中。
例,MOV AX,BX
AX BX
19
四、寄存器间接寻址
参与操作的操作数存放在内存中,其偏移地址为指令中的寄存器的内容。
例,MOV AX,[BX]
设( BX) =1200H
22H
11H
1200H
偏移地址
AH AL

11 22
数据段代码段
MOV
20
寄存器间接寻址
由寄存器间接给出操作数的偏移地址;
存放偏移地址的寄存器称为 间址寄存器,它们是,BX,BP,SI,DI
操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:
BX,SI,DI 默认在数据段
BP 默认在堆栈段
21
寄存器间接寻址寄存器间接寻址基址寻址(间址 寄存器为基址寄存器 BX,BP)
变址寻址(间址 寄存器为变址寄存器 SI,DI)
22
五、寄存器相对寻址
操作数的偏移地址为寄存器的内容加上一个位移量
例,MOV AX,[BX+DATA]
设 DS=2000H,BX=0220H,DATA=05H
则,AX=[20225H]
23
六、基址、变址寻址
操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,操作数的段地址由选择的基址寄存器决定
例,MOV AX,[SI+BX]
24
七、基址、变址、相对寻址
操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,再加上一个位移量。
操作数的段地址由选择的基址寄存器决定
例,MOV AX,[BP+SI+DATA]
25
八、隐含寻址
指令隐含了的一个或两个操作数的地址,即操作数在默认的地址中
例,MUL BL
指令的执行,AL× BL AX
26
§ 3.3 8086指令系统从功能上包括六大类:
数据传送算术运算逻辑运算和移位串操作程序控制处理器控制
27
一、数据传送
通用数据传送
输入输出
地址传送
标志位操作
28
1,通用数据传送一般数据传送指令堆栈操作指令交换指令查表转换指令字位扩展指令特点:
该类指令的执行对标志位不产生影响
29
一般数据传送指令
一般数据传送指令 MOV
格式,MOV dest,src
操作,src dest
例,MOV AL,BL
30
一般数据传送指令注:
两操作数字长必须相同 ;
两操作数不允许同时为存储器操作数;
两操作数不允许同时为段寄存器;
在源操作数是立即数时,目标操作数不能是段寄存器;
IP和 CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。
31
一般数据传送指令判断下列指令的正确性:
MOV AL,BX
MOV AX,[SI]05H
MOV [BX][BP],BX
MOV DS,1000H
MOV DX,09H
MOV [1200],[SI]
32
一般数据传送指令应用例将 (*) 的 ASCII码 2AH送入内存 1000H开始的 100个单元中:
MOV DI,1000H
MOV CX,64H
MOV AL,2AH
AGAIN,MOV [DI],AL
INC DI ; DI+1
DEC CX ; CX-1
JNZ AGAIN ; CX≠0 则继续
HLT
33
上段程序在代码段中的存放形式設 CS=109EH,IP=0100H,则各条指令存放地址如下:
CS,IP
109E,0100 MOV DI,1000H
109E,0103 MOV CX,64H
109E,0106 MOV AL,2AH
109E,0108 MOV [DI],AL
109E,010A INC DI
109E,010B DEC CX
109E,010C JNZ 0108
109E,010E HLT
34
数据段中的分布送上 2AH后数据段中相应存储单元的内容改变如下:
DS,1000 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1010 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1030 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1040 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1050 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS,1060 2A 2A 2A 2A 00 00 00 00 00 00 00 00 00 00 00 00
偏移地址 [DI]
35
堆栈操作指令掌握:
有关堆栈的概念 栈顶、栈首、栈底
堆栈指令的操作原理执行过程,执行结果
36
堆栈操作的原则
先进后出
以字为单位
37
堆栈操作指令
压栈指令 PUSH
格式,PUSH OPRD
出栈指令 POP
格式,POP OPRD
38
压栈指令 PUSH
指令执行过程:
(SP) ← ( SP) -2
( SP) -1← 操作数高字节
( SP) -2← 操作数低字节
39
压栈指令的操作设 AX=1234H,SP=1200H
执行 PUSH AX 指令后堆栈区的状态:
1200H

堆栈段
SP-2=11FEH
12H
34H
1200H

堆栈段
12H 34H
AX
入栈后入栈前
40
出栈指令 POP
指令执行过程:
( SP) 操作数低字节
( SP) +1 操作数高字节
(SP) ← ( SP) +2
41
出栈指令的操作执行 POP AX
堆栈区的状态:
12H
34H 11FEH

堆栈段代码段
PUSH
12 34
AX
SP+2
42
堆栈操作指令说明
指令的操作数必须是 16位的;
操作数可以是寄存器或存储器两单元,但不能是立即数;
不能从栈顶弹出一个字给 CS;
PUSH和 POP指令在程序中一般成对出现;
PUSH指令的操作方向是从高地址向低地址,而
POP指令的操作正好相反 。
43
堆栈操作指令例
PUSH AX
PUSH BX
PUSH WORD PTR[BX]
POP WORD PTR[BX]
POP AX
POP BX

如此,会使 AX和 BX的内容互换
44
交换指令
格式:
XCHG REG,MEM/REG
两操作数必须有一个是寄存器操作数
不允许使用段寄存器 。
例,XCHG AX,BX
XCHG [2000],CL
45
查表指令
格式:
XLAT
说明:用 BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址
操作,[BX+AL] AL
例:教材第 112页
46
查表指令例数据段中存放有一张 ASCII码转换表,
设首地址为 2000H,
现欲查出表中第 11
个代码的 ASCII码
( 设 DS=4000H)
30
31
32
...
39
41
42
...
45
46...
42000H+0
42000H+11

0’‘
1’‘
2’

9’‘ A’

B’

E’‘
F’
47
查表指令例
可用如下指令实现:
MOV BX,2000H ;( BX) ← 表首地址
MOV AL,0BH ;( AL) ← 序号
XALT ; 查表转换执行后得到:( AL) =42H
48
字位扩展指令
将符号数的符号位扩展到高位;
指令为零操作数指令,采用隐含寻址,隐含的操作数为 AX及 AX,DX
无符号数的扩展规则为在高位补 0
49
字节到字的扩展指令
格式:
CBW
操作:将 AL内容扩展到 AX
规则:若最高位 =1,则执行后 AH=FFH
若最高位 =0,则执行后 AH=00H
50
字到双字的扩展指令
格式:
CWD
操作:将 AX内容扩展到 DX AX
规则:若最高位 =1,则执行后 DX=FFFFH
若最高位 =0,则执行后 DX=0000H
51
字位扩展指令例
MOV AL,44H
CBW ; 执行结果
MOV AX,0AFDEH
CWD
MOV AL,86H
CBW

52
2,输入输出指令掌握:
指令的格式及操作
指令的两种寻址方式
指令对操作数的要求
53
输入输出指令
专门面向 I/O端口操作的指令
包括 输入指令 IN acc,PORT
输出指令 OUT PORT,acc
端口地址
54
指令寻址方式
直接寻址
直接给出 8位端口地址,可寻址 256个端口
间接寻址
16位端口地址由 DX指定,可寻址 64K个端口
55
I/O指令例
IN AX,80H
MOV DX,2400H
IN AL,DX
OUT DX,AX
OUT AL,35H
56
3,地址传送指令取偏移地址指令 LEA
LDS指令
LES指令
57
取偏移地址指令 LEA
将变量的 16位偏移地址取出送目标寄存器
格式:
LEA REG,MEM
指令要求 源操作数 必须是一个 存储器操作数,
目标操作数通常是间址寄存器,
58
LEA指令
比较下列指令:
LEA SI,DATA1
MOV SI,DATA1
MOV BX,[BX]
LEA BX,[BX]



DATA1
符号地址
12H
34H
1100H 88H
77H
BX=1100H
59
LEA指令在程序中的应用
将数据段中首地址为 MEM1 的 50个字节的数据传送到同一逻辑段首地址为 MEM2的区域存放。
编写相应的程序段
60
LEA指令在程序中的应用开 始取源地址取目标地址送数据块长度到 CL
传送一个字节修改地址指针修改计数值计数值 =0?
结 束
N
Y
61
LEA指令在程序中的应用
LEA SI,MEM1
LEA DI,MEM2
MOV CL,50
NEXT,MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CL
JNZ NEXT
HLT
62
取远地址指针指令
LDS reg,MEM32
LES reg,MEM32
指令中源操作数是存储器某 4个连续单元的偏移地址,目标操作数是间址寄存器。
63
LDS指令例
例:
LDS DI,[1200H]
MOV AX,[DI]
指令执行后:
64
LDS指令例
DS = 6000H
DI = 1234H
AX = 2233H


12H
34H
00H
60H
1200H 数据段
1

DS DI
数据段
2
33H
22H
61234H
65
LES指令例
LES DI,[1200H]
MOV AX,[DI] ┇

12H
34H
00H
60H
1200H 数据段

ES DI
附加段
33H
22H
61234H
66
4,标志位操作指令
LAHF
SAHF
PUSHF
POPF
隐含操作数 AH
隐含操作数 FLAGS
67
LAHF,SAHF
LAHF ; 将 FLAGS的低 8位装入 AH
SAHF ;执行与 LAHF相反的操作
CF PFAFZF CF
….
AH
FLAGS
D15 D0
D7 D0
68
PUSHF,POPF
针对 FLAGS的堆栈操作指令将标志寄存器压栈或从堆栈弹出
69
二、算术运算类指令加法运算指令减法运算指令乘法指令除法指令算术运算指令的执行大多对状态标志位会产生影响
70
1,加法指令普通加法指令 ADD
带进位位的加法指令 ADC
加 1指令 INC
加法指令对操作数的要求与 MOV指令相同
71
ADD指令
格式:
ADD OPRD1,OPRD2
操作:
OPRD1+OPRD2 OPRD1
ADD指令的执行对全部 6个状态标志位都产生影响
72
ADD指令例
MOV AL,78H
ADD AL,99H
指令执行后 6个状态标志位的状态
73
ADD指令例
01111000
+ 10011001
000100011
标志位状态,CF= SF=
AF= ZF=
PF= OF=
74
ADC指令
指令格式、对操作数的要求、对标志位的影响与 ADD指令完全一样
指令的操作:
OPRD1+OPRD2+CF OPRD1
ADC指令多用于多字节数相加,使用前要先将
CF清零。
75
INC指令
格式:
INC OPRD
操作:
OPRD+1 OPRD
常用于在程序中修改地址指针不能是段寄存器或立即数
76
2,减法指令普通减法指令 SUB
考虑借位的减法指令 SBB
减 1指令 DEC
比较指令 CMP
求补指令 NEG
减法指令对操作数的要求与对应的加法指令相同
77
SUB指令
格式:
SUB OPRD1,OPRD2
操作:
OPRD1- OPRD2 OPRD1
对标志位的影响与 ADD指令同
78
SBB指令
指令格式、对操作数的要求、对标志位的影响与 SUB指令完全一样
指令的操作:
OPRD1- OPRD2- CF OPRD1
79
DEC指令
格式:
DEC OPRD
操作:
OPRD - 1 OPRD
指令对操作数的要求与 INC相同指令常用于在程序中修改计数值
80
应用程序例
MOV BL,2
NEXT1,MOV CX,0FFFFH
NEXT2,DEC CX
JNZ NEXT2
DEC BL
JNZ NEXT1
HLT
81
NEG指令
格式:
NEG OPRD
操作:
0 - OPRD OPRD
8/16位寄存器或存储器操作数用 0减去操作数,相当于对该操作数求补码指令的两点注意请参见教材 p121
82
CMP指令
格式:
CMP OPRD1,OPRD2
操作:
OPRD1- OPRD2
指令执行的结果不影响目标操作数!
83
CMP指令
用途:
用于比较两个数的大小,可作为条件转移指令转移的条件
指令对操作数的要求及对标志位的影响与 SUB
指令相同
84
CMP指令
两个无符号数的比较:
CMP AX,BX
若 AX > BX CF=0
若 AX < BX CF=1
两个带符号数的比较
CMP AX,BX
两个数的大小由 OF和 SF共同决定
OF和 SF状态相同 AX > BX
OF和 SF状态不同 AX < BX
85
CMP指令例
LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT,INC SI
CMP AL,[SI]
JNC GOON ; CF=0转
XCHG [SI],AL
GOON,DEC CL
JNZ NEXT
MOV [BX],AL
HLT
程序功能

86
程序功能



MAX
BUF XXH
XXH
XXH找 20个数中最大的数,
并将其存放在 MAX单元中
87
3,乘法指令无符号的乘法指令 MUL
带符号的乘法指令 IMUL
乘法指令采用隐含寻址,隐含的是存放被乘数的累加器 AL或 AX及存放结果的 AX,DX;
若运算结果的高位全为 0或 1,表示其为无效数据,OF=CF=0
88
无符号数乘法指令
格式:
MUL OPRD
不能是立即数
操作:
OPRD为字节数 AL× OPRD AX
OPRD为 16位数 AX× OPRD DXAX
89
无符号数乘法指令例
MUL BYTE PTR[BX]

BX XXHAL × XXH
AX
90
带符号数乘法指令
格式:
IMUL OPRD
IMUL指令将 OPRD视为带符号数,运算时若操作数为负数,要先将操作数求补码,运算后再将结果求补。
91
IMUL指令例设,AL=FEH,CL=11H,求 AL与 CL的乘积 。
若为无符号数,则 MUL CL
结果,AX=10DEH
若将两操作数看作有符号数,则:
IMUL CL
指令执行后,AX=FFDEH=-34。
92
4,除法指令无符号除法指令 DIV OPRD
有符号除法指令 IDIV OPRD
若 OPRD是字节数,则执行 AX/OPRD
若 OPRD是双字节数,则执行 DXAX/OPRD
指令要求被除数是除数的双倍字长
AL=商
AH=余数
AX=商
DX=余数
93
5,BCD码调整指令
共 6条,均为隐含寻址方式,隐含的操作数是
AL或 AL,AH;
不能单独使用,要紧跟在相应的算术运算指令之后;
执行结果为压缩 BCD码或扩展 BCD码表示的十进制数。
94
加法指令应用例
计算 2658+3619=?
结果存放在 SUM单元。
设被加数和加数的每一位都以 ASCII码形式存放在内存中,
低位在前,高位在后。
36H
32H
39H
31H
STRING1
STRING2
38H
35H
36H
33H
数据段
SUM
...
...
95
加法指令应用例
LEA SI,STRING1
LEA DI,STRING2
LEA BX,SUM
MOV CX,4
CLC
NEXT,MOV AL,[SI]
ADC AL,[DI]
AAA
MOV [BX],AL
INC SI
INC DI
INC BX
DEC CX
JNZ NEXT