如何在x8086汇编中不使用MUL指令实现0-9两数相乘(仅用移位指令)
移位指令实现乘法的代码逻辑解析
翻译后的代码(带中文注释)
;我在stackoverflow上找到这段代码,但不太理解它的逻辑 ; ax = x(初始时ax寄存器存储被乘数x) mov bl, al ; 将al中的x复制到bl,此时bl = x shl bl, 3 ; bl左移3位,等价于乘以2³=8,bl = 8*x add al, bl ; al(原x)加bl(8*x),得到al = x + 8x = 9x,此时ax = 9*x shl bl, 2 ; 已有的8*x左移2位,等价于乘以2²=4,8x*4=32x,bl = 32*x add al, bl ; al(9x)加bl(32x),得到al = 9x + 32x = 41x,此时ax = 41*x
核心逻辑说明
这段代码的本质是用左移(SHL)指令替代乘法运算——因为对整数来说,左移n位等价于乘以2的n次方(SHL reg, n = reg * 2^n),再通过加法把不同2次幂的倍数组合起来,得到目标乘数的结果。
这段代码专门用来计算 x × 41,因为41可以拆解为2的幂次之和:41 = 32 + 8 + 1 = 2^5 + 2^3 + 2^0,代码里就是分步用移位得到8x、32x,再和原始的x相加,最终得到41x。
扩展到0-9任意两数乘法
如果要实现0-9之间任意两个数a×b的乘法(不能用MUL指令),只需要把乘数b拆解成2的幂次组合,再用SHL+加法实现:
- 比如
b=3,3=2+1 →a×3 = (a << 1) + a - 比如
b=6,6=4+2 →a×6 = (a << 2) + (a << 1) - 所有0-9的数都能拆解成类似的2次幂组合,用同样的移位+加法逻辑就能完成乘法。
内容的提问来源于stack exchange,提问作者GolfBravoSierra
相关产品推荐
相关产品推荐

