文章目录
有符号乘法(IMUL)指令的通俗解释
IMUL指令就像一个有经验的会计,专门处理带正负号的数字乘法。它比普通的MUL指令更聪明,能正确处理负数相乘的情况。
三种工作模式
1. 简单模式(单操作数)
就像老式计算器:
- 你把一个数字放在AL/AX/EAX里
- 告诉它要乘以哪个数(内存或寄存器中的)
- 它会给你完整的乘积结果:
- 8位数相乘→16位结果(AX)
- 16位数相乘→32位结果(DX:AX)
- 32位数相乘→64位结果(EDX:EAX)
小贴士:如果结果的高半部分全是0或全是1(这是正常的符号扩展),它会亮绿灯(CF=OF=0);否则亮红灯(CF=OF=1)表示"结果太大了,高位有实际数据"。
2. 快捷模式(双操作数)
像智能手机计算器:
- 你直接告诉它:“把A和B相乘,结果存回A”
- 它只给你结果的低半部分
- 但是偷偷告诉你:“如果结果被截断了,我会亮红灯(CF=OF=1)”
3. 超级模式(三操作数)
最智能的模式:
- 你告诉它:“把A和B相乘,再乘以C,结果存到D”
- 它同样只保留结果的低半部分
- 也会用同样的方式告诉你是否发生了截断
重要特性
-
自动符号处理:遇到立即数(如-5)时,它会自动扩展符号位,就像把"-5"看成"…11111011"一样。
-
结果截断警告:在快捷和超级模式下,如果结果太大被截断了,它会设置CF和OF标志提醒你,就像计算器显示"E"表示溢出。
-
标志位含义:
- CF/OF=1 → “注意!结果被截断了,高位有重要数据丢失!”
- 其他标志位(SF/ZF/AF/PF)不可靠,别用它们判断结果。
使用技巧
-
检查溢出:
IMUL eax, ebx ; eax = eax * ebx JO 结果太大了 ; 如果溢出就跳转处理 -
灵活计算:
IMUL eax, ebx, 10 ; 相当于 eax = ebx * 10 -
选择模式:
- 需要完整结果 → 用简单模式
- 只需要低半部分 → 用快捷或超级模式更高效
记住:IMUL就像个负责任的会计,不仅会算账,还会提醒你注意各种异常情况!
IMUL 指令详解:有符号乘法
指令格式与操作
| 操作码 | 指令格式 | 描述 |
|---|---|---|
| F6 /5 | IMUL r/m8 |
AL * r/m8 → AX |
| F7 /5 | IMUL r/m16 |
AX * r/m16 → DX:AX |
| F7 /5 | IMUL r/m32 |
EAX * r/m32 → EDX:EAX |
| 0F AF /r | IMUL r16, r/m16 |
r16 * r/m16 → r16 |
| 0F AF /r | IMUL r32, r/m32 |
r32 * r/m32 → r32 |
| 6B /r ib | IMUL r16, r/m16, imm8 |
r/m16 * 符号扩展的imm8 → r16 |
| 6B /r ib | IMUL r32, r/m32, imm8 |
r/m32 * 符号扩展的imm8 → r32 |
| 6B /r ib | IMUL r16, imm8 |
r16 * 符号扩展的imm8 → r16 |
| 6B /r ib | IMUL r32, imm8 |
r32 * 符号扩展的imm8 → r32 |
| 69 /r iw | IMUL r16, r/m16, imm16 |
r/m16 * imm16 → r16 |
| 69 /r id | IMUL r32, r/m32, imm32 |

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



