混合左加乘数,学校书籍算法用于签名乘法

时间:2013-02-18 22:51:12

标签: algorithm assembly multiplication

我试图在汇编语言中产生有效的扩展乘法。虽然我的代码运行良好,但我在签名乘法方面存在一些问题。目前,我的数字是基于两个补码方法,我将我的数字转换为正数使我的乘法然后调整最终大小。它可以工作,但有点虚拟,因为它需要额外的副本。我打开了一本硬件书,我发现了一个适用于签名号码的移位加法乘数。

因此,考虑到我使用4位数进行输入,输出为8位。我想乘法-3 * 3,左移二进制乘数,我有:

                     1101  // -3
               X     0011  // 3 
         -----------------------
         11111101 // I make the first x with sign extension
         1111101 // I make the a second x with sign extension,
         000000  // 0 no sign extension
         00000   // Later I will subtract this in case "of", as in book
         -----------------------
         11110111 <----------- final addition I get -9 OK it works

现在让我们选择学校书籍算法的混合解决方案,我分解了我的第一个号码 1101到11和01,以及0011到00和11的相同。如果我改写我的算法,就像我们在学校学到的那样:

           11 01
           00 11
           ---------------
           00 11  (unsigned mul 01 x 11 gives 00 11) , no sign extension
        10 01     (11 * 11  gives 10 01)                             
        --------------------
        10 01 11 (sum)
     11 10 01 11 (I made a sign extension until 8 bit)
     00 00 00 00 (the last multiplication only 0)
     -----------------------       
     11 10 01 11 (final sum) 

结论11110111!= 11100111,我输了一点。

那么,pb在哪里?

最佳。

1 个答案:

答案 0 :(得分:1)

你做的事情很奇怪。

有几种常用的方法可以将有符号整数相乘:

  1. 如您所述,您可以先将两个被乘数的绝对值相乘,然后如果预期产品是负数,则将其否定。

  2. 使用无符号乘法将整数相乘,然后如果一个被乘数为负,则从产品的最重要一半中减去另一个(然后对称地重复相同,检查另一个被乘数小于0等等。)

  3. 您使用Booth's algorithm