两个数字的乘法而不使用MUL指令

时间:2017-02-25 13:24:27

标签: assembly cpu multiplication

我必须编写程序(适用于SIC和SIC / XE机器)

我尝试使用shl操作来编写它,该操作执行与将指定的操作数乘以2相同的操作。向左移动两位位置将操作数乘以四。向左移动三位位置将操作数乘以八。通常,将操作数移位到左侧n位将其乘以2n。任何值都可以乘以一些常数,使用一系列的移位和加法或移位和减法。例如,要将ax寄存器乘以10,您只需要将它乘以8然后再加上原始值的两倍。也就是说,10 * ax = 8 * ax + 2 * ax。完成此任务的代码是

            shl     ax, 1           ;Multiply AX by two
            mov     bx, ax          ;Save 2*AX for later
            shl     ax, 1           ;Multiply AX by four
            shl     ax, 1           ;Multiply AX by eight
            add     ax, bx          ;Add in 2*AX to get 10*AX

现在我该如何编写程序(SIC和SIC / EX机器)? 你能帮助别人吗?

1 个答案:

答案 0 :(得分:1)

您的理解/算法是正确的。记得小学,除了基础2更容易。

        abcd
    *   1101
    =========
        abcd
       0000
      abcd
+    abcd
=============

也是

abcd * ghef = (abcd*(f*(2^0)))+(abcd*(e*(2^1)))+(abcd*(h*(2^2)))+(abcd*(g*(2^3)))

所以,如果设置了该位,则取其中一个数字,然后将另一个数字移动到累加器中。

//a = op1 * op2 in binary
a=0;
b=op1;
for(x=1;x;x<<=1)
{
   if(x&op2) a+=b;
   b<<=1;
}

所以只要用任何语言用任何语言来实现它。