0

我正在尝试用汇编语言生成有效的扩展乘法。尽管我的代码运行良好,但有符号乘法存在一些问题。目前,我的数字是基于二补法的,我将我的数字转换为正数进行乘法,然后调整最终大小。它可以工作,但有点虚,因为它需要额外的副本。我打开了一本硬件书籍,发现了对有符号数运行良好的移位加法乘数。

因此,考虑到我使用 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,我输了一点。

那么,铅在哪里?

最好的。

4

1 回答 1

1

你在做一些奇怪的事情。

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

  1. 正如您所描述的,您可以首先将两个被乘数的绝对值相乘,然后如果预期乘积为负,则将其取反。

  2. 您使用无符号乘法将整数相乘,然后如果一个被乘数为负,则从乘积的最高有效一半中减去另一个(然后对称地重复相同的操作,检查另一个被乘数是否小于 0,等等)。

  3. 您使用布斯算法

于 2013-02-19T00:30:45.233 回答