1
第 5章
指令系统
计算机教学实验中心
第一部分
2
主要内容
? 指令系统的一般概念
? 对操作数的寻址方式
? 六大类指令的操作原理
操作码的格式及功能,指令对操作数的要求,指令对标
志位的响应
3
§ 5.1 概 述
了解:
? 指令及指令系统;
? 指令的格式;
? 指令中的操作数类型。
4
一、指令与指令系统
指令:
控制计算机完成某种操作的命令
指令系统:
处理器所能识别的所有指令的集合
指令的兼容性:
同一系列机的指令都是兼容的。
5
二、指令格式
? 指令中应包含的信息:
运算数据的来源 ( 源操作数 )
运算结果保存到何处 ( 目的操作数 )
执行的操作 ( 操作码 )
例如,Z = X + Y
目的操作数 源操作数 1 操作 源操作数 2
想一想,指令应该包括几个部分?
6
指令格式
操作码 操作数,操作数
执行何种操作 目标操作数 源操作数
参加操作的数据
或数据存放的地址
7
指令格式
? 指令的长度与操作码及操作数的多少和类型有
关
零操作数指令,操作码
单操作数指令,操作码 操作数
双操作数指令,操作码 操作数 1,操作数 2
源 /目的操作数
源 /目的操作数 源操作数
注:两个操作数时,操作数类型要一致。如都是 8位或都是 16位。
8
三、指令中的操作数
立即数,表征参加操作的数据本身
存储器操作数,表征数据存放的地址
寄存器操作数:表征数据存放在哪个寄存器中
隐含操作数:表征数据隐含存放在某个寄存器中
9
立即数操作数
? 源操作数就是参加操作的数据本身,它们可以是 8位或
16位。
例,MOV AX,1234H
MOV BL,22H
? 立即数无法作为目标操作数
? 立即数可以是无符号或带符号数,其值应在允许范围内
? 错误例:
? MOV AX,12345H; MOV 1234H,AX
10
寄存器操作数:
? 表示参加运算的数存放在指令给出的寄存器中,
可以是 16位或 8位。
? 例,MOV AX,BX
MOV DL,CH
想一想:以下指令正确否?
MOV AX,BL
MOV DL,CX
11
存储器操作数
? 表示当前参加运算的数存放在存储器的某一个
或某两个单元中
? 表示形式,[ ]
地址值或寄存器
如,[1234H] 表示操作数在地址为 1234H的存储器单元中
[BX] 表示操作数在以 BX的内容为地址的存储器单元中
指令例,MOV AX,[1234H]
MOV [BX],SI
12
四、指令字长及执行速度
? 指令字长:
由操作码的长度、操作数地址长度、操作数个
数决定;指令的字长影响指令的执行速度
(常用指令的执行时间见表 3-4)
? 对不同的操作数,指令执行的时间不同:
存储器 立即数 寄存器
快!
13
§ 5.2 寻址方式
讨论内容:
? 寻找操作数所在地址的方法
? 寻找程序转移的目标地址
本节讨论
14
一、立即寻址
? 指令中的源操作数是立即数,即源操作数是参
加操作的数据本身
? 例,MOV AX,1234H
12H
34H
AH AL
MOV
代
码
段
┇
15
二、直接寻址
? 指令中直接给出操作数的
偏移地址
? 例,MOV AX,[1200H]
22H
11H
1200H
偏移地址 ┇
数
据
段
AH AL
16
直接寻址
? 直接寻址方式下,操作数的段地址默认为
数据段,但允许段重设,即由指令定义段。
? 例,MOV AX,ES,[1200H]
17
三、寄存器寻址
? 参加操作的操作数在 CPU的通用寄存器中。
? 例,MOV AX,BX
AX BX
18
四、寄存器间接寻址
? 参与操作的操作数存放在内存中,其偏移
地址为指令中的寄存器的内容。
例,MOV AX,[BX]
19
寄存器间接寻址
? 例:
设( BX) =1200H
则执行 MOV AX,[BX]后
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
§ 5.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,0105 MOV AL,2AH
109E,0107 MOV [DI],AL
109E,0109 INC DI
109E,010A DEC CX
109E,010B JNZ 0107H
109E,010D 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
压栈指令 PUSH
? 设 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
44
交换指令
? 格式:
XCHG REG,MEM/REG
? 两操作数必须有一个是寄存器操作数
? 不允许使用段寄存器
? 例,XCHG AX,BX
XCHG [2000],CL
45
查表指令
? 格式:
XLAT
? 说明:用 BX的内容代表表格首地址,AL内容
为表内位移量,BX+AL得到要查找元素的偏
移地址
? 操作,[BX+AL] AL
46
查表指令例
? 数据段中存放有一张 ASCII码转换表, 设
首地址为 2000H,现欲查出表中第 11个代
码的 ASCII码
( 设 DS=4000H)
47
查表指令例
30
31
32
...
39
41
42
...
45
46...
42000H+0
42000H+11
‘0’
‘1’
‘2’
‘9’
‘A’
‘B’
‘E’
‘F’
48
查表指令例
? 可用如下指令 实现:
MOV BX,2000H ;( BX) ← 表首地址
MOV AL,0BH ;( AL) ← 序号
XALT ; 查表转换
执行后得到:( AL) =42H
49
字位扩展指令
? 将符号数的符号位扩展到高位;
? 指令为零操作数指令,采用隐含寻址,隐含的
操作数为 AX及 AX,DX
? 无符号数的扩展规则为在高位补 0
字节到字的扩展
字到双字的扩展
50
字节到字的扩展指令
? 格式:
CBW
? 操作:将 AL内容扩展到 AX
? 规则:若最高位 =1,则执行后 AH=FFH
若最高位 =0,则执行后 AH=00H
51
字到双字的扩展指令
? 格式:
CWD
? 操作:将 AX内容扩展到 DX AX
? 规则:若最高位 =1,则执行后 DX=FFFFH
若最高位 =0,则执行后 DX=0000H
52
字位扩展指令例
MOV AL,44H
CBW
MOV AX,0AFDEH
CWD
MOV AL,86H
CBW
执行
结果
?
53
2,输入输出指令
? 专门面向 I/O端口操作的指令
掌握:
? 指令的格式及操作
? 指令的两种寻址方式
? 指令对操作数的要求
54
输入输出指令
指令格式:
? 输入指令 IN acc,PORT
? 输出指令 OUT PORT,acc
端口地址 累加器
55
指令寻址方式
? 直接寻址
? 直接给出 8位端口地址,可寻址 256个端口
? 间接寻址
16位端口地址由 DX指定,可寻址 64K个端口
56
例
? IN AX,80H
? MOV DX,03FFH
? IN AL,DX
? OUT DX,AX
? OUT AL,3FH
57
3,地址传送指令
取偏移地址指令 LEA
LDS指令
LES指令
58
取偏移地址指令 LEA
? 将变量的 16位偏移地址取出送目标寄存器
? 格式:
LEA REG,MEM
? 指令要求 源操作数 必须是一个 存储器操作数,
目标操作数通常是间址寄存器 。
存储器操作数
59
LEA指令
比较下列指令:
? LEA SI,DATA1
MOV SI,DATA1
? MOV BX,[BX]
LEA BX,[BX]
符号
地址
60
LEA指令
┇
┇
┇
DATA1
12H
34H
1100H 88H
77H
BX=1100H
61
LEA指令在程序中的应用
? 将数据段中首地址为 MEM1 的 50个字节
的数据传送到同一逻辑段首地址为 MEM2
的区域存放。编写相应的程序段 。
62
LEA指令在程序中的应用
开 始
取源地址
取目标地址
送数据块长度到 CL
传送一个字节
修改地址指针
修改计数值
计数值 =0?
结 束
N
Y
63
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
64
取远地址指针指令
LDS reg,MEM32
LES reg,MEM32
? 指令中源操作数是存储器某 4个连续单元的偏
移地址,目标操作数是间址寄存器。
65
LDS指令例
? 例:
LDS DI,[1200H]
MOV AX,[DI]
指令执行后:
66
LDS指令例
? DS = 6000H
? DI = 1234H
? AX = 2233H
┇
┇
12H
34H
00H
60H
1200H 数
据
段
1
┇
DS DI
数
据
段
2
33H
22H
61234H
67
LES指令例
? LES DI,[1200H]
? MOV AX,[DI] ┇
┇
12H
34H
00H
60H
1200H
数
据
段
┇
ES DI
附
加
段
33H
22H
61234H
68
4,标志位操作指令
LAHF
SAHF
PUSHF
POPF
隐含操作数 AH
隐含操作数 FLAGS
69
LAHF,SAHF
? LAHF ;将 FLAGS的低 8位装入 AH
? SAHF ;执行与 LAHF相反的操作
CF PFAFZF CF
….
AH
FLAGS
D15 D0
D7 D0
70
PUSHF,POPF
? 针对 FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
71
二、算术运算类指令
加法运算指令
减法运算指令
乘法指令
除法指令
算术运算指令的执行大多
对状态标志位会产生影响
72
1,加法指令
? 普通加法指令 ADD
? 带进位位的加法指令 ADC
? 加 1指令 INC
加法指令对操作数的要求与 MOV指令相同
73
ADD 指令
? 格式:
ADD OPRD1,OPRD2
? 操作:
OPRD1 OPRD1+OPRD2
ADD指令的执行对全部 6个状态标志位都产生影响
74
ADD 指令例
? MOV AL,78H
? ADD AL,0A6H
指令执行后 6个状态标志位的状态 =?
75
ADD 指令例
01111000
+ 10100110
000111101
标志位状态,CF= SF=
AF= ZF=
PF= OF=
76
ADC 指令
? 指令格式、对操作数的要求、对标志位的影响
与 ADD指令完全一样
? 指令的操作:
OPRD1 OPRD1+OPRD2+CF
ADC指令多用于多字节数相加运算
77
INC 指令
? 格式:
INC OPRD
? 操作:
OPRD OPRD+1
常用于在程序中修改地址指针
不能是段寄
存器或立即
数
78
2,减法指令
? 普通减法指令 SUB
? 考虑借位的减法指令 SBB
? 减 1指令 DEC
? 比较指令 CMP
? 求补指令 NEG
减法指令对操作数的要求与对应的加法指令相同
79
SUB 指令
? 格式:
SUB OPRD1,OPRD2
? 操作:
OPRD1 OPRD1- OPRD2
对标志位的影响与 ADD指令同
80
SBB 指令
? 指令格式、对操作数的要求、对标志位的影响
与 SUB指令完全一样
? 指令的操作:
OPRD1 OPRD1- OPRD2- CF
SBB指令多用于多字节数相减运算
81
DEC 指令
? 格式:
DEC OPRD
? 操作:
OPRD OPRD – 1
指令常用于在程序中修改计数值,其对操作数的
要求与 INC指令相同
82
应用程序例
MOV BL,2
NEXT1, MOV CX,0F000H
NEXT2,DEC CX
JNZ NEXT2
DEC BL
JNZ NEXT1
HLT
83
NEG 指令
? 格式:
NEG OPRD
? 操作:
OPRD 0 – OPRD
用 0减去操作数,相当于对该操作数求补码
8/16位寄存器或
存储器操作数
84
CMP 指令
? 格式:
CMP OPRD1,OPRD2
? 操作:
OPRD1- OPRD2
指令执行的结果不影响目标操作数!
85
CMP 指令
? 用途:
用于比较两个数的大小,可作为条件转移指令
转移的条件
? 指令对操作数的要求及对标志位的影响与 SUB
指令相同
86
CMP 指令比较原理
? 两个无符号数的比较:
CMP AX,BX
若 AX > BX CF=0
若 AX < BX CF=1
87
CMP 指令比较原理
? 两个带符号数的比较
CMP AX,BX
两个数的大小由 OF和 SF共同决定
OF和 SF状态相同 AX > BX
OF和 SF状态不同 AX < BX
88
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
程序功能
?
89
程序功能
┇
┇
┇
MAX
BUF XXH
XXH
XXH找 20个数中最大的数,
并将其存放在 MAX单
元中
90
3,乘法指令
无符号的乘法指令 MUL
带符号的乘法指令 IMUL
乘法指令采用隐含寻址,隐含的是存放被乘数的累加
器 AL或 AX及存放结果的 AX,DX;
若运算结果的高位全为 0或 1,表示其为无效数据,
OF=CF=0
91
无符号数乘法指令
? 格式:
MUL OPRD
? 操作:
OPRD为字节数 AX AL× OPRD
OPRD为 16位数 DXAX AX× OPRD
不能是
立即数
92
无符号数乘法指令
MUL BYTE PTR[BX]
┇
BX XXHAL × XXH
AX
93
带符号数乘法指令
? 格式:
IMUL OPRD
IMUL指令将 OPRD视为带符号数,运算时若操
作数为负数,要先将操作数按位取反加 1,运算
后再将结果按位取反加 1 。
94
带符号数乘法指令
设,AL=FEH,CL=11H,求 AL与 CL的乘积
? 若为无符号数, 则 MUL CL
结果,AX=10DEH
? 若将两操作数看作有符号数, 则:
IMUL CL
指令执行后,AX=FFDEH=-34。
95
4,除法指令
无符号除法指令 DIV OPRD
有符号除法指令 IDIV OPRD
若 OPRD是字节数,则执行 AX/OPRD
若 OPRD是双字节数,则执行 DXAX/OPRD
指令要求被除数是除数的双倍字长
AL=商
AH=余数
AX=商
DX=余数
第 5章
指令系统
计算机教学实验中心
第一部分
2
主要内容
? 指令系统的一般概念
? 对操作数的寻址方式
? 六大类指令的操作原理
操作码的格式及功能,指令对操作数的要求,指令对标
志位的响应
3
§ 5.1 概 述
了解:
? 指令及指令系统;
? 指令的格式;
? 指令中的操作数类型。
4
一、指令与指令系统
指令:
控制计算机完成某种操作的命令
指令系统:
处理器所能识别的所有指令的集合
指令的兼容性:
同一系列机的指令都是兼容的。
5
二、指令格式
? 指令中应包含的信息:
运算数据的来源 ( 源操作数 )
运算结果保存到何处 ( 目的操作数 )
执行的操作 ( 操作码 )
例如,Z = X + Y
目的操作数 源操作数 1 操作 源操作数 2
想一想,指令应该包括几个部分?
6
指令格式
操作码 操作数,操作数
执行何种操作 目标操作数 源操作数
参加操作的数据
或数据存放的地址
7
指令格式
? 指令的长度与操作码及操作数的多少和类型有
关
零操作数指令,操作码
单操作数指令,操作码 操作数
双操作数指令,操作码 操作数 1,操作数 2
源 /目的操作数
源 /目的操作数 源操作数
注:两个操作数时,操作数类型要一致。如都是 8位或都是 16位。
8
三、指令中的操作数
立即数,表征参加操作的数据本身
存储器操作数,表征数据存放的地址
寄存器操作数:表征数据存放在哪个寄存器中
隐含操作数:表征数据隐含存放在某个寄存器中
9
立即数操作数
? 源操作数就是参加操作的数据本身,它们可以是 8位或
16位。
例,MOV AX,1234H
MOV BL,22H
? 立即数无法作为目标操作数
? 立即数可以是无符号或带符号数,其值应在允许范围内
? 错误例:
? MOV AX,12345H; MOV 1234H,AX
10
寄存器操作数:
? 表示参加运算的数存放在指令给出的寄存器中,
可以是 16位或 8位。
? 例,MOV AX,BX
MOV DL,CH
想一想:以下指令正确否?
MOV AX,BL
MOV DL,CX
11
存储器操作数
? 表示当前参加运算的数存放在存储器的某一个
或某两个单元中
? 表示形式,[ ]
地址值或寄存器
如,[1234H] 表示操作数在地址为 1234H的存储器单元中
[BX] 表示操作数在以 BX的内容为地址的存储器单元中
指令例,MOV AX,[1234H]
MOV [BX],SI
12
四、指令字长及执行速度
? 指令字长:
由操作码的长度、操作数地址长度、操作数个
数决定;指令的字长影响指令的执行速度
(常用指令的执行时间见表 3-4)
? 对不同的操作数,指令执行的时间不同:
存储器 立即数 寄存器
快!
13
§ 5.2 寻址方式
讨论内容:
? 寻找操作数所在地址的方法
? 寻找程序转移的目标地址
本节讨论
14
一、立即寻址
? 指令中的源操作数是立即数,即源操作数是参
加操作的数据本身
? 例,MOV AX,1234H
12H
34H
AH AL
MOV
代
码
段
┇
15
二、直接寻址
? 指令中直接给出操作数的
偏移地址
? 例,MOV AX,[1200H]
22H
11H
1200H
偏移地址 ┇
数
据
段
AH AL
16
直接寻址
? 直接寻址方式下,操作数的段地址默认为
数据段,但允许段重设,即由指令定义段。
? 例,MOV AX,ES,[1200H]
17
三、寄存器寻址
? 参加操作的操作数在 CPU的通用寄存器中。
? 例,MOV AX,BX
AX BX
18
四、寄存器间接寻址
? 参与操作的操作数存放在内存中,其偏移
地址为指令中的寄存器的内容。
例,MOV AX,[BX]
19
寄存器间接寻址
? 例:
设( BX) =1200H
则执行 MOV AX,[BX]后
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
§ 5.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,0105 MOV AL,2AH
109E,0107 MOV [DI],AL
109E,0109 INC DI
109E,010A DEC CX
109E,010B JNZ 0107H
109E,010D 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
压栈指令 PUSH
? 设 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
44
交换指令
? 格式:
XCHG REG,MEM/REG
? 两操作数必须有一个是寄存器操作数
? 不允许使用段寄存器
? 例,XCHG AX,BX
XCHG [2000],CL
45
查表指令
? 格式:
XLAT
? 说明:用 BX的内容代表表格首地址,AL内容
为表内位移量,BX+AL得到要查找元素的偏
移地址
? 操作,[BX+AL] AL
46
查表指令例
? 数据段中存放有一张 ASCII码转换表, 设
首地址为 2000H,现欲查出表中第 11个代
码的 ASCII码
( 设 DS=4000H)
47
查表指令例
30
31
32
...
39
41
42
...
45
46...
42000H+0
42000H+11
‘0’
‘1’
‘2’
‘9’
‘A’
‘B’
‘E’
‘F’
48
查表指令例
? 可用如下指令 实现:
MOV BX,2000H ;( BX) ← 表首地址
MOV AL,0BH ;( AL) ← 序号
XALT ; 查表转换
执行后得到:( AL) =42H
49
字位扩展指令
? 将符号数的符号位扩展到高位;
? 指令为零操作数指令,采用隐含寻址,隐含的
操作数为 AX及 AX,DX
? 无符号数的扩展规则为在高位补 0
字节到字的扩展
字到双字的扩展
50
字节到字的扩展指令
? 格式:
CBW
? 操作:将 AL内容扩展到 AX
? 规则:若最高位 =1,则执行后 AH=FFH
若最高位 =0,则执行后 AH=00H
51
字到双字的扩展指令
? 格式:
CWD
? 操作:将 AX内容扩展到 DX AX
? 规则:若最高位 =1,则执行后 DX=FFFFH
若最高位 =0,则执行后 DX=0000H
52
字位扩展指令例
MOV AL,44H
CBW
MOV AX,0AFDEH
CWD
MOV AL,86H
CBW
执行
结果
?
53
2,输入输出指令
? 专门面向 I/O端口操作的指令
掌握:
? 指令的格式及操作
? 指令的两种寻址方式
? 指令对操作数的要求
54
输入输出指令
指令格式:
? 输入指令 IN acc,PORT
? 输出指令 OUT PORT,acc
端口地址 累加器
55
指令寻址方式
? 直接寻址
? 直接给出 8位端口地址,可寻址 256个端口
? 间接寻址
16位端口地址由 DX指定,可寻址 64K个端口
56
例
? IN AX,80H
? MOV DX,03FFH
? IN AL,DX
? OUT DX,AX
? OUT AL,3FH
57
3,地址传送指令
取偏移地址指令 LEA
LDS指令
LES指令
58
取偏移地址指令 LEA
? 将变量的 16位偏移地址取出送目标寄存器
? 格式:
LEA REG,MEM
? 指令要求 源操作数 必须是一个 存储器操作数,
目标操作数通常是间址寄存器 。
存储器操作数
59
LEA指令
比较下列指令:
? LEA SI,DATA1
MOV SI,DATA1
? MOV BX,[BX]
LEA BX,[BX]
符号
地址
60
LEA指令
┇
┇
┇
DATA1
12H
34H
1100H 88H
77H
BX=1100H
61
LEA指令在程序中的应用
? 将数据段中首地址为 MEM1 的 50个字节
的数据传送到同一逻辑段首地址为 MEM2
的区域存放。编写相应的程序段 。
62
LEA指令在程序中的应用
开 始
取源地址
取目标地址
送数据块长度到 CL
传送一个字节
修改地址指针
修改计数值
计数值 =0?
结 束
N
Y
63
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
64
取远地址指针指令
LDS reg,MEM32
LES reg,MEM32
? 指令中源操作数是存储器某 4个连续单元的偏
移地址,目标操作数是间址寄存器。
65
LDS指令例
? 例:
LDS DI,[1200H]
MOV AX,[DI]
指令执行后:
66
LDS指令例
? DS = 6000H
? DI = 1234H
? AX = 2233H
┇
┇
12H
34H
00H
60H
1200H 数
据
段
1
┇
DS DI
数
据
段
2
33H
22H
61234H
67
LES指令例
? LES DI,[1200H]
? MOV AX,[DI] ┇
┇
12H
34H
00H
60H
1200H
数
据
段
┇
ES DI
附
加
段
33H
22H
61234H
68
4,标志位操作指令
LAHF
SAHF
PUSHF
POPF
隐含操作数 AH
隐含操作数 FLAGS
69
LAHF,SAHF
? LAHF ;将 FLAGS的低 8位装入 AH
? SAHF ;执行与 LAHF相反的操作
CF PFAFZF CF
….
AH
FLAGS
D15 D0
D7 D0
70
PUSHF,POPF
? 针对 FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
71
二、算术运算类指令
加法运算指令
减法运算指令
乘法指令
除法指令
算术运算指令的执行大多
对状态标志位会产生影响
72
1,加法指令
? 普通加法指令 ADD
? 带进位位的加法指令 ADC
? 加 1指令 INC
加法指令对操作数的要求与 MOV指令相同
73
ADD 指令
? 格式:
ADD OPRD1,OPRD2
? 操作:
OPRD1 OPRD1+OPRD2
ADD指令的执行对全部 6个状态标志位都产生影响
74
ADD 指令例
? MOV AL,78H
? ADD AL,0A6H
指令执行后 6个状态标志位的状态 =?
75
ADD 指令例
01111000
+ 10100110
000111101
标志位状态,CF= SF=
AF= ZF=
PF= OF=
76
ADC 指令
? 指令格式、对操作数的要求、对标志位的影响
与 ADD指令完全一样
? 指令的操作:
OPRD1 OPRD1+OPRD2+CF
ADC指令多用于多字节数相加运算
77
INC 指令
? 格式:
INC OPRD
? 操作:
OPRD OPRD+1
常用于在程序中修改地址指针
不能是段寄
存器或立即
数
78
2,减法指令
? 普通减法指令 SUB
? 考虑借位的减法指令 SBB
? 减 1指令 DEC
? 比较指令 CMP
? 求补指令 NEG
减法指令对操作数的要求与对应的加法指令相同
79
SUB 指令
? 格式:
SUB OPRD1,OPRD2
? 操作:
OPRD1 OPRD1- OPRD2
对标志位的影响与 ADD指令同
80
SBB 指令
? 指令格式、对操作数的要求、对标志位的影响
与 SUB指令完全一样
? 指令的操作:
OPRD1 OPRD1- OPRD2- CF
SBB指令多用于多字节数相减运算
81
DEC 指令
? 格式:
DEC OPRD
? 操作:
OPRD OPRD – 1
指令常用于在程序中修改计数值,其对操作数的
要求与 INC指令相同
82
应用程序例
MOV BL,2
NEXT1, MOV CX,0F000H
NEXT2,DEC CX
JNZ NEXT2
DEC BL
JNZ NEXT1
HLT
83
NEG 指令
? 格式:
NEG OPRD
? 操作:
OPRD 0 – OPRD
用 0减去操作数,相当于对该操作数求补码
8/16位寄存器或
存储器操作数
84
CMP 指令
? 格式:
CMP OPRD1,OPRD2
? 操作:
OPRD1- OPRD2
指令执行的结果不影响目标操作数!
85
CMP 指令
? 用途:
用于比较两个数的大小,可作为条件转移指令
转移的条件
? 指令对操作数的要求及对标志位的影响与 SUB
指令相同
86
CMP 指令比较原理
? 两个无符号数的比较:
CMP AX,BX
若 AX > BX CF=0
若 AX < BX CF=1
87
CMP 指令比较原理
? 两个带符号数的比较
CMP AX,BX
两个数的大小由 OF和 SF共同决定
OF和 SF状态相同 AX > BX
OF和 SF状态不同 AX < BX
88
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
程序功能
?
89
程序功能
┇
┇
┇
MAX
BUF XXH
XXH
XXH找 20个数中最大的数,
并将其存放在 MAX单
元中
90
3,乘法指令
无符号的乘法指令 MUL
带符号的乘法指令 IMUL
乘法指令采用隐含寻址,隐含的是存放被乘数的累加
器 AL或 AX及存放结果的 AX,DX;
若运算结果的高位全为 0或 1,表示其为无效数据,
OF=CF=0
91
无符号数乘法指令
? 格式:
MUL OPRD
? 操作:
OPRD为字节数 AX AL× OPRD
OPRD为 16位数 DXAX AX× OPRD
不能是
立即数
92
无符号数乘法指令
MUL BYTE PTR[BX]
┇
BX XXHAL × XXH
AX
93
带符号数乘法指令
? 格式:
IMUL OPRD
IMUL指令将 OPRD视为带符号数,运算时若操
作数为负数,要先将操作数按位取反加 1,运算
后再将结果按位取反加 1 。
94
带符号数乘法指令
设,AL=FEH,CL=11H,求 AL与 CL的乘积
? 若为无符号数, 则 MUL CL
结果,AX=10DEH
? 若将两操作数看作有符号数, 则:
IMUL CL
指令执行后,AX=FFDEH=-34。
95
4,除法指令
无符号除法指令 DIV OPRD
有符号除法指令 IDIV OPRD
若 OPRD是字节数,则执行 AX/OPRD
若 OPRD是双字节数,则执行 DXAX/OPRD
指令要求被除数是除数的双倍字长
AL=商
AH=余数
AX=商
DX=余数