【问题标题】:Multiplication of two numbers without using MUL instruction不使用 MUL 指令的两个数相乘
【发布时间】:2017-02-25 13:24:26
【问题描述】:

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

【问题讨论】:

  • 那是x86代码,但逻辑是有效的。那么,你在哪里卡住了?
  • 有人可能会回答你,但这不是 SO 的真正意义所在。要获得实际帮助,您应该尝试自己编写,然后在遇到麻烦时发布。这不是语言教学网站,也不是“为我编写此代码”网站。

标签: assembly cpu multiplication


【解决方案1】:

你的理解/算法是正确的。记住小学,除了 base 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 并始终检查其低位。 (或者甚至利用shr 设置CF = 移出的低位)
猜你喜欢
  • 2018-09-25
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多