簡體   English   中英

如何將兩個32位寄存器合並為64位答案?

[英]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)替換為131 ,以移動其他位數。)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM