2010-11-18 87 views
1

我正在使用我认为使用MIPS的pcsim程序。因为我对汇编语言很陌生,所以我不积极。我需要乘以两个32位数字,只使用add,并将产品移入并存储在两个寄存器中。如果结果可以存储在32位中,我已经将它们成功地乘两个数字。问题是,如果数量大于这个数字,我就无法弄清楚如何将产品的右半部分与左半部分结合起来。左半部分的寄存器应该始终保持从2^32开始的值。如果不明确,我可以尝试解释更多。有没有一些简单的方法可以完成这个目标?谢谢你的帮助。如何将两个32位寄存器合并为64位答案?

回答

0

没有办法将两半合并成一个32位寄存器。如果你想把两个半部分合并成一个64位的内存值,你需要根据你机器的永久性来存储两个半部分。如果您使用的是SPIM,则表明它使用与主机相同的enianness。

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

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; 

(其实可以更换131n(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位的补充)。

相关问题