1
第 3章
8086/8088指令系统
mov ax,12h
call display
Jmp 1234h
2
主要内容:
指令系统的一般概念
对操作数的寻址方式
六大类指令的操作原理:
操作码的含义指令对操作数的要求指令执行的结果
3
3.1 概述指令 —— 控制计算机完成指定操作的命令机器指令 —— 指令的二进制代码形式。例如,CD21H
汇编指令 —— 助记符形式的指令。例如,INT 21H
指令系统 —— CPU所有指令及其使用规则的集合
8088/8086指令系统,
( 1) 指令向后兼容( x86系列)
( 2)应用广泛,资料易于寻找
4
指令 按功能分为六大类 ( 92种)
( 1) 数据传送类;
( 2) 算术运算类;
( 3) 逻辑运算和移位;
( 4) 串操作;
( 5) 控制转移类;
( 6) 处理器控制 。
5
3.1.1 指令的基本构成说明 要执行的是什么操作操作对象,可以有 0个,1个或 2个目的 源
6
指令举例:
ADD AX,[SI+6]
MOV AX,BX
操作码 操作数
INC [BX]
HLT
7
部分 8088常用指令指令类型 助记符数据传送数据传送 MOV,PUSH/POP,XCHG等地址传送 LEA,LDS,LES
输入输出 IN,OUT
算术运算加法 ADD,ADC,INC
减法 SUB,SBB,DEC,NEG,CMP
乘 /除法 MUL,IMUL,DIV,IDIV
逻辑 AND,OR,NOT,XOR,TEST
移位 SHL/SHR/SAR,ROL/ROR,RCL/RCR
串操作 MOVS,CMPS,SCAS,LODS,STOS
控制转移 JMP,JXX,LOOP,CALL/RET,INT/IRET
8
8088/8086的操作数分为 3类
1,立即数(常数)
取值范围如下表:
8位 16位无符号数 00H-FFH(0-255) 0000H-FFFFH(0-65535)
带符号数 80H-7FH(-128~127) 8000H-7FFFH(-32768~32767)
MOV AX,0FA00H ;正确
MOV 8000H,DX ;错误
9
2,寄存器操作数放在 8个 通用寄存器 或 4个 段寄存器 中的操作数 16 位
AX AH AL
16 位
BX BH BL
16 位
CX CH CL
16 位
DX DH DL
10
只能存放字操作数段寄存器存放当前操作数的段基地址不允许将立即数传送到段寄存器
SI
DI
BP
SP
CS
DS
ES
SS
11
3,存储器操作数存储器操作数字节字双字
1
2
4
类型 存储单元个数一般 不允许 两个 操作数同时为存储器操作数
12
存储单元的 物理地址 = 段基地址 + 偏移地址
若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。
表 3.3 段寄存器使用的一些基本约定存储器操作数的偏移地址(也称有效地址)可以通过不同的寻址方式由指令给出。
例如,若 (BX)=2000H,(SI)=0A00H,(DI)=2A00H,则以下指令的结果是一样的:
MOV AL,[2A00H]
MOV AL,[BX+0A00H]
MOV AL,[BX][SI]
MOV AL,[DI]
13
一条指令的执行时间 =∑
3.1.2 指令的执行时间取指令取操作数执行指令传送结果单位用时钟周期数表示表 3.4 常用指令执行时间结论:
1)尽量使用寄存器作为操作数
2)若有可能,用移位代替乘除法
3)尽量使用简单的寻址方式
14
寻址方式 —— 寻找操作数的方法
寻找操作数的地址 (一般指源操作数)
寻找要执行的下一条指令的地址在 8086指令系统中,说明操作数所在地址的寻址方式可分为 8种,
① 立即寻址 ⑤ 寄存器相对寻址
② 直接寻址 ⑥ 基址 -变址寻址
③ 寄存器寻址 ⑦ 相对的基址 -变址寻址
④ 寄存器间接寻址 ⑧ 隐含寻址
3.2 8086的寻址方式
15
操作数 (为一常数 )直接 由指令给出
(此操作数称为立即数 )
立即寻址只能用于源操作数
例:
MOV AX,1C8FH
MOV BYTE PTR[2A00H],8FH
错误例:
× MOV 2A00H,AX ; 错误!
3.1.2 立即寻址
16
立即数操作码低 8位高 8位存储器
MOV操作码
02H
31H
AH AL
代码段代码段立即寻址指令在存储器中的存放形式
AX
指令操作例,MOV AX,3102H ; AX 3102H
执行后,(AH) = 31H,(AL) = 02H
17
3.2.2 直接寻址
指令 中直接给出操作数的 16位偏移地址偏移地址也称为有效地址 (EA,Effective Address)
默认的段寄存器为 DS,但也可以显式地指定其他段寄存器 —— 称为段超越前缀
偏移地址也可用 符号地址 来表示,如 ADDR,VAR
例:
MOV AX,[2A00H]
MOV DX,ES,[2A00H]
MOV SI,TABLE_PTR
18
指令操作例,MOV AX,[3102H]
AL (3102H),AH (3103H)
如果 (DS)=2000H,(23012H) = CDH,(23013H) = ABH
则 操作数 的 物理地址 为,
20000H+3102H = 23102H
指令执行后,(AX) = ABCDH MOV操作码
02H
31HAH AL
23102H CDH
ABH
存储器代码段数据段
..
19
3.2.3 寄存器寻址
操作数放在某个寄存器中
源操作数与目的操作数字长要相同
寄存器寻址与段地址无关
例:
MOV AX,BX
MOV [3F00H],AX
MOV CL,AL
错误例:
× MOV AX,BL ; 字长不同
× MOV ES,AX,DX ; 寄存器与段无关
20
AX
SI
2233H
指令操作例,MOV SI,AX ; SI (AX)
指令执行前,(AX)=2233H
指令执行 后,(AX)=2233H,(SI)=2233H
21
3.2.4 寄存器间接寻址
操作数 的 偏移地址 (有效地址 EA)放在 寄存器 中
只有 SI,DI,BX和 BP可作间址寄存器
例,MOV AX,[BX]
MOV CL,CS:[DI]
错误例,
× MOV AX,[DX]
× MOV CL,[AX]
EA =
(BX)
(BP)
(SI)
(DI)
22
指令操作例,MOV AX,[SI]
若 (DS)=6000H,(SI)=1200H,(61200H)=44H,(61201H)=33H
则指令执行后,(AX)=3344H。
44H
33H
6000 1200
DS SI
60000
61200 61200H
AX
存储器数据段
+) 1200
44H33H
23
3.2.5 寄存器相对寻址
EA=间址寄存器的内容加上一个 8/16位的位移量寄存器相对寻址 常用于存取表格或一维数组中的元素 ——把 表格的起始地址作为位移量,元素的下标值放在间址寄存器中 (或反之)
EA =
(BX)
(BP)
(SI)
(DI)
+ 8位16位 位移量
24
例,MOV AX,[BX+8]
MOV CX,TABLE[SI]
MOV AX,[BP+1000H] ; 默认段寄存器为 SS
指令操作例,MOV AX,DATA[BX]
若 (DS)=6000H,(BX)=1000H,DATA=2A00H,
(63A00H)=66H,(63A01H)=55H
则物理地址 = 60000H + 1000H + 2A00H = 63A00H
指令执行后,( AX) =5566H
( 见下页图示 )
25
操作码
00 偏移量低
2A 偏移量高
DS 6000
BX 1000
+ DATA 2A00
63A00 63A00H
AH ALAX
代码段数据段
..
.
..
.
..
.
66H
55H
MOV AX,DATA[BX]
26
3.2.6 基址 -变址寻址
若操作数的偏移地址:
由 基址寄存器 (BX或 BP)给出 —— 基址寻址方式由 变址寄存器 (SI或 DI)给出 —— 变址寻址方式
由一个基址寄存器 的内容和一个变址寄存器 的内容相加而形成操作数的偏移地址,称为 基址 -变址寻址。
EA = (BX)(BP) + (SI)(DI)
同一组内的寄存器不能同时出现 。
27
例:
MOV AX,[BX] [SI]
MOV AX,[BX+SI]
MOV AX,DS,[BP] [DI]
错误例:
× MOV AX,[BX] [BP]
× MOV AX,[DI] [SI]
28
83000
操作码DS 8000
BX 2000
+ SI 1000
83000H
AH ALAX
代码段数据段
..
.
..
.
..
.
YY
XX
指令操作例,MOV AX,[BX][SI]
假定,(DS)=8000H,(BX)=2000H,SI=1000H
则物理地址 = 80000H + 2000H + 1000H = 83000H
指令执行后,(AL)=[83000H]
(AH)=[83001H]
29
3.2.7 相对的基址 -变址寻址
在 基址 -变址寻址的基础上再加上一个相对位 移量
注意事项同 基址 -变址寻址
EA = (BX)(BP) + (SI)(DI) + 8位16位 位移量
例,MOV AX,BASE [SI] [BX]
MOV AX,[BX+BASE] [SI]
MOV AX,[BX+SI+BASE]
MOV AX,[BX] BASE [SI]
MOV AX,[BX+SI] BASE
30
指令 操作例,MOV AX,DATA[DI][BX]
若 (DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H
则指令执行后 (AH)=[83021H],(AL)=[83020H]
83200
83200H
AH ALAX
+ DATA 0200
操作码 代码段数据段
..
.
..
.
..
.
YY
XX
DS 8000
BX 2000
DI 1000
31
使用相对的基址 -变址寻址方式可以很方便地访问二维数组 。
基址寄存器数组首地址变址寄存器数组元素 行 址位移量数组元素 列 址
(偏移地址)
二维数组例:内存图示(按行存储)
(行位移地址)
(行内元素下标)
1 8 3
2 5 2
4 0 9
A =
32
3.2.8 隐含寻址
指令操作数是隐含的,在指令中未显式地指明。
例,MUL BL
指令隐含了被乘数 AL及乘积 AX
类似的指令还有,DIV,CBW,MOVS等
( AL)×( BL) →AX
33
小结
指令由( )和( )构成
如何取得操作数 —— 称为( )
操作码 操作数寻址方式
34
寻址方式可分为立即寻址直接寻址寄存器相对寻址寄存器寻址基址 -变址寻址基址 -变址相对寻址寄存器间接寻址
35
寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:
寻址方式 指令操作数形式
寄存器间接 只有一个寄存器( BX/BP/SI/DI之一)
寄存器相对 一个寄存器加上位移量
基址 — 变址 两个不同类别的寄存器
相对基址 -变址 两个不同类别的寄存器加上位移量