2013-10-02 58 views
3

我知道當你在SPARC CPU(和MIPS)中使用紅色%r0時,總是返回0,但我想知道爲什麼?爲什麼SPARC或MIPS的%r0始終爲0?

什麼決定是背後的原因,爲什麼?

+1

g0或r0。我認爲它是SPARC中的g0! –

+0

in MIPS它是$零或$ 0 –

+0

它不僅出現在SPARC或MIPS中,而且在許多RISC架構中也很常見,因爲零是非常常見的值。在ARMv8 AArch64模式下,寄存器x31也硬連線爲0 –

回答

4

這只是CPU的設計方式。首先,確保r0總是被設置爲零,這是一種避免潛在代價很高的內存訪問的方法,以獲得一個非常普通的值。

一方面(閱讀),有一個寄存器預留一個包含零值的寄存器,以便您可以使用它。否則,你將不得不自己將零加載到註冊表中。

許多RISC處理器傾向於數據操縱寄存器,訪問內存只爲加載和存儲操作。這不是RISC的硬性規定,更多是一種趨勢。將寄存器放在一邊以便始終有零可用是有用的 - 這是一種折衷,因爲您可以少用一個寄存器來用於通用值,但MIPS設計人員顯然認爲這是值得的。另一方面(書寫),因爲r0與零值相關,所以你可以把你想要的東西放在那裏,它不會有任何區別 - 它將保持爲零。這意味着如果你想拋棄價值,你可以將它用作目標。

同樣,這與RISC背後的理念有關。它傾向於支持非常少量的指令格式,如MIPS R,IJ格式(寄存器,立即和跳轉)。例如,根據是否要存儲結果而不是多種指令格式,您可以有一組總是存儲結果,如果您不關心它,則將其存儲到r0中。

因此,如果你想檢查是否添加兩個寄存器將導致溢出,但不想在任何地方存儲結果,您可以使用:

add $0, $7, $8 ; r0 <- r7 + r8, but r0 remains at 0. 

MIPS的文檔,MIPS32 Architecture for Programmers Volume I: Introduction to the MIPS32 Architecture,確認以上:

R0硬連線爲零值,可用作其結果將被丟棄的任何指令的目標寄存器。當需要零值時,R0也可以用作源。

+0

我工作在一個像16位cpu的RISC中。我問了這個問題,因爲我在考慮在我的情況下r0總是零,可能會有用。在我的情況下,將寄存器設置爲0值便宜(單條指令就可以));加上我只有幾條指令使用3個寄存器(僅加載/存儲),ALU操作將一個寄存器重新用作輸出(如ADD rd,rs - > rd + = rs)。我認爲r0總是爲零,在我的情況下是浪費。感謝您的回答! – Zardoz89

+1

@paxdiablo:我想你的意思是說'加$ 0,$ 7,$ 8'。目標寄存器在MIPS中首先出現。 – markgz

+0

我不會說「RISC背後的哲學」,它只是一個設計決定,RISC與它無關,您可以輕鬆地使用另一個寄存器,而不需要保存或重新使用該值。通過帶走r0你會失去一個gpr,這是一個沉重的代價,所以它不僅僅是一次性的價值,而是一種負擔,而不是一種儲蓄。 –

1

但從指令集設計點的主要原因是,/dev/null是否存在等-register允許一定的什麼否則將有「冷凝」是(或更多)不同的指令進一個一。幾個例子:

  • 功能callreturn,使用鏈路寄存器,可以用單一指令來完成:
    • 作爲函數調用指令:jmp <tgtreg>,<pc>,<linkreg>
      (SPARC jmp是原子mov <pc>,<linkreg>; mov <tgtreg>,<pc>),和
    • 作爲函數返回指令:jmp <linkreg>,<nullreg>,<nullreg>
  • cmptst可以是一個簡單sub <a>,<b>,<nullreg>

完成的這些表格可以從Oracle的文檔,SPARC synthetic instructionssparcv9 synthetic instructions找到;其中大部分涉及%g0某處。

+0

零寄存器類似於'/ dev/zero',而不是'/ dev /開發/ null'。兩者都放棄寫入,但是'/ dev/zero'讀取爲零,而'/ dev/null'讀取爲空(即不能從中讀取)。而順便說一句,MIPS沒有標誌(而是使用[比較寄存器指令,例如'sltu dst,src1,src2'](http://www.mrc.uidaho.edu/mrc/people/jff/digital/ MIPSir。html)),所以'sub'作爲目標寄存器只有在帶有標誌的CPU上[像SPARC](http://faculty.kutztown.edu/spiegel/CSc235/PowerPoint/FLAGS_AND_BRANCHING.HTML)或ARM 。但ARM沒有零註冊表,並且幾乎不像RISCy。 –