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