如何将两个32位寄存器组合成64位答案?

时间:2010-11-18 20:12:44

标签: assembly 64-bit 32-bit multiplying

我正在使用pcsim程序,我认为它使用MIPS。我并不积极,因为我对汇编语言不熟悉。我需要仅使用add和shift将两个32位数相乘,并将产品存储在两个寄存器中。我已经知道它将成功地乘以两个数字,如果结果可以存储在32位。问题是,如果数字大于那个,我无法弄清楚如何将产品的右半部分与左半部分结合起来。左半部分寄存器应保持从2 ^ 32开始一直保持的值。如果不清楚,我可以尝试解释更多。我是否有一些简单的方法来完成这个?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你就会陷入实际需要进行64位运算的地步,对吗?

如果你正在进行典型的移位和加法二进制长乘法,你可以从32位操作构建一些64位移位和加法原语,然​​后使用相同的方法。

以下是C片段的一些示例(如果您正在使用的话,那么转换为MIPS应该是微不足道的)。我假设你正在使用无符号的32位数字,并希望得到无符号的64位结果。

逻辑移位1位:

tmp = lo >> 31;  /* top bit of lo to bottom bit of tmp, rest of tmp is 0 */
lo <<= 1;
hi <<= 1;
hi |= tmp;

逻辑右移1位:

tmp = hi << 31;  /* bottom bit of hi to top bit of tmp, rest of tmp is 0 */
hi >>= 1;
lo >>= 1;
lo |= tmp;

(实际上,您可以将131替换为n(32 - n),以换取其他位数)

64位加法:

result_lo = a_lo + b_lo;
result_hi = a_hi + b_hi;
if (result_lo < a_lo)
    result_hi++;

(有关详细信息,请参阅here,具体参考MIPS)。


另一种方法是将每个32位输入视为一对16位“数字”;将两个16位数相乘最多可得到32位结果。所以基本的想法是这样的:

0x12345678 * 0x23456789 =     0x5678 * 0x6789
                          + ((0x1234 * 0x6789) << 16)
                          + ((0x5678 * 0x2345) << 16)
                          + ((0x1234 * 0x2345) << 32)

(你仍然需要一些64位的添加)。

答案 1 :(得分:0)

无法将两半“组合”成一个32位寄存器。如果要将两半合并为内存中的一个64位值,则需要根据机器的字节顺序存储两个半部分。如果您正在使用SPIM,它似乎使用与您的主机相同的enianness。

X86?小端。先存放下半部分。 PPC?大端。先存放上半部分。