【汇编语言】3. 8086指令系统
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)
\]