第三章 8086的指令系统
? 8086指令特点
?8086的寻址方式
?8086的指令格式及数据类型
?8086的指令集
3.1 8086指令特点
?1,8086具有灵活的指令格式
?2,8086指令格式中的一对多形式
?3,8086有较强的运算指令
?4,8086指令有极强的寻址能力
?5,8086指令有处理多种数据能力
? 3,2 8086的寻址方式
寻址方式就是指令中用于说明操作数所在
地址的方法
一,8086的寻址方式说明
1,有效地址 EA( Effective Address)
当操作数在内存中时, 指令的地址
码 ( 操作码 ) 给出所访问的 内存单
元的逻辑地址 。 在寻址方式中, 逻
辑地址的形成是由多个分量组合而
成, 该组合地址又叫有效地址 。
2,MOV数据传送指令
其格式为:
MOV 目的操作数, 源操作数
目的操作数和源操作数均可采用不
同的寻址方式, 但两个操作数的类
型必需一致 。
二、寻址方式介绍
1.立即寻址( Immediate addressing)
操作数就在指令中,紧跟在操作码
后面,作为指令一部分存放在内存的
代码段中,这种操作数称为立即数。
例:
MOV AX,34EAH
MOV BL,20
2,寄存器寻址
( Register addressing)
操作数在寄存器中, 指令中源操
作数和目的操作数都可用这种寻址
方式 。
例:
MOV BP,SP
MOV AX,1234H
MOV AL,AH
3,直接寻址 ( Direct addressing)
当指令中的源操作数或目的操
作数, 采用直接给出被访问内存单
元的逻辑地址时, 这种寻址方式称
直接寻址 。
例,
MOV AX,[3E4CH]
MOV [1234H],BL
4、寄存器间接寻址( Register
indirect addressing)
内存单元的逻辑偏移地址通过寄存
器间接给出 。
例,
MOV SI,61A8H
MOV DX,[SI]
5、基址 /变址寻址( Based/Indexed
addressing)
这种寻址方式中提出位移量的概念,
即在寄存器间接寻址给出的偏移地址上,
加一相对位移量 。 位移量是一带符号的 16
位 16进制数 。 当使用 BX或 BP寄存器时,
称基址寻址;使用 SI或 DI寄存器时, 称
变址寻址 。
例,
MOV CX,36H[BX]
MOV - 20[BP],AL
6、基址加变址寻址( Based Indexed
addressing)
它的 EA是由三部分组成的,基址寄存器
BX或 BP的内容加上变址寄存器的内容再加
位移量。物理地址由基址寄存器按规则选
择段寄存器,也可以使用段超越。
例,
MOV AX,8AH[BX][SI]
该例中 EA= 8AH+ ( BX) + ( SI)
物理地址= (DS)× 10H + 8AH + (BX) +
( SI)
7、串寻址( String addressing)
串寻址方式仅在 8086的串指令中
使用。规定源操作数的逻辑地址为
DS:SI;目的操作数的逻辑地址为
ES:DI。当执行串指令的重复操作时,
根据设定的方向标志( DF),SI和
DI会自动调整。
8,I/O(输入 /输出)端口寻址
( I/O port addressing)
当操作数在外部设备时, 使用 I/O指令 。
此时有两种不同的寻址方式访问 I/O端口 。
(1) 直接端口寻址方式。
(2) 采用寄存器间接寻址方式
(3) 输入指令中目的操作数可为 AL或
AX;输出指令中源操作数可为 AL或
AX。
例,
IN AL,25H
MOV DX,3E4H
OUT DX,AL
3,3 8086的指令格式及数据类型
一,8086的操作码
指令由操作码和操作数(地址码)
组成。 8086的指令长度是可变的,一
条指令一般由 1- 6个字节组成(加上
前缀字节,最长可为 7字节)。
二,8086指令中寄存器的编码
8086指令中通常使用一个或两个
操作数,在少数指令中有隐含的第三
个操作数。
三、指令中的操作数
1、单指令操作数
指令助记符 指令的 16进制代
INC AX 40H
INC BX 43H
2,双操作数指令
指令助记符 指令的 16进制代码
MOV AL,04 B004H
MOV AX,04 B80400
3、三个操作数指令
8086指令系统中, 大多数指令中
只有 1- 2个操作数, 但也有少数指
令中有 3个操作数, 不过有一操作数
隐含在操作码中 。
例,ADC AX,BX
该指令完成操作数 AX,BX和 CF位相
加 。
四、指令中的数据类型
?无符号数
?带符号数
?ASCII码
?BCD数(压缩 BCD和非压缩 BCD)
3,4 8086的指令集
8086指令系统按功能可分为 6大类型:
1,数据传输类
2,算术运算类
3,逻辑运算类
4,串操作类
5,程序控制类
6,处理机控制类
一、数据传送指令
? 数据传送指令又可以分成 4种:
l通用数据传送
l累加器专用传送 ( 输入 /输出数据传送 )
l目的地址传送
l标志寄存器转送
指令的共同特点是:
除 POP和 SAHF指令外, 这类指令的
操作结果不会影响 FR寄存器中的标志 。
指令中有两个操作数, 目的操作数
和源操作数, 其执行过程为:目的操
作数 源操作数, 当指令中仅列出一
个操作数时, 另一操作数为隐含 。
1、通用数据传送指令
1),MOV 传送指令
指令格式为,MOV 目的,源
2) PUSH 进栈指令
指令格式为,PUSH 源操作数
其操作过程是:
a,SP- 1,
指示堆栈中可以存放数据的位置, 存源
操作数的高 8位;
b,SP再减 1,
存源操作数的低 8位,完成进栈操作。
3) POP 出栈指令
指令格式为,POP 目的操作数
其操作过程是:
a,将 SS:SP所指示的栈顶处的两个字
节的数据, 弹到目的操作数中;
b,SP+ 2,指示当前栈顶位置, 完成
出栈操作 。
4) XCHG 交换指令
指令格式为:
XCHG 目的操作数,源操作数
操作数不能为立即数;
源和目的不能同时为存储单元;
段寄存器不能作为操作数 。
2、累加器专用传送指令
1) IN 输入指令
指令格式为, IN AL,n
IN AX,n
IN AL,DX
IN AX,DX
2) OUT 输出指令
指令格式为,OUT n,AL
OUT n,AX
OUT DX,AL
OUT DX,AX
? 3) XLAT 换码指令
指令格式为,XLAT
例:建立一个 0- 9的平方表, 求 5
的平方 。
将 0- 9的平方表建立在偏移地址为
2000H的内存中, 如图 。
完成求 5的平方指令序列为:
MOV BX,2000H ;指向平方表的首地址
MOV AL,5 ;将 5换码成 5的平方值
XLAT ;执行换码指令,;平方值在 AL中
3,目标地址传送指令
这类指令有:
1) LEA 有效地址传送到寄存器
2) LDS 装入一个新的物理地址
3) LES 装入一个新的物理地址
4,标志寄存器传送指令
1) LAHF AH 送 FR寄存器的低 8位
2) SAHF FR寄存器的低 8位送 AH
3) PUSHF FR寄存器推入堆栈
4) POPF 从栈顶中弹出存入 FR寄存器
二、算术运算指令
1、算术加法指令
? 1) ADD 算术加法
指令功能:目的地 ?目的操作数+源操作数
2) ADC 带进位算术加法
指令功能:目的地 ?目的操作数+源操作数+ CF
? 3) INC 加 1指令
指令功能:目的地 ?目的操作数+ 1
4) DAA 对压缩 BCD数加法操作的结果进行校正
指令功能:对 AL寄存器的内容进行十进制调整
? 5) AAA 对非压缩 BCD数加法操作的结果进行校正
指令功能:对 AL寄存器的内容进行十进制调整
?2、算术减法指令
1) SUB 算术减法
指令功能:目的地 ?目的操作数-源操作数
2) SBB 带进位算术减法
指令功能:目的地 ?目的操作数-源操作数- CF
3) DEC 减 1指令
指令功能:目的地 ?目的操作数- 1
4) DAS 对压缩 BCD数减法操作的结果进行校正
指令功能:对 AL寄存器的内容进行十进制调整
5) AAS 对非压缩 BCD数减法操作的结果进行校正
指令功能:对 AL寄存器的内容进行十进制调整
6) CMP 比较指令
指令功能:两个操作数相减, 不产生运算结果仅影响标志
7) NEG 取补指令
指令功能,0-目的操作数
3、算术乘法指令
1) MUL 无符号数乘法
指令功能:完成两个操作数相乘
2) IMUL 带符号数乘法
指令功能:完成两个操作数相乘
3) AAM 非压缩 BCD数乘法操作结果校正
指令功能:完成两个非压缩 BCD
数乘法结果的十进制数调整
4、算术除法指令
? DIV 无符号数除法
指令功能:完成两个操作数相除
? IDIV 带符号数除法
指令功能:完成两个操作数相除
另外还有:
CBW 带符号数字节扩展、
CWD 带符号数字扩展、
AAD 非压缩 BCD数除法校正
三、位操作指令
指令的共同点是:
( 1) 可以按二进制位进行操作;
( 2) 逻辑运算指令按逻辑门电路的运算规则,
( 3) 逻辑移位指令有左移和右移, 移出的位都
进入 CF标志
( 4) 因移空位的补充方式不同有多种指令形 式
( 5) 逻辑移位指令中, 移动超过 1次则用 CL寄
存器做计数器
( 6) 执行位操作指令, CF均被清 0
1,逻辑运算指令
? 1) NOT 逻辑求反
指令功能:将 8位,16位寄存器或存储器内容求反
? 2) AND 逻辑与操作
指令功能:将 8位, 16位寄存器或存储器内容和源操
作 数, 与,
? 3) OR 逻辑或操作
指令功能:将 8位,16位寄存器或存储器内容和源操
作数, 或,
? 4) XOR 逻辑异或操作
指令功能:将 8位,16位寄存器或存储器内容和源操
作数, 异或,
? 5) TEST 测试指令
指令 功能:将 8位, 16位寄存器或存储器内容和源操
作数, 与,, 不产生运算结果, 仅影响状态标志
2、逻辑移位指令
1) SHL 逻辑左移
指令功能:将 8位,16位寄存器或存储
器内容左移,移空的位补 0
2) SAL 算术左移
指令功能:将 8位,16位寄存器或存储
器内容左移,移空的位补 0
3) SHR 逻辑右移
指令功能:将 8位,16位寄存器或存储
器内容右移,移空的位补 0
4) SAR 算术右移
指令功能:将 8位,16位寄存器或存储
器内容右移,移空的位由最高位补充。
5) ROL 不带进位循环左移
指令功能:将 8位,16位寄存器或存储
器内容左移,移空的位由移出位补充。
6) ROR 不带进位循环右移
指令功能:将 8位,16位寄存器或存储
器内容右移,移空的位由移出位补充。
7) RCL 带进位循环左移
指令功能:将 8位,16位寄存器或
存储器内容左移,移空的位由 CF
位补充。
8) RCR 带进位循环右移
指令功能:将 8位,16位寄存器或
存储器内容右移,移空的位由 CF
位补充。
四、串处理指令
1、串传送指令
2、串比较指令
3、串搜索指令
4、串装入指令
5、串存储指令
6、指令前缀
REP,REPZ/REPE,REPNZ/REPNE
五、程序控制转移指令
1、无条件转移指令
1)、段内直接转移指令
JMP NEAR PTR 目标地址
JMP SHORT 目标地址
2), 段内间接转移指令
在 JMP指令中, 间接给出转移目标地
址, 即由一个 16位寄存器或由存储
单元寻址目标地址 。
3), 段间直接转移指令
段间转移指令, 意味着寄存器 CS和 IP的值
都要改变, 指令中直接采用汇编中的符号地
址作为直接目标地址 。
4), 段间间接转移指令
段间转移指令, 意味着寄存器 CS和 IP的值
都要改变, 所以间接给出的目标地址, 只能
由存储单元寻址, 也就是说目标地址存放在
连续的 4个存储单元字节中, 低字节两个单元
的内容代替 IP,高字节两个单元的内容代替
CS。
2、条件转移指令
1) 单条件转移指令
① JC ;CF标志为 1,则转移
② JNC ;CF标志为 0,则转移
③ JE/JZ ;ZF标志为 1,则转移
④ JNE/JNZ ;ZF标志为 0,则转移
⑤ JS ;SF标志为 1,则转移
⑥ JNS ;SF标志为 0,则转移
⑦ JO ;OF标志为 1,则转移
⑧ JNO ;OF标志为 0,则转移
⑨ JP/JPE ;PF标志为 1,则转移
⑩ JNP/JPO ;PF标志为 0,则转移
2)用于无符号数的条件转移指令
① JA/JNBE ;高于 /不低于等
于转移, CF∨ ZF= 0
② JNA/JBE ;不高于 /低于等
于转移, CF∨ ZF= 1
③ JB/JNAE ;低于 /不高于等
于转移, CF= 1
④ JNB/JAE ;不低于 /高于等
于转移, CF= 0
3)用于带符号数的条件转移指令
① JG/JNLE;大于 /不小于等于转移,( SF ∨ OF) ∨
ZF= 0
② JGE/JNL;大于等于 /不小于转移, ( SF∨ OF) = 0
③ JL/JNGE;小于 /不大于等于转移, ( SF∨ OF) = 1
④ JLE/JNG;小于等于 /不大于转移,( SF ∨ OF) ∨
ZF= 1
3、循环控制指令
1) LOOP指令
指令格式,LOOP 目标地址
执行该指令, CX- 1,若 CX≠0,转移到目标
地址, 即:
IP← IP+ 8位位移量(带符号扩展到 16位)。
由于指令自动对 CX寄存器做减 1操作,故使
用 LOOP指令前,需将循环操作次数值赋给
CX寄存器。
?2)另外还有,LOOPZ/LOOPE指令、
LOOPNZ/LOOPNE指令,JCXZ指令。
4、子程序调用和返回指令
1) CALL指令
– 段内直接调用
例,CALL NEAR 目标地址
– 段内间接调用
例,CALL WORD PTR [SI]
– 段间直接调用
例,CALL FAR 目标地址
– 段间间接调用
例,CALL WORD PTR [SI]
2),RET 子程序返回指令
和调用指令 CALL 相对应的是返
回指令 RET。 返回指令通常作为
一个子程序或过程的最后一条指
令, 它用以返回到调用这个子程
序的断点处 。
关于 RET n 指令,这条指令称为
带参数返回指令。
5、中断指令和中断返回指令
1) INT n 中断指令
2) INTO 溢出中断指令
3) IRET 中断返回指令
六、处理器控制指令
1、标志控制指令
STC ;使 CF 置 1
CLC ;使 CF 清 0
CMC ;使 CF 取反
STD ;使 DF 置 1
CLD ;使 DF 清 0
STI ;使 IF置 1
CLI ; 使 IF 清 0
2、外同步指令
? HLT 处理器暂停指令
? WAIT 等待指令
? ESC 换码指令 /交权指令
? LOCK 总线封锁指令
? NOP 空操作指令