risc-v有32個通用暫存器,其中第1個暫存器x0硬編碼為0,即讀出來總是0,寫進去總是被丟棄。x0為risc-v指令集的簡化可貢獻不少啊。
mingdu.zhengatgmail 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的任何值都是會被丟棄的呀。
比如beqz
等於零跳轉指令等等一系列和0比較的跳轉指令,程式中和0比較是相當常見的操作了,risc-v中和0比較的指令就是普通的比較跳轉指令,無非是用了x0暫存器做指令的運算元罷了。
其它還有很多這樣的指令,用普通的指令加上x0做運算元,就實現了那些沒有x0暫存器的處理器需要單獨指令或者需要組合兩條指令才能實現的操作。更多這樣的指令可以參考《the risc-v instruction set manual volume i: user-level isa》chapter 20 risc-v assembly programmer』s handbook ,這個handbook中定義了大量的偽指令,大部分偽指令都使用了x0作為運算元。
彙編複習0x00 暫存器 190710
今天覆習了一波彙編,學了點ida操作 學的亂七八糟就不寫了 王爽的書上是16位,只能起到引導作用,已經不實用了,也就是說學完了那本之後連入門都不算,只能說了解了個大概。32位系統下 暫存器 比16位的前面多了乙個e 如ip eip 但其實,也可以用ip表示。舉個例子 eip 11111111 ip ...
x86的暫存器
最近一段時間,在看組合語言方面的東西。看的大部分都是基於8086。而8086的晶元中是16位的資料線,16位的暫存器。看了大部分指令後也是16位的。所在在把程式移植到32位的處理器上的時候,就會發現有此不同。雖然處理器是32位的,但是它還是保留的ax,bx,cx,dx,bp暫存器還是16位。其定址方...
解決IIC不能設定暫存器,暫存器總是0
dualxu 2010 07 30 11 10 mini2440 linux2.6.32 在核心驅動中我想直接讀寫spi和iic暫存器,但通過ioremap後,無法寫暫存器,請各位幫忙看看 科長大叔 2010 08 02 09 44 clkcon這個暫存器需要設定 spi和i2c的pclk使能 否則...