一、定義:
三、32 位指令集
本文只是簡單的介紹32位指令集的一些原理及使用:
1、立即數編碼變種
1)ADDI將符號擴展的12位立即數加到寄存器rs1上。算術溢出被忽略,而結果就是運算結果的低XLEN位。ADDI rd,rs1,0用於實現MV rd,rs1匯編語言偽指令。SLTI(set less than immediate)將數值1放到寄存器rd中,如果寄存器rs1小於符號擴展的立即數(比較時,兩者都作為有符號數),否則將0寫入rd。SLTIU與之相似,但是將兩者作為無符號數進行比較(也就是說,立即數被首先符號擴展為XLEN位,然后被作為一個無符號數)。注意,SLTIU rd,rs1,1將設置rd為1,如果rs1等於0,否則將rd設置為0(匯編語言偽指令SEQZ rd,rs)。ANDI、ORI、XORI是邏輯操作,在寄存器rs1和符號擴展的12位立即數上執行按位AND、OR、XOR操作,並把結果寫入rd。注意,XORI rd,rs1,-1在rs1上執行一個按位取反操作(匯編語言偽指令NOT rd,rs)。

2)被移位常數次,被編碼為I類格式的特例。被移位的操作數放在rs1中,移位的次數被編碼到I立即數字段的低5位。右移類型被編碼到I立即數的一位高位。SLLI是邏輯左移(0被移入低位);SRLI是邏輯右移(0被移入高位);SRAI是算術右移(原來的符號位被復制到空出的高位中)。

3)LUI(load upper immediate)用於構建32位常數,並使用U類格式。LUI將U立即數放到目標寄存器rd的高20位,將rd的低12位填0。AUIPC(add upper immediate to pc)用於構建pc相對地址,並使用U類格式。AUIPC從20位U立即數構建一個32位偏移量,將其低12位填0,然后將這個偏移量加到pc上,最后將結果寫入寄存器rd。

2、控制轉移指令
1)無條件跳轉
跳轉並連接(JAL)指令使用了UJ類格式,此處J立即數編碼了一個2的倍數的有符號偏移量。這個偏移量被符號擴展,加到pc上,形成跳轉目標地址,跳轉范圍因此達到±1MB。JAL將跳轉指令后面指令的地址(pc+4)保存到寄存器rd中。標准軟件調用約定使用x1來作為返回地址寄存器。普通的無條件跳轉指令(匯編語言偽指令J)被編碼為rd=x0的JAL指令
2)間接跳轉指令JALR(jump and link register)使用I類編碼。通過將12位有符號I類立即數加上rs1,然后將結果的最低位設置為0,作為目標地址。跳轉指令后面指令的地址(pc+4)保存到寄存器rd中。如果不需要結果,則可以把x0作為目標寄存器。

3)條件分支
分支指令比較兩個寄存器。BEQ和BNE將跳轉,如果rs1和rs2相等或者不相等。BLT和BLTU將跳轉,如果rs1小於rs2,分別使用有符號數和無符號數進行比較。BGE和BGEU將跳轉,如果rs1大於等於rs2,分別使用有符號數和無符號數進行比較。注意,BGT、BGTU、BLE和BLEU可以通過將BLT、BLTU、BGE、BGEU的操作數對調來實現。

3、Load 和 store 指令
RV32I是一個load-store體系結構,也就是說,只有load和store指令可以訪問存儲器,而算術指令只在CPU寄存器上進行操作運算。RV32I提供了一個32位用戶地址空間,它是字節尋址並且是小端的。執行環境將定義這個地址空間的哪些部分是可以合法訪問的(譯者注:這涉及到存儲保護等)。
Load和store指令在寄存器和存儲器之間傳輸數值。Load指令編碼為I類格式,而store指令編碼為S類格式。有效字節地址是通過將寄存器rs1與符號擴展的12位偏移量相加而獲得的。Load指令將存儲器中的一個值復制到寄存器rd中。Store指令將寄存器rs2中的值復制到存儲器中。LW指令將一個32位數值從存儲器復制到rd中。LH指令從存儲器中讀取一個16位數值,然后將其進行符號擴展到32位,再保存到rd中。LHU指令存儲器中讀取一個16位數值,然后將其進行零擴展到32位,再保存到rd中。對於8位數值,LB和LBU指令的定義與前面類似。SW、SH、SB指令分別將從rs2低位開始的32位、16位、8位數值保存到存儲器中。

4、整數寄存器-寄存器操作
ADD和SUB分別執行加法和減法。溢出被忽略,並且結果的低XLEN位被寫入目標寄存器rd。SLT和SLTU分別執行符號數和無符號數的比較,如果rs1<rs2,則將1寫入rd,否則寫入0。注意,SLTU rd,x0,rs2,如果rs2不等於0(譯者注:在RISC-V中,x0寄存器永遠是0),則把1寫入rd,否則將0寫入rd(匯編語言偽指令SNEZ rd,rs)。AND、OR、XOR執行按位邏輯操作。SLL、SRL、SRA分別執行邏輯左移、邏輯右移、算術右移,被移位的操作數是寄存器rs1,移位次數是寄存器rs2的低5位。
附錄

這些博客的內容來自我工作、學習時的感悟、與行業前輩的交流感悟以及讀書時的筆記,一部分內容可能與其他的網絡資源類似,如果有相關問題的話(比如內容有錯),請私聊博主或者在博文下面留言評論。
寫博客最初目的就是記錄自己容易忘記的東西,而不是像寫書那樣專門寫給別人看的。所以,文章可以轉載(轉載請標明出處 http://www.cnblogs.com/podia/ ,作者:podia),無需版權。
