RV32I指令集
RV32I是最基本的32位base指令集,它支援32位定址空間,支援位元組地址訪問,僅支援小端格式(little-endian,高地址高位,低地址地位),暫存器也是32位整數暫存器。RV32I指令集的目的是儘量簡化硬體的實施設計,所以它只有47條指令。
在RV32I指令集架構中,包括32個通用目的暫存器,其中x0被預留為常數0,其它31個暫存器(x1-x31)是普通的通用整數暫存器。在Risc-V組合語言中,每個通用暫存器都有一個對應的ABI名字,也就是說在組合語言中,x1等價於ra,它們都會編譯成相同的機器碼。
在Risc-V架構中,要得到當前指令pc(指令在儲存器中的位置,instruction program counter),可以通過AUIPC指令,把它讀入到一個通用暫存器中。
暫存器 | ABI名字 | 註釋 | Saver | x0 | zero | Hard-wired zero,常數0 | x1 | ra | Return address | caller,呼叫函式的指令pc | x2 | sp | Stack pointer | callee,被呼叫的函式指令pc | x3 | gp | Global pointer | x4 | tp | Thread pointer | x5 | t0 | Temporary/alternate link register | caller | x6 | t1 | Temporaries | caller | x7 | t2 | Temporaries | caller | x8 | s0/fp | Saved register/frame pointer | caller | x9 | s1 | Saved register | caller | x10 | a0 | Function arguments/return values | caller | x11 | a1 | Function arguments/return values | caller | x12 | a2 | Function arguments | caller | x13 | a3 | Function arguments | caller | x14 | a4 | Function arguments | caller | x15 | a5 | Function arguments | caller | x16 | a6 | Function arguments | caller | x17 | a7 | Function arguments | caller | x18 | s2 | Saved registers | caller | x19 | s3 | Saved registers | caller | x20 | s4 | Saved registers | caller | x21 | s5 | Saved registers | caller | x22 | s6 | Saved registers | caller | x23 | s7 | Saved registers | caller | x24 | s8 | Saved registers | caller | x25 | s9 | Saved registers | caller | x26 | s10 | Saved registers | caller | x27 | s11 | Saved registers | caller | x28 | t3 | Temporaries | caller | x29 | t4 | Temporaries | caller | x30 | t5 | Temporaries | caller | x31 | t6 | Temporaries | caller |
Base指令格式:
RV32I指令格式包括以下6種,每種指令格式都是固定的32位指令,所以指令在記憶體中必須4位元組對齊,否則將觸發異常。
其中rd表示目的暫存器,rs1是源運算元暫存器1,rs2是源運算元暫存器2。
imm表示指令中的立即數,比如imm[11:0],表示一個12位的立即數,它的高20位會符號位擴充套件,imm[31:12]表示一個32位的立即數,它的低12位會補0。
下圖是各種指令格式擴充套件後的32位立即數。
RV32I整數指令集分為幾個種類:
1.Load和store指令
Category | Fmt | RV32I base | machine code(bin) | comment | |
Loads | load byte | I | LB rd, rs1, imm | [31-20,imm][19-15,rs1]000[11-7,rd] |
stores | store byte | S | SB rs1, rs2, imm | [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]000[11-7,imm[4-0]]0100011 | mem[rs1+imm]=rs2的低8bit資料 |
store half word | S | SB rs1, rs2, imm | [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]001[11-7,imm[4-0]]0100011 | mem[rs1+imm]=rs2的低16bit資料 | |
store word | S | SB rs1, rs2, imm | [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]010[11-7,imm[4-0]]0100011 | mem[rs1+imm]=rs2的32bit資料 |
RV32I是一個load /store架構,所有的memory訪問都是通過load/store指令,其它指令都是在暫存器之間進行運算,比如加法指令,減法指令等等。