8086 全部指令功能可分成六大类:
- 数据传送指令
- 算术运算指令
- 逻辑指令
- 串操作指令
- 控制转移指令
- 处理器控制指令
1. 数据传送指令
负责将数据、地址或立即数传送到寄存器或存储单元中。
1.1. 通用数据传送指令
(1)MOV 传送指令
格式:
MOV DST,SRC
执行操作:
将 SRC 中的值赋给 DST
\[ (DST)=(SRC) \]
制约条件:
其中,\(DST\) 是 目的操作数,\(SRC\) 是 源操作数,它们应该具有相同的位数,且符合如下制约规则:
目的操作数(DST) | 源操作数(SRC) |
---|---|
存储器 | 立即数 |
通用寄存器 | 立即数 |
存储器 | 通用寄存器 |
通用寄存器 | 存储器 |
通用寄存器 | 通用寄存器 |
存储器 | DS、ES、SS |
DS、ES、SS | 存储器 |
通用寄存器 | DS、ES、SS |
DS、ES、SS | 通用寄存器 |
CS | 存储器 |
CS | 通用寄存器 |
(2)XCHG 交换指令
格式:
XCHG OPR1,OPR2
执行操作:
OPR1 和 OPR2 中的值进行互换
\[ (OPR1)↔(OPR2) \]
制约条件:
- 两个操作数至少有一个为寄存器
- 不能使用段寄存器
- 两个操作数具有相同位数
1.2. 堆栈操作指令
(1)PUSH 进栈指令
格式:
PUSH SRC
执行操作:
移动指针 SP,将 SRC 的值压入栈顶
\[ (SP)=(SP)-2\\ ((SP)+1,SP)=(SRC) \]
制约条件:
- SRC 不能为立即数
(2)POP 出栈指令
格式:
POP DST
执行操作:
将 栈顶 的值赋给 DST,移动指针 SP
\[ (DST)=((SP)+1,SP)\\ (SP)=(SP)+2 \]
制约条件:
- DST 不能为立即数
- 不能使用 CS 寄存器
1.3. 标志传送指令
(1)LAHF 读标志指令
格式:
LAHF
执行操作:
将 FLAGS 的低八位赋给 AH
\[ (AH)=(FLAGS)_{1-8} \]
(2)SAHF 读标志指令
格式:
SAHF
执行操作:
将 AH 赋给 FLAGS 的低八位
\[ (FLAGS)_{1-8}=(AH) \]
(3)PUSHF 标志进栈指令
格式:
PUSHF
执行操作:
将 FLAGS 的值进栈
\[ (SP)=(SP)-2\\ ((SP)+1,(SP))=(FR) \]
(4)POPF 标志出栈指令
格式:
PUSHF
执行操作:
将出栈值赋给 FLAGS
\[ (FR)=((SP)+1,(SP))\\ (SP)=(SP)+2 \]
1.4. 地址传送指令
(1)LEA 取有效地址指令
格式:
LEA DST,SRC
执行操作:
\[ (DST)=(SRC) \]
制约条件:
- 源操作数必须是 存储器操作数
- 目的操作数必须是 16位寄存器(不能为段寄存器)
(2)LDS 传送偏移地址及数据段段基址指令
格式:
LDS DST,SRC
执行操作:
\[ (DST)=(SRC)\\ (DS)=((SRC)+2) \]
(3)LES 传送偏移地址及附加段段基址指令
格式:
LES DST,SRC
执行操作:
\[ (DST)=(SRC)\\ (ES)=((SRC)+2) \]
1.5. 输入/输出指令
(1)IN 输入指令
格式:
IN AL,PORT
IN AX,PORT
IN AL,DX
IN AX,DX
执行操作:
\[ (AL)=(PORT)\\ (AX)=(PORT+1,PORT)\\ (AL)=((DX))\\ (AX)=((DX)+1,(DX)) \]
(2)OUT 输出指令
格式:
OUT PORT,AL
OUT PORT,AX
OUT DX,AL
OUT DX,AX
执行操作:
\[ (PORT)=(AL)\\ (PORT+1,PORT)=(AX)\\ ((DX))=(AL)\\ ((DX)+1,(DX))=(AX) \]