Files
2026-06-25 00:09:09 +08:00

566 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 附录三:汇编指令集
## 一、数据传送指令
### 1. 通用数据传送指令MOV
**格式:** MOV dst, src
**功能:** 将src的内容传送到dst。
**支持的传送方式:**
| 指令 | 操作 |
|------|------|
| MOV r/m8, r8 | 将8位寄存器传送到8位寄存器/内存 |
| MOV r/m16, r16 | 将16位寄存器传送到16位寄存器/内存 |
| MOV r8, r/m8 | 将8位寄存器/内存传送到8位寄存器 |
| MOV r16, r/m16 | 将16位寄存器/内存传送到16位寄存器 |
| MOV r/m8, i8 | 将8位立即数传送到8位寄存器/内存 |
| MOV r/m16, i16 | 将16位立即数传送到16位寄存器/内存 |
| MOV r8, i8 | 将8位立即数传送到8位寄存器 |
| MOV r16, i16 | 将16位立即数传送到16位寄存器 |
| MOV r/m16, sreg | 将段寄存器传送到16位寄存器/内存 |
| MOV sreg, r/m16 | 将16位寄存器/内存传送到段寄存器 |
**注意:** 立即数不能作为dst不允许直接传送到段寄存器代码段寄存器CS不能作为dst。
### 2. 堆栈操作指令PUSH和POP
**格式:**
```
PUSH src ;将src压入堆栈
POP dst ;从堆栈弹出到dst
```
**功能:** PUSH将16位寄存器/内存入栈POP从堆栈弹出到16位寄存器/内存。
**注意:** 必须16位操作不能压入立即数。
### 3. 交换指令XCHG
**格式:** XCHG opr1, opr2
**功能:** 将两个操作数的内容互换。
**支持的传送方式:**
| 指令 | 操作 |
|------|------|
| XCHG r, r | 两个寄存器互换 |
| XCHG r, m | 寄存器和内存互换 |
### 4. 查表转换指令XLAT
**格式:** XLAT
**功能:** 将AL中的内容转换为内存表格中某一项的值。即AL←[BX+AL]
### 5. 标志传送指令
| 指令 | 操作 |
|------|------|
| LAHF | 将标志寄存器低8位传送到AHAH←FLAGS低8位 |
| SAHF | 将AH传送到标志寄存器低8位FLAGS低8位←AH |
| PUSHF | 将16位标志寄存器压入堆栈PUSH FLAGS |
| POPF | 从堆栈弹出到16位标志寄存器POP FLAGS |
### 6. 地址传送指令
| 指令 | 操作 |
|------|------|
| LEA r16, src | 将src的有效地址传送到16位寄存器 |
| LDS r16, src | 将src的段地址传送到DS有效地址传送到16位寄存器 |
| LES r16, src | 将src的段地址传送到ES有效地址传送到16位寄存器 |
### 7. 输入输出指令
| 指令 | 操作 |
|------|------|
| IN AL, port | 从端口输入一个字节到AL |
| IN AX, port | 从端口输入一个字到AX |
| OUT port, AL | 将AL输出到端口 |
| OUT port, AX | 将AX输出到端口 |
**注意:** port为8位立即数表示固定端口DX表示可变端口0-65535
## 二、算术运算指令
### 1. 加法指令
**1ADD指令**
格式ADD dst, src
功能dst←dst+src
| 指令 | 操作 |
|------|------|
| ADD r/m8, r8 | 8位加法 |
| ADD r/m16, r16 | 16位加法 |
| ADD r8, r/m8 | 8位加法 |
| ADD r16, r/m16 | 16位加法 |
| ADD r/m8, i8 | 8位加立即数 |
| ADD r/m16, i16 | 16位加立即数 |
**2ADC指令**
格式ADC dst, src
功能dst←dst+src+CF带进位加法
**3INC指令**
格式INC opr
功能opr←opr+1加1
### 2. 减法指令
**1SUB指令**
格式SUB dst, src
功能dst←dst-src
**2SBB指令**
格式SBB dst, src
功能dst←dst-src-CF带借位减法
**3DEC指令**
格式DEC opr
功能opr←opr-1减1
**4NEG指令**
格式NEG opr
功能opr←0-opr求补
### 3. 乘法指令
**1MUL指令**
格式MUL src
功能:
- 8位AX←AL*src
- 16位DX:AX←AX*src
**2IMUL指令**
格式IMUL src
功能:带符号整数乘法
### 4. 除法指令
**1DIV指令**
格式DIV src
功能:
- 8位AL←AX/srcAH←AX/src余数
- 16位AX←DX:AX/srcDX←DX:AX/src余数
**2IDIV指令**
格式IDIV src
功能:带符号整数除法
### 5. 十进制调整指令
| 指令 | 操作 |
|------|------|
| DAA | 加法后十进制调整 |
| DAS | 减法后十进制调整 |
| AAA | 加法后ASCII调整 |
| AAS | 减法后ASCII调整 |
| AAM | 乘法后ASCII调整 |
| AAD | 除法前ASCII调整 |
## 三、逻辑运算和移位指令
### 1. 逻辑运算指令
| 指令 | 功能 |
|------|------|
| AND dst, src | 逻辑与 |
| OR dst, src | 逻辑或 |
| NOT opr | 逻辑非 |
| XOR dst, src | 逻辑异或 |
| TEST opr1, opr2 | 测试(与但不保存结果) |
### 2. 移位指令
| 指令 | 功能 |
|------|------|
| SHL opr, cnt | 逻辑左移 |
| SAL opr, cnt | 算术左移 |
| SHR opr, cnt | 逻辑右移 |
| SAR opr, cnt | 算术右移 |
| ROL opr, cnt | 循环左移 |
| ROR opr, cnt | 循环右移 |
| RCL opr, cnt | 带进位循环左移 |
| RCR opr, cnt | 带进位循环右移 |
**注意:** cnt=1或CL算术移位保持符号位循环移位把CF包含在环中。
## 四、串操作指令
### 1. 基本字符串指令
| 指令 | 操作 |
|------|------|
| MOVS dst, src | 移动字节/字串 |
| MOVSB | 移动字节串 |
| MOVSW | 移动字串 |
| CMPS dst, src | 比较字节/字串 |
| CMPSB | 比较字节串 |
| CMPSW | 比较字串 |
| SCAS dst | 扫描字节/字串 |
| SCASB | 扫描字节串 |
| SCASW | 扫描字串 |
| LODS src | 装入字节/字串 |
| LODSB | 装入字节串 |
| LODSW | 装入字串 |
| STOS dst | 存储字节/字串 |
| STOSB | 存储字节串 |
| STOSW | 存储字串 |
### 2. 串操作指令前缀
| 前缀 | 功能 |
|------|------|
| REP | 当CX≠0时重复 |
| REPE/REPZ | 当ZF=1且CX≠0时重复 |
| REPNE/REPNZ | 当ZF=0且CX≠0时重复 |
### 3. 重复前缀的使用
```
;将DS:SI处的100个字节传送到ES:DI处
CLD
LEA SI, SOURCE
LEA DI, DEST
MOV CX, 100
REP MOVSB
```
## 五、控制转移指令
### 1. 无条件转移指令
| 指令 | 操作 |
|------|------|
| JMP target | 无条件转移到目标地址 |
| CALL target | 调用过程 |
| RET | 从过程返回 |
| RETN | 从近过程返回 |
| RETF | 从远过程返回 |
### 2. 条件转移指令
**1单条件标志转移**
| 指令 | 含义 | 测试条件 |
|------|------|----------|
| JE/JZ | 等于/为零转移 | ZF=1 |
| JNE/JNZ | 不等于/非零转移 | ZF=0 |
| JC | 进位转移 | CF=1 |
| JNC | 无进位转移 | CF=0 |
| JO | 溢出转移 | OF=1 |
| JNO | 无溢出转移 | OF=0 |
| JS | 符号位为1转移 | SF=1 |
| JNS | 符号位为0转移 | SF=0 |
| JP/JPE | 奇偶性为1转移 | PF=1 |
| JNP/JPO | 奇偶性为0转移 | PF=0 |
**2无符号数比较转移**
| 指令 | 含义 | 测试条件 |
|------|------|----------|
| JA/JNBE | 高于/不低于等于转移 | CF=0且ZF=0 |
| JAE/JNB | 高于或等于/不低于转移 | CF=0 |
| JB/JNAE | 低于/不高于等于转移 | CF=1 |
| JBE/JNA | 低于或等于/不高于转移 | CF=1或ZF=1 |
**3带符号数比较转移**
| 指令 | 含义 | 测试条件 |
|------|------|----------|
| JG/JNLE | 大于/不小于等于转移 | ZF=0且SF=OF |
| JGE/JNL | 大于或等于/不小于转移 | SF=OF |
| JL/JNGE | 小于/不大于等于转移 | SF≠OF |
| JLE/JNG | 小于或等于/不大于转移 | ZF=1或SF≠OF |
### 3. 循环控制指令
| 指令 | 操作 | 测试条件 |
|------|------|----------|
| LOOP | 循环 | CX≠0 |
| LOOPE/LOOPZ | 相等/为零循环 | ZF=1且CX≠0 |
| LOOPNE/LOOPNZ | 不相等/非零循环 | ZF=0且CX≠0 |
| JCXZ | CX为零转移 | CX=0 |
### 4. 中断指令
| 指令 | 操作 |
|------|------|
| INT n | 调用中断号n的中断处理程序 |
| INTO | 溢出中断 |
| IRET | 中断返回 |
## 六、处理器控制指令
### 1. 标志操作指令
| 指令 | 操作 |
|------|------|
| STC | 进位标志置1CF←1 |
| CLC | 进位标志清0CF←0 |
| CMC | 进位标志取反CF←NOT CF |
| STD | 方向标志置1DF←1 |
| CLD | 方向标志清0DF←0 |
| STI | 中断允许标志置1IF←1 |
| CLI | 中断允许标志清0IF←0 |
### 2. 同步与空操作指令
| 指令 | 操作 |
|------|------|
| NOP | 空操作,不执行任何操作 |
| HLT | 暂停,处理器停止并等待中断或复位信号 |
| WAIT | 等待处理器进入等待状态直到BUSREQ有效 |
| ESC | 换码,用于与协处理器通信 |
| LOCK | 锁定前缀,禁止其他处理器访问共享内存 |
### 3. 段寄存器传送指令
| 指令 | 操作 |
|------|------|
| LDS r16, mem32 | 将内存中的32位地址装入DS和寄存器 |
| LES r16, mem32 | 将内存中的32位地址装入ES和寄存器 |
| LFS r16, mem32 | 将内存中的32位地址装入FS和寄存器 |
| LGS r16, mem32 | 将内存中的32位地址装入GS和寄存器 |
| LSS r16, mem32 | 将内存中的32位地址装入SS和寄存器 |
### 4. 转换指令
| 指令 | 操作 |
|------|------|
| CBW | 将AL中的字节扩展为AX符号扩展 |
| CWD | 将AX中的字扩展为DX:AX符号扩展 |
| CWDE | 将AX中的字扩展为EAX符号扩展 |
| CDQ | 将EAX中的双字扩展为EDX:EAX符号扩展 |
| MOVSX r16, r/m8 | 将8位符号扩展为16位 |
| MOVSX r16, r/m16 | 将16位符号扩展为16位 |
| MOVSX r32, r/m8 | 将8位符号扩展为32位 |
| MOVSX r32, r/m16 | 将16位符号扩展为32位 |
| MOVZX r16, r/m8 | 将8位零扩展为16位 |
| MOVZX r16, r/m16 | 将16位零扩展为16位 |
| MOVZX r32, r/m8 | 将8位零扩展为32位 |
| MOVZX r32, r/m16 | 将16位零扩展为32位 |
## 七、伪指令
### 1. 数据定义伪指令
| 伪指令 | 操作 |
|--------|------|
| DB | 定义字节每个操作数占1字节 |
| DW | 定义字每个操作数占2字节 |
| DD | 定义双字每个操作数占4字节 |
| DQ | 定义四字每个操作数占8字节 |
| DT | 定义十字节每个操作数占10字节 |
### 2. 段定义伪指令
| 伪指令 | 操作 |
|--------|------|
| SEGMENT | 定义段的开始 |
| ENDS | 定义段的结束 |
| PROC | 定义过程的开始 |
| ENDP | 定义过程的结束 |
| ASSUME | 告诉汇编程序段寄存器与段的对应关系 |
### 3. 程序结束伪指令
| 伪指令 | 操作 |
|--------|------|
| END | 表示源程序结束END后面的标号表示程序入口 |
| END [标号] | 标记源代码结束 |
### 4. 处理器方式伪指令
| 伪指令 | 操作 |
|--------|------|
| .386 | 允许使用80386指令 |
| .386P | 允许使用80386保护模式指令 |
| .8086 | 只允许8086/8088指令默认 |
### 5. 简化段定义伪指令
| 伪指令 | 操作 |
|--------|------|
| .MODEL | 选择存储模型 |
| .DATA | 定义数据段 |
| .CODE | 定义代码段 |
| .STACK | 定义堆栈段 |
| PROC | 定义过程 |
| ENDP | 过程结束 |
| END | 程序结束 |
## 八、寄存器与数据类型
### 1. 通用寄存器
| 8位寄存器 | 16位寄存器 | 32位寄存器 |
|-----------|-----------|-----------|
| AL, AH | AX | EAX |
| BL, BH | BX | EBX |
| CL, CH | CX | ECX |
| DL, DH | DX | EDX |
| - | SP | ESP |
| - | BP | EBP |
| - | SI | ESI |
| - | DI | EDI |
### 2. 段寄存器
CS代码段寄存器
DS数据段寄存器
ES附加段寄存器
SS堆栈段寄存器
### 3. 控制寄存器
IP指令指针寄存器
FLAGS标志寄存器
### 4. 数据类型
| 类型 | 大小 |
|------|------|
| BYTE | 8位 |
| WORD | 16位 |
| DWORD | 32位 |
| QWORD | 64位 |
| TBYTE | 80位 |
## 九、寻址方式
### 1. 立即寻址
操作数是立即数,直接包含在指令中。
```
MOV AX, 1234H
```
### 2. 寄存器寻址
操作数在寄存器中。
```
MOV AX, BX
```
### 3. 直接寻址
操作数的偏移地址直接包含在指令中。
```
MOV AX, [1000H]
MOV AX, VARIABLE
```
### 4. 寄存器间接寻址
操作数的偏移地址在基址寄存器或变址寄存器中。
```
MOV AX, [BX]
MOV AX, [SI]
```
### 5. 寄存器相对寻址
操作数地址=基址/变址寄存器+位移量。
```
MOV AX, [BX+100H]
MOV AX, [SI+10]
```
### 6. 基址变址寻址
操作数地址=基址寄存器+变址寄存器。
```
MOV AX, [BX+SI]
```
### 7. 基址变址相对寻址
操作数地址=基址寄存器+变址寄存器+位移量。
```
MOV AX, [BX+SI+10]
```
### 8. 隐含寻址
操作数地址隐含在某个寄存器或存储单元中。
```
MUL BL ;AL*BL→AX
XLAT ;[BX+AL]→AL
```
## 十、常用DOS功能调用
### 1. 显示字符串功能号09H
```
AH=09H
DS:DX=字符串地址
字符串以'$'结尾需要回车换行时使用0DH、0AH
```
### 2. 输入单个字符功能号01H
```
AH=01H
INT 21H
;返回AL=输入字符
```
### 3. 键盘输入字符串功能号0AH
```
AH=0AH
DS:DX=缓冲区地址
;缓冲区格式:第一个字节=最大字符数,第二个字节=实际字符数,后续=输入字符
```
### 4. 结束程序功能号4CH
```
AH=4CH
AL=返回码
INT 21H
```
### 5. 显示字符功能号02H
```
AH=02H
DL=字符
INT 21H
```