繁体   English   中英

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

[英]How to implement MUL using all the other instructions in assembly?

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

我能想到的:

  1. a + a + a + a + ..... a(b倍)最简单,但最糟糕的是

  2. 左移(a,7)+左移(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还是0,都需要将“工作副本”向左移动一位。 当“最高”变为零时,您就知道您已经完成了,答案就在累加器中。

您可以使用一些优化方法,从而不需要太多的16位寄存器(或8位寄存器对),但我将让您详细研究。

似乎您正在使用与8080、6502、6800和类似产品类似的8/16位处理器。 是的,移位和加法的8迭代循环就足够了,几乎是最佳的。 OTOH,如果常量表有1020字节,则使用以下公式的方法可能是最快的方法:

a*b = square(a+b)/4 - square(a-b)/4

如果参数是无符号的,则a + b的最大值为510。对于任何x,您只需要保留x ** 2/4的整数部分,因为公式中的小数部分将相互补偿;因此,对于x而言,x等于2。 因此,映射为:0-> 0,1-> 0,2-> 1,3-> 2,4-> 4,...,510->65025。对于带符号参数,表要小两倍。

快速乘法还有许多其他方法,包括几乎线性的成本。 参见例如Donald Knuth的“计算机编程的艺术”传奇书籍系列,第2卷。但是,如果使用8位参数,它们的开销太大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM