摘要:在 8086 汇编语言中,"MUL" 指令用于执行无符号乘法。其操作规则根据操作数位宽(8位或16位)分为两种情况,并隐含使用特定寄存器。以下是详细用法和注意事项:
在 8086 汇编语言中,"MUL" 指令用于执行无符号乘法。其操作规则根据操作数位宽(8位或16位)分为两种情况,并隐含使用特定寄存器。以下是详细用法和注意事项:
***
一、"MUL" 指令基本规则
1. 操作数位宽决定寄存器使用
| 乘数位宽 | 被乘数寄存器 | 结果存放位置 |
||||
| 8 位 | "AL" | "AX"(高8位 "AH",低8位 "AL") |
| 16 位 | "AX" | "DX:AX"(高16位 "DX",低16位 "AX") |
« 关键点:- 被乘数固定为 "AL"(8位)或 "AX"(16位),无法显式指定。
- 乘数由指令中的操作数提供(寄存器或内存)。»
2. 指令语法
MUL source ; source = 乘数(8位或16位)
- "source" 可以是:
- 8位寄存器(如 "CL"、"BH")
- 16位寄存器(如 "BX"、"CX")
- 内存操作数(如 "[multiplier]")
***
二、操作示例
1. 8 位乘法
MOV AL, 20 ; 被乘数 = 20 (AL)
MOV CL, 5 ; 乘数 = 5
MUL CL ; AX = 100 (AL=100, AH=0)
- 结果:
- "AL" = 20 × 5 = 100(乘积低8位)
- "AH" = 0(乘积高8位,因结果未超255)
2. 16 位乘法
MOV AX, 500 ; 被乘数 = 500 (AX)
MOV BX, 300 ; 乘数 = 300
MUL BX ; DX:AX = 150,000 → DX=0x0002, AX=0x49F0 (0x000249F0=150,000)
- 结果:
- "AX" = 150,000 的低16位(0x49F0 = 18,928)
- "DX" = 150,000 的高16位(0x0002 = 2)
***
三、关键注意事项
1. 标志位变化
- "CF"(进位标志) 和 "OF"(溢出标志):
- 若乘积的高半部分(8位乘法的 "AH" 或 16位乘法的 "DX")非零,则 "CF=OF=1"。
- 若高半部分为零,则 "CF=OF=0"。
- 其他标志("AF"、"PF"、"SF"、"ZF")状态未定义(可能随机变化)。
2. 结果超出范围
- 8位乘法:若乘积 > 255(如 30×10=300),高8位("AH")非零:MOV AL, 30
MOV CL, 10
MUL CL ; AX=300 → AL=44 (0x2C), AH=1 (0x01) → CF=OF=1
- 16位乘法:若乘积 > 65,535(如 500×200=100,000),高16位("DX")非零:MOV AX, 500
MOV CX, 200
MUL CX ; DX:AX=100,000 → AX=34464 (0x86A0), DX=1 (0x0001) → CF=OF=1
3. 操作数类型必须明确
汇编器无法自动推断操作数位宽,需通过寄存器或关键字(如 "BYTE PTR")明确指定:
MUL BYTE PTR [SI] ; 8位乘法(从内存取乘数)
MUL WORD PTR [DI] ; 16位乘法(从内存取乘数)
***
四、完整流程示例
场景:计算内存中两个16位数的乘积(无符号)
; 数据段定义
data SEGMENT
num1 DW 400 ; 第一个数
num2 DW 600 ; 第二个数
result DD ? ; 存放结果(32位)
data ENDS
; 代码段
code SEGMENT
MOV AX, data
MOV DS, AX ; 设置DS指向数据段
MOV AX, num1 ; AX = 400(被乘数)
MOV BX, num2 ; BX = 600(乘数)
MUL BX ; DX:AX = 400 × 600 = 240,000
; 保存结果到result(小端序:低16位→AX,高16位→DX)
MOV [result], AX
MOV [result+2], DX
code ENDS
结果:
- "result" = 240,000(0x0003A980)
- 内存布局:"[result]=0xA980", "[result+2]=0x0003"
***
五、常见错误及解决
| 错误现象 | 原因 | 解决方案 |
||||
| 结果寄存器值错误 | 未初始化 "AL"/"AX" | 确保被乘数已存入 "AL" 或 "AX" |
| 高半部分数据丢失 | 忽略 "AH"/"DX" | 16位结果需从 "AX" 读取,32位从 "DX:AX" |
| 汇编器报错 | 操作数位宽不明确 | 用 "BYTE PTR"/"WORD PTR" 显式指定 |
| 有符号数误用 "MUL" | 混淆无符号与有符号乘法 | 有符号数改用 "IMUL" |
***
六、总结
- "MUL" 用于无符号乘法(如地址计算、计数器)。
- 核心规则:
- 8位乘法:被乘数 → "AL",结果 → "AX"
- 16位乘法:被乘数 → "AX",结果 → "DX:AX"
- 标志位:通过 "CF" 和 "OF" 判断结果是否超出低半部分范围。
- 内存操作数:必须用 "BYTE PTR" 或 "WORD PTR" 明确位宽。
掌握 "MUL" 指令是处理无符号乘法的关键,尤其在底层硬件编程和大数运算中至关重要! ⚙️
来源:小理