我從某個來源發現 Rs 和 Rt 的內容被認為是 mul 的有符號整數。
而對于 mulu,Rs 和 Rt 的內容被視為無符號整數。
但是每次我執行 mul 和 mulu 時,它們似乎都會給出相同的結果。
li $t0 -2
li $t1 2
mul $s0, $t0, $t1
mulu $s1, $t0, $t1
在 $s0 和 $s1 中都存盤了 -4。我的問題是說 Rs 和 Rt 被認為是有符號/無符號整數是什么意思,以及 mul 和 mulu 如何區別對待 Rt 和 Rs?我可以看到 mul 和 mulu 給出不同結果的具體情況是什么?我正在使用火星模擬器。謝謝你。如果您對這個問題有任何困惑,請問我。
uj5u.com熱心網友回復:
MIPS 有一個乘法單元可以給出準確的答案:它需要 32 位 × 32 位 → 64 位,這就是乘法的作業原理,從數學上講。
在火星上,mul是一個真正的指令。hi它產生一個在&中捕獲的 64 位結果lo,并將其低 32 位存盤到rd. (這條指令不是第一個 MIPS 的一部分;它是后來添加的。)如果你執行這條指令,你會在 MARS 中看到hi并lo受到影響rd.
而在 MARSmulu上是偽指令。它還產生在hi&中捕獲的 64 位結果lo,并將其低 32 位存盤到 " rd" 中(我在此處加上引號 b/c 這mulu不是真正的指令,因此沒有實際的暫存器欄位) ,但由 MARS 匯編器實作為 2 條實際指令,如下所示:首先multu rs,rt,然后mflo rd。如果您在 MARS 中查看此指令的機器代碼,您會看到此擴展為 2 條指令,如果您執行,您將首先看到hi,lo然后rd是受影響的。
mult較舊的 MIPS 通過兩個運算元&僅提供 32 × 32 → 64 結果,multu而 64 位結果在特殊hi&lo暫存器中捕獲(這樣乘法可能需要多個周期,并且不會干擾可能為其他運算元提供服務的整數暫存器檔案指令并行運行),因此您可以考慮嘗試使用這些指令,例如mult $t0, $t1和multu $t0, $t1。
2 × -2 的有符號數(例如使用mult)的答案是 0xffffffff 0xfffffffc,并且這個值可以安全地截斷為 32 位(或更少),因為這個值只是 -4,它適合較少的位數1 .
無符號中沒有 -2,因此這些位被解釋為一個大的正數, fffffffe 16 aka 4,294,967,294 10。
在無符號(使用multu)中完成的 2 × 0xffffffffe 的答案是 0x00000001 0xfffffffc,并且這個值——正如你對無符號 × 無符號所期望的那樣是正的——不適合 32 位2,所以當你在沒有檢查的情況下強行截斷時重新做,我們有溢位,也就是說:一個錯誤的答案。
碰巧低 32 位的位模式與有符號和無符號的相同,但由于溢位,這相對沒有意義 - 當然,它對硬體很有用,因為這意味著這兩種乘法型別共享很多電路。
1 我們如何判斷這個 64 位值適合 32 位?高位結果要么全為 0,要么全為 1,并且這些位也與低位結果的符號位(最高位,MSB)相匹配。
我們將如何在 MIPS 上對此進行運行時測驗?取較低的 32 位結果并將其算術右移 31 個位置(僅在 LSB 位置保留符號位)。使用算術移位會在符號位右移時復制符號位,因此我們將根據原始符號獲得一個全 0 或全 1 的值。然后將該移位值與高 32 位進行比較,如果相等,則 64 位值可以用 32 位表示,如果不相等則不適合 32 位。
2 我們怎么知道這個 64 位數字不適合 32 位?由于無符號資料型別的所有位都是幅度位(即沒有符號位),那么如果結果的高 32 位不為零,那么該數字需要超過 32 位來表示,并且只保留低 32位將截斷結果,就像做模 2 32一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/468264.html
