1. 寄存器
32個x寄存器,RV32下x reg是32位寬
x0:硬連線 常數0 專門的零寄存器
x1-x31:31個通用reg
返回地址:沒有強制要求那一個x作為lr,但是一般用x1
pc:額外的用戶可見寄存器
2. 基本指令格式
四種基礎指令格式 R/I/S/U
imm:立即數
rs1:源寄存器1
rs2:源寄存器2
rd:目標寄存器
opcode:操作碼
example: C.LI 指令被擴展為 addi rd, x0, imm[5:0]。
3 整形運算
使用R或者I類指令
R類:寄存器-立即數
I類:寄存器-寄存器
整數計算不會造成運算異常
寄存器-立即數:
ADDI:將12位有符號立即數和rs相加,溢出忽略,直接使用結果的最低32bit,並存入rd
偽指令MV:"MV rd,rs"實際上是"ADDI rd, rs, 0"
SLTI:如果rs小於立即數(都是有符號整數),將rd置1,否則置0
SLTIU:和SLTI一致,不過都是無符號數
偽指令SEQZ:"SEQZ rd, rs" 實際上是 "SLTIU rd, rs1, 1"
ANDI/ORI/XORI:rs與有符號12位立即數進行and,or,xor操作
偽指令NOT:"NOT rd, rs"實際上是"XORI rd, rs1, -1"
shift是I類指令格式
SLLI:邏輯左移,低位移入0
SRLI:邏輯右移,高位移入0
SRAI:算數右移,符號移入高位
u類指令格式
LUI:創建32位無符號整數,存放立即數到rd的高20位,低12位置0
AUIPC:創建pc的相對地址,pc+無符號立即數(偏移量)=>rd
寄存器-寄存器:
ADD/SUB:rs1(+/-)rs2 => rd
SLT/SLTU: 如果rs1<rs2,rd寫1; 否則rd為0
AND/OR/XOR: rs1與rs2進行and,or,xor操作
SLL/SRL/SRA: 和"寄存器-立即數"指令一致,將r2的低5位作為立即數即可
NOP指令:
實際上是ADDI x0,x0,0
4. 控制傳輸指令
1)非條件跳轉:
JAL:J類指令,立即數+pc為跳轉目標,rd存放pc+4(返回地址)
跳轉范圍為pc(+/-)1MB
JALR:I類指令,rs+立即數為跳轉目標,rd存放pc+4(返回地址)
實現遠跳轉
2)條件跳轉
所有分支指令使用B類指令格式,12位立即數+pc作為目標
跳轉范圍為pc(+/-)4KB
BEQ/BNE:rs1(==/!=)rs2, 分別在相等或者不等時,發生跳轉
BLT:rs1 < rs2, 跳轉
BGE:rs1 >= rs2, 跳轉
5 加載存儲指令
RV32I是一個加載/存儲架構,只有load/store能訪問內存,運算指令只操作寄存器
load是I類指令,store是S類指令
LOAD:rs作為基地址,加上有符號的偏移,讀取到rd寄存器
STORE:rs1作為基地址加上有符號的偏移,作為內存地址,寫入內容為rs2
6. 控制狀態寄存器指令
寄存器-寄存器:讀/寫/修改 CSR
CSRRW:Atomic Read/Write CSR
讀取CSR的值存入rd寄存器,並將rs存入CSR
另外:如果rd為x0,將不會執行
CSRRS:Atomic Read and Set Bits in CSR
讀取CSR的值存入rd寄存器,並根據rs中高位對CSR置1
另外:如果rs為x0,將不會執行
CSRRC:Atomic Read and Clear Bits in CSR
讀取CSR的值存入rd寄存器,並根據rs中高位對CSR置0
另外:如果rs為x0,將不會執行
立即數-寄存器:讀/寫/修改 CSR
CSRRWI/CSRRSI/CSRRCI
將CSRRW類寄存器中的rs換成立即數
另外:如果立即數為0,將不會執行
用戶級系統指令:時鍾和計數器
RV32I提供三個64位只讀用戶級寄存器:RDCYCLE[H]/RDTIME[H]/RDINSTRET[H]
使用CSRRS讀取這三個寄存器的高32 bit
RDCYCLE:時鍾周期計數
RDTIME:時間 tick數
RDINSTRET:指令數
參考文檔: https://blog.csdn.net/zhangshuaiisme/article/details/80718496