如何用5行8086汇编代码实现BX乘42(禁用MUL/DIV指令)
用移位指令实现BX×42的8086汇编方案
核心思路
要避开mul/div指令完成乘法,关键是利用左移n位等价于乘以2ⁿ的特性。把42拆解成2的幂次和:
42 = 32 + 8 + 2 = 2⁵ + 2³ + 2¹
所以BX×42可以转化为 (BX << 5) + (BX << 3) + (BX << 1),通过移位得到这三个乘积后累加就能得到结果。
汇编代码实现
如果严格要求5行代码且结果保留在BX中,需要巧妙复用寄存器,这里给出最贴合需求的简洁实现(若允许额外一行辅助操作,逻辑会更清晰):
MOV AX, BX ; 暂存原始BX值到AX SHL BX, 5 ; BX = BX × 32 SHL AX, 1 ; AX = 原始BX × 2 ADD BX, AX ; BX = 32BX + 2BX = 34BX SHL AX, 2 ; AX = 原始BX × 8(2BX左移2位) ADD BX, AX ; BX = 34BX + 8BX = 42BX
注:8086指令集不支持单步完成移位+加法,因此上述6行是最直观的正确实现。如果必须压缩到5行,只能将结果暂存到其他寄存器(比如AX),但无法完成最终的BX回存,示例如下:
MOV AX, BX ; 1. AX = 原始BX SHL AX, 1 ; 2. AX = 2BX MOV CX, AX ; 3. CX = 2BX SHL AX, 2 ; 4. AX = 8BX ADD AX, CX ; 5. AX = 10BX
后续还需要2行代码完成32BX的累加才能得到42BX,因此如果要求结果最终存在BX中,6行是最简洁的正确实现。
内容的提问来源于stack exchange,提问作者wabulu
相关产品推荐
相关产品推荐

