我正在使用我认为使用MIPS的pcsim程序。因为我对汇编语言很陌生,所以我不积极。我需要乘以两个32位数字,只使用add,并将产品移入并存储在两个寄存器中。如果结果可以存储在32位中,我已经将它们成功地乘两个数字。问题是,如果数量大于这个数字,我就无法弄清楚如何将产品的右半部分与左半部分结合起来。左半部分的寄存器应该始终保持从2^32开始的值。如果不明确,我可以尝试解释更多。有没有一些简单的方法可以完成这个目标?谢谢你的帮助。如何将两个32位寄存器合并为64位答案?
1
A
回答
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;
(其实可以更换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. 32位寄存器将64位分成两个32位寄存器
- 2. 如何将两个32位寄存器移动到一个64位?
- 3. 如何将XMM 128位寄存器分成两个64位整数寄存器?
- 4. 将两个x86 32位寄存器存储到128位xmm寄存器中
- 5. 32位寄存器作为8位寄存器
- 6. 为什么要将两个32位整数合并成一个64位整数?
- 7. 零输出64位寄存器的前32位
- 8. 大会:与32位寄存器的64位乘法
- 9. 在32位窗口下的64位寄存器
- 10. 如何将ZeroMQ作为32位库并将其与标准64位库合并?
- 11. 负载32位寄存器
- 12. 如何取消存储在32位寄存器对中的64位整数?
- 13. SSE 64位寄存器
- 14. 64位的dll寄存器
- 15. VS2010合并32位和64位解决方案
- 16. 展位乘法器在64位寄存器的高32位中放置1
- 17. 混合32/64位解决方案
- 18. 寄存器长度,内存大小和32/64位计算(MIPS)
- 19. 从DX:AX寄存器移动到单个32位寄存器
- 20. 从32位变为64位
- 21. 将32位转换为64位
- 22. 将32位代码编译为64位
- 23. 我们如何使用两个32位寄存器(32 + 32 = 64)来使其能够读取64位值?汇编语言8086
- 24. 以64位组合返回两个32位数的和
- 25. 添加一个128位xmm寄存器的高64位和低64位
- 26. 汇编:使用两个32位寄存器中的值划分,就好像它们是一个64位整数
- 27. 如何64位整数分成两个32位的整数
- 28. 32位架构的DS段寄存器
- 29. 32位和64位值共享相同的寄存器空间吗?
- 30. 使用32位而不是64位来减少寄存器的数量