8086 指令系统总结
8086 CPU 指令按功能分为以下几类:
一、数据传送指令
| 指令 | 格式 | 说明 |
|---|---|---|
| MOV | mov dst, src | 数据传送(寄存器/内存/立即数) |
| PUSH | push src | 数据压栈(SP -= 2) |
| POP | pop dst | 数据出栈(SP += 2) |
| PUSHF | pushf | 标志寄存器压栈 |
| POPF | popf | 标志寄存器出栈 |
| XCHG | xchg op1, op2 | 两操作数互换 |
| IN | in al/ax, port | 从端口读数据 |
| OUT | out port, al/ax | 向端口写数据 |
二、算术运算指令
| 指令 | 格式 | 说明 |
|---|---|---|
| ADD | add dst, src | 加法 |
| ADC | adc dst, src | 带进位加法(dst = dst + src + CF) |
| INC | inc dst | 自增 +1 |
| SUB | sub dst, src | 减法 |
| SBB | sbb dst, src | 带借位减法(dst = dst - src - CF) |
| DEC | dec dst | 自减 -1 |
| NEG | neg dst | 取负(求补码) |
| CMP | cmp op1, op2 | 比较(op1-op2,只影响标志,不保存结果) |
| MUL | mul src | 无符号乘法(8位:AX=ALsrc;16位:DX:AX=AXsrc) |
| IMUL | imul src | 有符号乘法 |
| DIV | div src | 无符号除法(8位:AL=AX/src, AH=余数;16位:AX=DX:AX/src, DX=余数) |
| IDIV | idiv src | 有符号除法 |
三、逻辑运算指令
| 指令 | 格式 | 说明 |
|---|---|---|
| AND | and dst, src | 按位与(常用于清位) |
| OR | or dst, src | 按位或(常用于置位) |
| NOT | not dst | 按位取反 |
| XOR | xor dst, src | 按位异或(常用:xor ax, ax 清零) |
| TEST | test op1, op2 | 按位与,只影响标志(不保存结果) |
四、移位指令
| 指令 | 格式 | 说明 |
|---|---|---|
| SHL | shl dst, 1/cl | 逻辑左移(高位→CF,低位补0) |
| SHR | shr dst, 1/cl | 逻辑右移(低位→CF,高位补0) |
| SAL | sal dst, 1/cl | 算术左移(同 SHL) |
| SAR | sar dst, 1/cl | 算术右移(符号位填充高位) |
| ROL | rol dst, 1/cl | 循环左移 |
| ROR | ror dst, 1/cl | 循环右移 |
| RCL | rcl dst, 1/cl | 带进位循环左移(含 CF) |
| RCR | rcr dst, 1/cl | 带进位循环右移(含 CF) |
五、串操作指令
| 指令 | 说明 |
|---|---|
movsb | 字节传送:DS:SI → ES:DI,SI/DI ±1 |
movsw | 字传送:DS:SI → ES:DI,SI/DI ±2 |
rep movsb | 重复执行 CX 次 movsb |
cld | DF=0,正向传送(地址递增) |
std | DF=1,反向传送(地址递减) |
六、转移指令
无条件转移
| 指令 | 说明 |
|---|---|
jmp 标号 | 短/近跳转(依位移) |
jmp far ptr 标号 | 远跳转(段间) |
jmp 寄存器 | 近跳转(寄存器值→IP) |
jmp word/dword ptr 内存 | 内存间接跳转 |
条件转移(常用)
| 指令 | 条件 | 说明 |
|---|---|---|
je/jz | ZF=1 | 等于/为零 |
jne/jnz | ZF=0 | 不等于/不为零 |
jb/jnae | CF=1 | 无符号小于 |
jnb/jae | CF=0 | 无符号不小于 |
ja | CF=0 且 ZF=0 | 无符号大于 |
jna/jbe | CF=1 或 ZF=1 | 无符号不大于 |
jl/jnge | SF≠OF | 有符号小于 |
jge/jnl | SF=OF | 有符号不小于 |
jg/jnle | ZF=0 且 SF=OF | 有符号大于 |
jle/jng | ZF=1 或 SF≠OF | 有符号不大于 |
js | SF=1 | 为负 |
jns | SF=0 | 不为负 |
jo | OF=1 | 溢出 |
jno | OF=0 | 不溢出 |
jcxz | CX=0 | CX 为零则跳 |
循环与子程序
| 指令 | 说明 |
|---|---|
loop 标号 | CX--,若 CX≠0 则跳 |
call 标号/寄存器/内存 | 调用子程序(压 IP/CS) |
ret | 子程序近返回(pop IP) |
retf | 子程序远返回(pop IP, pop CS) |
七、中断指令
| 指令 | 说明 |
|---|---|
int n | 软中断(触发 n 号中断) |
iret | 中断返回(pop IP, pop CS, popf) |
into | 若 OF=1 则触发 4 号中断 |
sti | IF=1,开中断 |
cli | IF=0,关中断 |
八、伪指令(汇编器指令,不产生机器码)
| 伪指令 | 说明 |
|---|---|
assume cs:seg, ds:seg, ... | 告知编译器段寄存器与段的对应关系 |
segment / ends | 定义段 |
end [标号] | 程序结束,标号为入口 |
db / dw / dd | 定义字节/字/双字数据 |
dup | 重复定义:db 10 dup (0) |
org 地址 | 设置当前偏移地址 |
offset 标号 | 取标号的偏移地址 |
seg 标号 | 取标号的段地址 |
word ptr / byte ptr | 显式指定操作数大小 |
jmp short / near ptr / far ptr | 显式指定跳转类型 |
各章关键指令速查
| 章节 | 核心指令/概念 |
|---|---|
| 02 寄存器 | CS:IP, DS, SS:SP, jmp |
| 03 内存访问 | mov, [bx], push, pop |
| 05 loop | loop, [bx], idata |
| 07 定位方法 | and, or, [bx+idata], [bx+si] |
| 08 数据处理 | word/byte ptr, div, mul |
| 09 转移指令 | jmp (各种), jcxz, loop |
| 10 call/ret | call, ret, retf |
| 11 标志寄存器 | cmp, adc, sbb, movsb, rep, cld/std, pushf/popf |
| 12 内中断 | int n, iret, TF, IF |
| 13 int 指令 | int 10h/21h |
| 14 端口 | in, out, shl, shr |
| 15 外中断 | sti, cli, int 9/16h |
| 16 定址表 | 数据标号, dd, offset, seg |
| 17 BIOS | int 16h, int 13h |