如何使用汇编中的所有其他指令来实现 MUL?

2023-12-13

假设我已经在汇编机中实现了所有 ADD、AND、SHF、JUMP、BR、LDW、LDB(加载字加载字节...)......除了 MUL(多个)指令。现在我想编写汇编代码来操作MUL指令,该指令接收存储在0x4000(a)和0x4001(b)(每个8位)中的数据并计算它们的乘积,然后将结果存储在0x4002(16位)中。我们希望尽量减少指导步骤。

我能想到的是:

  1. a+a+a+a+.....a(b 次) 最简单但显然是最差的

  2. Leftshift( a, 7) + leftshift( a, 6)+.....+a (根据b移位并相加)

我想知道这个问题是否有更好的解决方案。 谢谢!


总体思路与您(应该)在学校中进行“长乘法”时学到的相同,只是我们以二进制而不是十进制进行。考虑下面的两个例子:

      1010        1234
    x 1100      x 2121
----------   ---------
      0000        1234
     0000        2468
    1010        1234
 + 1010      + 2468
 ---------   ---------
   1111000     2617314  

右侧的示例是以 10 为基数(十进制),左侧的示例是二进制。请注意,您必须与最高因子相乘的唯一数字是 0 或 1。乘以零很容易,答案总是零,您甚至不必担心将其添加进去。乘以一也很容易,这只是知道“将其移动多远”的问题。但这很简单,只要你检查一下就可以了。

从号码的 16 位工作副本开始,并将 16 位累加器设置为零。将最上面的数字移过来,只要最右边的数字有 1,您就将“工作副本”添加到累加器中。无论有无一或零,都需要将“工作副本”左移一位。当“顶部”变为零时,您知道您已完成并且答案位于累加器中。

您可以使用一些优化,这样您就不需要那么多的 16 位寄存器(或 8 位寄存器对),但我将让您自行解决细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用汇编中的所有其他指令来实现 MUL? 的相关文章

随机推荐