天天看點

說說RISC-V的x0寄存器

RISC-V有32個通用寄存器,其中第1個寄存器x0寫死為0,即讀出來總是0,寫進去總是被丢棄。x0為RISC-V指令集的簡化可貢獻不少啊。

mingdu.zheng at gmail dot com

搞過Linux的都知道Linux有兩個特殊的裝置:​

​/dev/zero​

​​和​

​/dev/null​

​​。從​

​/dev/zero​

​​可以源源不斷地讀到0,往​

​/dev/null​

​​寫的任何内容都被丢棄。如果要建立一個需要填0的檔案,就從​

​/dev/zero​

​​拷貝,如果要丢棄一些輸出,就把輸出重定向到​

​/dev/null​

​。

RISC-V的x0寄存器就相當于是硬體版的​

​/dev/zero​

​​和​

​/dev/null​

​的組合體。從x0讀出來的總是0,往x0寫進去的總是被丢棄。是以這x0提供了兩種功能,一是提供常量0,在軟體程式設計中0可以說是最常用的常量了;二是提供一個可以丢棄結果的場所。有了這個x0,很多本來需要單獨指令的操作隻要更普通的指令加上x0就可以實作了。

比如​

​nop​

​​空指令,RISC-V沒有提供​

​nop​

​​指令噢,RISC-V用​

​addi x0, x0, 0​

​​來實作空指令的,這條​

​addi​

​使用x0作為目标寄存器,x0是會丢棄結果的,是以這條指令不會對程式狀态産生任何影響,和空指令是完全等價的。這就不需要單獨的空指令了。

比如​

​neg​

​​取負數指令,RISC-V用​

​sub rd, x0, rs​

​​來實作,​

​x0 - rs​

​​ 等價于 ​

​0 - rs​

​​ 等價于 ​

​-rs​

​,有了x0,就可以用更普通的減法指令來實作取負數指令。

比如​

​j​

​​跳轉指令,RISC-V沒有單獨的​

​j​

​​跳轉指令,隻有​

​jal​

​​跳轉連結指令,跳轉之前總是要把下一條指令的位址拷貝到寄存器,但是如果用x0作為jal的操作寄存器,即把下一條指令的位址拷貝到x0,那麼效果就等價于​

​j​

​跳轉指令了,因為寫入x0的任何值都是會被丢棄的呀。

繼續閱讀