第三章 8086的寻址方式和指令系统
2
本章内容
? 8086的寻址方式
? 指令的机器码表示法
? 8086的指令系统
3
§ 3-1 8086的寻址方式
? 指令与指令格式
? 指令寻址方式
4
指令
? 机器指令
? 以二进制代码(机器码)表示指令
? 直接,不易读懂
? 汇编指令
? 以符号形式表示指令
? 易读,需要翻译(汇编)
? 与 CPU相关
5
指令成分
? 操作码(操作的性质)
? 表示指令应完成的具体操作
? 以 助记符 的形式表示
? 操作数(操作的对象)
? 表示指令的操作对象(参与操作的对象)
? 源操作数、目的操作数
6
指令操作数
? 双操作数
OPR DEST,SRC
? 单操作数
OPR DEST
? 无操作数
OPR (隐含操作数)
7
寻址方式及操作数类型
? 寻找指令中所需操作数的方法
? 所需的操作数
? 寄存器 操作数
? 存储器 操作数
? 立即数 操作数
? 输入 /输出端口 操作数
8
指令寻址方式
? 立即数寻址
? 寄存器寻址 #
? 存储器寻址
? 直接寻址
? 寄存器间接寻址
? 变址寻址
? 基址寻址
? 基址变址寻址
? I/O寻址
9
寻址方式 —— 立即数寻址
? 指令中直接给出操作数本身
? 八位 / 十六位的 常数
? 仅用作源操作数的寻址
MOV AX,1000H; AX←1000H
MOV AH,10H; AH←10H
10
寻址方式 —— 立即数寻址
MOV CX,2A50H
11
寻址方式 —— 寄存器寻址
? 所需的操作数在 CPU的寄存器中,指令
中给出该寄存器的名称
? 八位 / 十六位寄存器
? 速度较快
MOV AX,BX; AX← ( BX)
MOV AH,AL; AH← ( AL)
12
寻址方式 —— 直接寻址
? 所需的操作数在存储器中。
? 指令中直接给出操作数所在单元的 有效
地址 (段内偏移地址)
MOV AX,[1000H]; AX← (DS:1000H)
MOV [1000H],AH; DS:1000H←(AH)
13
寻址方式 —— 直接寻址
MOV AX,[2000H]
14
寻址方式 —— 寄存器间接寻址
? 所需的操作数在存储器中。
? 操作数所在单元的 有效地址 存放在寄存
器中,指令中给出寄存器的名称
? 仅限于 BX,BP,SI,DI
MOV AX,[BX]; AX← (DS:(BX))
MOV AH,[BP]; AH← ( SS:(BP))
15
寻址方式 —— 寄存器间接寻址
MOV BX,[SI]
16
寻址方式 —— 变址寻址
? 所需的操作数在存储器中
? 变址寄存器,SI,DI
? 操作数所在单元的 有效地址
? 变址寄存器内容
? 指令中给出的相对位移
MOV AX,2[DI]; AX← (DS:(DI)+2)
MOV AX,[DI+2]; AX← (DS:(DI)+2)

17
寻址方式 —— 变址寻址
MOV BX,COUNT[SI]
18
寻址方式 —— 基址寻址
? 所需的操作数在存储器中。
? 基址寄存器,BX,BP
? 操作数所在单元的 有效地址
? 基址寄存器内容
? 指令中给出的相对位移
MOV AX,2[BX]; AX← (DS:(BX)+2)
MOV AX,[BX+2]; AX← (DS:(BX)+2)

19
寻址方式 —— 基址变址寻址
? 所需的操作数在存储器中。
? 操作数所在单元的 有效地址,
? 基址寄存器内容
? 变址寄存器内容
? 指令中给出的相对位移
MOV AX,2[BX][DI];
AX← (DS:(BX)+(DI)+2)

