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

Assembly 不使用MUL指令的两个数的乘法,assembly,cpu,multiplication,Assembly,Cpu,Multiplication,我必须编写程序(适用于SIC和SIC/XE机器) 我尝试使用shl操作编写它,该操作执行与指定操作数乘以2相同的操作。左移两位位置将操作数乘以四。向左移动三位位置将操作数乘以八。通常,将操作数左移n位会使其乘以2n。任何值都可以通过一系列移位和加法或移位和减法乘以某个常数。例如,要将ax寄存器乘以10,只需将其乘以8,然后将原始值的两倍相加即可。也就是说,10*ax=8*ax+2*ax。实现这一点的代码是 shl ax, 1 ;Multiply

我必须编写程序(适用于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机器)?
你能找个人帮帮我吗

您的理解/算法是正确的。记住小学,除了基础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;
}
//二进制中的a=op1*op2
a=0;
b=op1;

对于(x=1;x;x)这是x86代码,但逻辑是有效的。那么,你在哪里卡住了?有人可能会回答你,但这不是真正的原因。要获得实际帮助,你应该尝试自己编写,然后在遇到麻烦时发布。这不是语言教学网站,也不是“为我编写此代码”通常,右移
a
并始终检查其低位更容易。(甚至可以利用
shr
设置CF=低位移出)