2009-05-05 190 views
4

我正在使用MIPS編寫某些代碼,並且我已經到了需要臨時將結果存儲在HILO特殊寄存器(均爲4個字節寬)。這些指令是在我手上:將值存儲在MIPS的HI和LO寄存器中

divu  s,t lo <-- s div t ; hi <-- s mod t 
multu s,t hi/lo < -- s * t ; 

所以,divu店在HILO和其餘部門的結果,而multu並將結果保存在LO乘法(低4個字節)和HI(高4個字節)。

後來,從HILO寄存器檢索結果,我可以:

mfhi $v0 
mflo $v1 

我已經想通了如何計算的結果存儲在LO

ori  $v0,$0,1   # Store result from $a0 into LO 
divu $a0,$v0 
  • divu將分區的結果存儲在LO中,所以我只將結果除以1得到它。

但是,存儲在HI是更復雜。一種方法是迫使multu指令由32位(4個字節)的值偏移:

multu $a0,0x80000000  # Shift $a0 by 32 bits and store into HI/LO 

但是,其結果是,在HI的值是(的地方應該是1個比特右所以如果我值是0100 1000,那麼HI將包含0010 0100)。

有誰知道如何在HI寄存器中存儲東西?

+0

* 32位(8字節)*。 uh,32b是4個字節,而不是8.在32位MIPS上,HI和LO每個都是4個字節。它是8字節對的64位串接(不適用於任何單個寄存器)。 – 2016-11-02 07:13:03

回答

7

常見的錯誤我想延長尼爾斯Pipenbrinck答案:

從MIPS32 arquitechture程序員

MTHI

格式:MIPS32(MIPS I)

MTHI rs 

目的: 要將GPR複製到專用HI註冊

Description: HI ← rs 

GPR Rs的內容被裝入特殊寄存器HI。

限制:

寫入到HI/LO對由DIV,DIVU,MULT,或MULTU甲計算結果必須由MFHI或MFLO 一個新的結果之前,讀取可寫入任一HI或LO。 如果遵循這些算術指令之一,但在MFLO或MFHI指令之前執行了MTHI指令,則LO的內容爲UNPREDICTABLE。下面的例子顯示了這種非法的情況:

MUL  r2,r4 # start operation that will eventually write to HI,LO 
...    # code not containing mfhi or mflo 
MTHI  r6 
...    # code not containing mflo 
        # this mflo would get an UNPREDICTABLE value 
MFLO  r3 

歷史資訊:

在MIPS I-III,如果滿足前兩個指令是MFHI,即MFHI的結果是不可預知的。 HI或LO專用寄存器的讀取必須與任何後續寫入兩條 或更多指令的指令分開。在MIPS IV及更高版本中,包括MIPS32和MIPS64,這種限制不存在。

mtlo

格式:MIPS32(MIPS I)

MTLO rs 

目的: 要將GPR複製到專用LO註冊 說明:

LO ← rs 

GPR的內容rs被加載到特殊寄存器LO中。

限制條件: 在將新結果寫入HI或LO之前,必須通過MFHI或MFLO讀取由DIV,DIVU,MULT或MULTU寫入HI/LO對的計算結果。

如果遵循這些算術指令之一,但在執行MFLO或MFHI指令之前執行MTLO指令,則HI的內容爲UNPREDICTABLE。 下面的示例示出了該非法情況:

MUL  r2,r4 # start operation that will eventually write to HI,LO 
...    # code not containing mfhi or mflo 
MTLO  r6 
...    # code not containing mfhi 
        # this mfhi would get an UNPREDICTABLE value 
MFHI  r3 

歷史信息:

在MIPS I-III,如果任一前述兩個指令是MFHI,即MFHI的結果是不可預測的。 HI或LO專用寄存器的讀取必須與任何後續寫入兩條 或更多指令的指令分開。在MIPS IV及更高版本中,包括MIPS32和MIPS64,這種限制不存在。

+0

感謝額外的努力。 – 2009-05-06 01:55:54

1

想想當用作multu/divu的第二個參數(我被故意模糊,因爲這看起來像一個作業問題),其他極端值可能會產生有趣的結果。

+0

不要認爲使用multu和divu可以將值存儲在HI/LO寄存器中,因爲除非非常小心,否則每條指令都會完全覆蓋兩個寄存器:(該死的MIPS – 2009-05-07 07:17:18

6

MIPS指令集與MFLO/MFHI有對應關係。

這就是所謂的MTLO/MTHI,準確地你想要做什麼:

​​

這些指令是罕見的,往往不是出現在總結指令集的引用。

Btw:請務必查看處理器手冊,瞭解LO/HI寄存器涉及的延遲和危險。它們非常特殊,您的代碼可能需要等待至少三次寫入和讀取之間的循環。不幸的是,這種行爲取決於你正在使用哪個CPU。

獲得這個錯誤是爲有志MIPS程序員:-)

+0

謝謝,這確實是我忽略的一些東西 – 2009-05-06 01:56:21