20
寻址方式 —— 基址变址寻址
MOV AX,[BX][SI]
21
寻址方式 —— 基址变址寻址
MOV AX,MASK[BX][SI]
22
寻址方式 —— 存储器寻址小结
? 指令中给出地址表达式,有效地址 EA
? 由三部分组成(可选)
? 相对位移 Disp
? 基址寄存器 BX/BP
? 变址寄存器 SI/DI
23
寻址方式 —— 输入 /输出寻址
? 输入输出端口操作数
? 直接寻址
? 指令中直接给出 I/O端口地址的低八位,只
能访问 256个 I/O端口 (00H~FFH)
IN AL,2FH
? 间接寻址
? 用寄存器 DX的内容来指定 I/O端口地址
? 适用十六位地址,能访问 64K个 I/O端口
(0000H~FFFFH)
IN AL,DX
24
§ 3-2 指令的机器码表示法
? 机器码
? 二进制机器语言指令
? 变长指令指令
? 指令的长度为 1~6个字节
? 操作码
? 操作数
? 字 /字节
? 寄存器,.,
25
指令编码
? MOV SP,BX
26
指令编码
? MOV Word ptr [BX+2100H],0FA50H
27
§ 3-3 8086的指令系统
? 数据传送指令
? 算术运算指令
? 逻辑运算及移位指令
? 字符串处理指令
? 控制转移指令
? 处理器控制指令
28
数据传送指令
? 共 14条
? 寄存器 ←→ 寄存器
? 寄存器 ←→ 存储器
? 累加器 ←→ I/O端口
? 字传送 /字节传送
? 除了 SAHF/POPF外,均不影响 PSW
29
数据传送指令
? 通用数据传送指令
? 输入输出指令
? 地址目标传送指令 #
? 标志传送指令
30
通用数据传送指令
? MOV DEST,SRC
? PUSH SRC
? POP DEST
? XCHG DEST,SRC
? XLAT
31
通用数据传送 —— MOV
32
通用数据传送 —— MOV
? 规则
? 立即数不能作 DEST
? 立即数不能传至段寄存器
? 存储器之间不能交互 (双操作数时 )(串除外 )
? 段寄存器之间不能交互
? CS不能作为 DEST
? IP不能参与传送
? DEST和 SRC的类型必须一致
33
通用数据传送 —— PUSH/POP
? 字操作
? 16位操作数
? 通用寄存器
? 段寄存器 (CS不能用于 POP)
? 存储器
? FILO
? SP指向栈顶
? 底部高地址 /顶部低地址
34
通用数据传送 —— XCHG
? 8位 /16位操作数交换
? 寄存器 ←→ 寄存器
? 寄存器 ←→ 存储器
? 段寄存器不能参与
35
通用数据传送 —— XLAT
? 查表
? ( DS× 10H + (BX) + (AL) ) → AL
? BX:表首
? AL:表内偏移值 (自变量 )
36
输入输出指令
? 累加器 AX/AL←→I/O 端口
? 输入指令 IN
? 输出指令 OUT
37
输入输出指令 —— IN
? IN AL,34H ;(34H)→AL
? IN AX,34H ;(34H)→AL;(35H)→AH
? IN AL,DX ;((DX))→AL
? IN AX,DX ;((DX))→AL;((DX)+1)→AH
38
地址目标传送指令
? LEA DEST,SRC
? LDS DEST,SRC
? LES DEST,SRC
? 其中
? DEST:16位通用寄存器 (除了段寄存器 )
? SRC:存储器操作数 (地址表达式 )
39
地址目标传送 —— LEA
? LEA BX,1000H[BX][SI]
1000H + (BX) + (SI) → BX
有效地址 (段内偏移地址 )
40
地址目标传送 —— LDS
? LDS SI,1000H[BX][SI]
41
地址目标传送 —— LES
? LES DI,1000H[BX][SI]
42
标志传送指令
? LAHF
? SAHF
? PUSHF
? POPF
? 隐含操作数
? 影响 PSW
43
算术运算指令
? 操作数
? 带符号二进制数 (补码 )
? 无符号数二进制数
? 无符号压缩十进制数
? 无符号非压缩十进制数
44
算术运算指令
? 加法
? 减法
? 乘法
? 除法
45
加法运算指令
? ADD DEST,SRC
? ADC DEST,SRC
? INC DEST
? AAA
? DAA
46
减法运算指令
? SUB DEST,SRC
? SBB DEST,SRC
? DEC DEST
? NEG DEST
? CMP DEST,SRC
? AAS
? DAS
47
乘法运算指令
? MUL SRC
? IMUL SRC
? AAM
48
除法运算指令
? DIV SRC
? IDIV SRC
? AAD
? CBW
? CWD
49
逻辑运算及移位指令
? 逻辑运算
? 算术移位
? 循环移位
50
逻辑运算
按位运算
? NOT DEST ;不影响标志位
? AND DEST,SRC
? OR DEST,SRC CF/OF→0
? XOR DEST,SRC AF无效
? TEST DEST,SRC ZF/SF/PF有效
51
算术移位
? SHL DEST,计数值
? SHR DEST,计数值
? SAR DEST,计数值
? 计数值大于 1时,必须使用 CL作计数器
0 CF
0 CF
CF
52
循环移位
? ROL DEST,计数值
? ROR DEST,计数值
? RCL DEST,计数值
? RCR DEST,计数值
CF
CF
CF
CF
53
串处理指令 (串操作 )
? 批量数据处理
? 串
? 一系列存放在存储器中的字或字节数据
? 最大串长 64KB
? 串元素
? 串中的成员
? 每种串操作指令只对串中的元素作同一种操作
54
串处理指令 (串操作 )
55
串处理指令 (串操作 )
? 串指令的操作
? 源串位于 DS段内 (可以使用段前缀 ),偏移量由 SI
给出
? 目的串位于 ES段内 (不允许使用段前缀 ),偏移量
由 DI给出
? 每次执行后修正 SI/DI,增减方向由 DF确定
(DF=1:减量 ;DF=0:增量 )。 (STD/CLD)
? 串的长度 (字节 /字数 )存放在 CX中
? 可以在存储器之间操作
56
串处理指令 (串操作 )
? 串操作
? 单次操作
? 按指令内容执行一次操作
? 修正 SI/DI
? 重复操作
? REP前缀
? 重复指令串指令规定的操作,直至次数到或条件成立
? 如 REP MOVS
57
串处理指令 (串操作 )
? MOVS
? ((DS)× 10H+(SI))→((ES) × 10H+(DI))
? if DF=1 then (SI) - 1→SI,(DI) - 1→DI
else (SI) + 1→SI,(DI) + 1→DI
? REP MOVS
? ……
? (CX) - 1→CX
? if (CX) <> 0 then REDO else Continue
58
串处理指令 (串操作 )
? CMPS串比较
? SCAS串扫描指令
? 将 AX(或 AL)中的数据与目标串中的数据比较
? 用作数据搜索
? LODS数据串装入
? 将源串中的数据 (单个 )装入 AX(或 AL)中
? 重复前缀无实际意义
? STOS串存储
? 将 AX(或 AL)中的数据存入目的串单元中
? 可加重复前缀
59
串处理指令 (串操作 )
? 重复前缀
? REP
? REPE/REPZ
? REPNE/REPNZ
60
控制转移指令
? 程序转移
? 改变 CS:IP(或 IP)
? JMP/J××
? CALL/RET
? LOOP/LOOP××
61
控制转移指令 —— 无条件转移
? JMP 目标
62
控制转移指令 —— 无条件转移
? JMP DWORD PTR [SI+0125H]
(CS)=1200H,(IP)=0005H
(DS)=2500H,(SI)=1300H
(26425H)=4500H,(26427H)=32F0H
63
控制转移指令 —— 无条件转移
64
控制转移指令 —— 子程序调用
? CALL 过程名
? 断点入栈 → 转移 (改变 CS:IP)
? RET
? 断点出栈 → CS:IP
? CALL
? 段内 /段间
? 直接 /间接
65
控制转移指令 —— 子程序调用
? 段内直接
? 目标地址的 偏差 在指令中
? CALL PROG_G
(CS)=2000H,(IP)=1050H
(SS)=5000H,(SP)=0100H
DISP=1234H
IP←(IP) + DISP
66
控制转移指令 —— 子程序调用
67
控制转移指令 —— 子程序调用
? 段内间接
? CALL BX
? 目标地址在寄存器中
? CALL WORD PTR [BX+SI]
? 目标地址在存储器中
68
控制转移指令 —— 子程序调用
? 段间直接
? 目标地址在指令中
? CALL FAR PTR PROG_F
(CS)=1000H,(IP)=205AH
(SS)=2500H,(SP)=0050H
PROG_F位置 (CS)=3000H,(IP)=0500H
69
控制转移指令 —— 子程序调用
70
控制转移指令 —— 子程序调用
? 段间间接
? CALL DWORD PTR [BX]
? 目标地址存放在存储器中
71
控制转移指令 —— 条件转移
? 根据标志寄存器的状态来决定是否转移
? 相对转移
? 在 IP上 叠加 位移 (八位 )
? 段内
? J×× 目标
72
控制转移指令 —— 条件转移
73
控制转移指令 —— 条件转移
74
控制转移指令 —— 循环
? 重复执行循环体内的指令
? LOOP 目标
? CX为循环次数
? 相对转移
75
控制转移指令 —— 循环
? LOOP
? LOOPE/LOOPZ
? LOOPNE/LOOPNZ
? JCXZ
76
处理器控制指令
77
课堂练习
( a ) P OP CS ( )
( b) P U SH W OR D P T R 2 0 [ B X + SI - 2 ] ( )
( c ) LEA DS, 4 [ B X ] ( )
( d) J M P B Y T E P T R [ B X ] ( )
( e ) R OR A X,5 ( )
( f ) M OV B Y T E P T R [ B X ], 1000 ( )
( g ) C M P [ D I ], [ SI ] ( )
( h) M OV [ B X ] [ B P ], AX ( )
( i) M OV DS, 1000 ( )
(j) N OT CX, AX ( )
78
课堂练习
( DS ) = 020 0H ( SS ) = 030 0H ( BX ) = 002 6H
( BP ) = 002 6H ( DI ) = 002 2H ( 02048H ) = 001 6H
( 020 4A H ) = 040 0H ( 02050H ) = 003 4H ( 03050H ) = 001 2H
( 0 3048 H ) = 0 8 00H ( 030 4A H ) = 00 20 H ( 020 52 H ) = 0 1 02H
执行下列程序段后,请指出寄存器 DS, SS, AX, BX, CX, DX, SI, DI
的内容。
M OV AL, [ B X + D I + 08H ]
M OV AH, [ B P + D I + 08H ]
L D S SI, [ B X + D I ]
LEA CX, [ B X + SI + 10H ]
M OV [ B X + SI + 10H ], CX
X C HG DX, [ B X + SI + 10H ]