[英]Adding 32-bit numbers on a 32 machine, widening to a 64-bit sum in two registers
[英]How can I comine two 32-bit registers into a 64-bit answer?
我正在使用我相信使用MIPS的pcsim程序。 我不太肯定,因為我是匯編語言的新手。 我只需要使用加法和移位法將兩個32位數字相乘並將乘積存儲在兩個寄存器中。 我已經知道如果將結果存儲在32位中,它將成功地將兩個數字相乘。 問題是,如果數字大於該數字,我將不知道如何將產品的右半部分與左半部分組合在一起。 左半部分寄存器的值應始終從2 ^ 32開始。 如果不清楚,我可以嘗試解釋更多。 有什么容易實現的方法我會忽略嗎? 謝謝你的幫助。
如果我理解正確,那么您就陷入了實際需要執行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;
(實際上,您可以將n
和(32 - n)
替換為1
和31
,以移動其他位數。)
64位加法:
result_lo = a_lo + b_lo;
result_hi = a_hi + b_hi;
if (result_lo < a_lo)
result_hi++;
(有關詳細信息,請參見此處 ,具體參考MIPS)。
另一種方法是將您的每個32位輸入都視為一對16位“數字”。 將兩個16位數字相乘最多可得到32位結果。 所以基本思路是這樣的:
0x12345678 * 0x23456789 = 0x5678 * 0x6789
+ ((0x1234 * 0x6789) << 16)
+ ((0x5678 * 0x2345) << 16)
+ ((0x1234 * 0x2345) << 32)
(您仍然需要添加64位)。
無法將兩個半部分“組合”到一個32位寄存器中。 如果要將兩個半部分合並為一個64位值在內存中,則需要根據計算機的耐久性將兩個半部分存儲在一起。 如果您使用的是SPIM,則看起來它使用與主機相同的enianness。
X86? 小端。 首先存儲下半部分。 PPC? 大端。 首先存儲上半部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.