回答
這只是CPU的設計方式。首先,確保r0
總是被設置爲零,這是一種避免潛在代價很高的內存訪問的方法,以獲得一個非常普通的值。
一方面(閱讀),有一個寄存器預留一個包含零值的寄存器,以便您可以使用它。否則,你將不得不自己將零加載到註冊表中。
許多RISC處理器傾向於數據操縱寄存器,訪問內存只爲加載和存儲操作。這不是RISC的硬性規定,更多是一種趨勢。將寄存器放在一邊以便始終有零可用是有用的 - 這是一種折衷,因爲您可以少用一個寄存器來用於通用值,但MIPS設計人員顯然認爲這是值得的。另一方面(書寫),因爲r0
與零值相關,所以你可以把你想要的東西放在那裏,它不會有任何區別 - 它將保持爲零。這意味着如果你想拋棄價值,你可以將它用作目標。
同樣,這與RISC背後的理念有關。它傾向於支持非常少量的指令格式,如MIPS R
,I
和J
格式(寄存器,立即和跳轉)。例如,根據是否要存儲結果而不是多種指令格式,您可以有一組總是存儲結果,如果您不關心它,則將其存儲到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也可以用作源。
我工作在一個像16位cpu的RISC中。我問了這個問題,因爲我在考慮在我的情況下r0總是零,可能會有用。在我的情況下,將寄存器設置爲0值便宜(單條指令就可以));加上我只有幾條指令使用3個寄存器(僅加載/存儲),ALU操作將一個寄存器重新用作輸出(如ADD rd,rs - > rd + = rs)。我認爲r0總是爲零,在我的情況下是浪費。感謝您的回答! – Zardoz89
@paxdiablo:我想你的意思是說'加$ 0,$ 7,$ 8'。目標寄存器在MIPS中首先出現。 – markgz
我不會說「RISC背後的哲學」,它只是一個設計決定,RISC與它無關,您可以輕鬆地使用另一個寄存器,而不需要保存或重新使用該值。通過帶走r0你會失去一個gpr,這是一個沉重的代價,所以它不僅僅是一次性的價值,而是一種負擔,而不是一種儲蓄。 –
但從指令集設計點的主要原因是,/dev/null
是否存在等-register允許一定的什麼否則將有「冷凝」是(或更多)不同的指令進一個單一。幾個例子:
- 功能
call
和return
,使用鏈路寄存器,可以用單一指令來完成:- 作爲函數調用指令:
jmp <tgtreg>,<pc>,<linkreg>
(SPARCjmp
是原子mov <pc>,<linkreg>; mov <tgtreg>,<pc>
),和 - 作爲函數返回指令:
jmp <linkreg>,<nullreg>,<nullreg>
- 作爲函數調用指令:
cmp
或tst
可以是一個簡單sub <a>,<b>,<nullreg>
完成的這些表格可以從Oracle的文檔,SPARC synthetic instructions和sparcv9 synthetic instructions找到;其中大部分涉及%g0
某處。
零寄存器類似於'/ 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。 –
- 1. 爲什麼我的NSRange始終爲0?
- 2. 爲什麼grid.Rows.Count始終爲0?
- 3. 爲什麼Appointment.Conflicts.Count始終爲0?
- 4. 爲什麼xmlhttp.status始終爲0?
- 5. iPhone:textViewdDidBeginEditing:textview.tag始終爲0
- 6. NSTimeInterval始終爲0
- 7. getHistorySize()始終爲「0」
- 8. Readystate始終爲0
- 9. DataGrid.Columns.Count始終爲0
- 10. navigator.connection.type始終爲0
- 11. indexPath.row始終爲0
- 12. resultCode始終爲0
- 13. PerformaceCounter始終爲0
- 14. FREETEXTTABLE始終爲0
- 15. 爲什麼數組中的第一個元素始終爲0?
- 16. 爲什麼@ 1.first_column的值始終爲0
- 17. Repeater的Container.ItemIndex始終爲0?
- 18. UITextView的NSKernAttributeName始終爲0
- 19. 爲什麼則getIdentifier始終爲0返回一個字符串
- 20. 計算值始終爲0,我不知道爲什麼
- 21. 爲什麼我的cookie始終爲空?
- 22. 爲什麼我的asyncResult始終爲空?
- 23. 爲什麼Float32Array.length的值始終爲3?
- 24. 爲什麼我的getUID始終爲空?
- 25. 爲什麼8051不具有R0至R32
- 26. FMDB lastinsertROWID始終爲0
- 27. getItemViewType位置始終爲0
- 28. WMPLib:player.mediaCollection.getAll()。count始終爲0
- 29. UpdateParameters始終設置爲0
- 30. 元素offsetHeight始終爲「0」
g0或r0。我認爲它是SPARC中的g0! –
in MIPS它是$零或$ 0 –
它不僅出現在SPARC或MIPS中,而且在許多RISC架構中也很常見,因爲零是非常常見的值。在ARMv8 AArch64模式下,寄存器x31也硬連線爲0 –