假设我已经在汇编机中实现了所有 ADD、AND、SHF、JUMP、BR、LDW、LDB(加载字加载字节...)......除了 MUL(多个)指令。现在我想编写汇编代码来操作MUL指令,该指令接收存储在0x4000(a)和0x4001(b)(每个8位)中的数据并计算它们的乘积,然后将结果存储在0x4002(16位)中。我们希望尽量减少指导步骤。
我能想到的是:
a+a+a+a+.....a(b 次) 最简单但显然是最差的
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(使用前将#替换为@)