Skip to content
Published at:

附录 A. RV64I 基础指令速查表

RV64I 是 RISC-V 64 位基础整数指令集,共 50 条基础指令(不含扩展)。所有指令按功能分组,按指令格式(R/I/S/B/U/J)组织编码。本节是完整速查表,供编程时快速查阅指令的操作语义、funct3 和 funct7 编码。

算术运算(R-type,opcode=0110011)

寄存器-寄存器操作。rs1、rs2 为源寄存器,rd 为目的寄存器。

指令操作语义funct3funct7
add rd, rs1, rs2rd = rs1 + rs20000000000
sub rd, rs1, rs2rd = rs1 - rs20000100000
sll rd, rs1, rs2rd = rs1 << rs2[5:0]0010000000
slt rd, rs1, rs2rd = (rs1 < rs2) ? 1 : 0(有符号)0100000000
sltu rd, rs1, rs2rd = (rs1 < rs2) ? 1 : 0(无符号)0110000000
xor rd, rs1, rs2rd = rs1 ^ rs21000000000
srl rd, rs1, rs2rd = rs1 >> rs2[5:0](逻辑右移)1010000000
sra rd, rs1, rs2rd = rs1 >> rs2[5:0](算术右移)1010100000
or rd, rs1, rs2rd = rs1 | rs21100000000
and rd, rs1, rs2rd = rs1 & rs21110000000

注意:RV64I 中所有 R-type 算术指令默认为 64 位操作。RV32I 中同样指令操作 32 位数据。

立即数算术运算(I-type,opcode=0010011)

寄存器与 12 位有符号立即数操作。

指令操作语义funct3
addi rd, rs1, immrd = rs1 + imm(符号扩展)000
slli rd, rs1, shamtrd = rs1 << shamt(shamt[5:0],高位移出)001
slti rd, rs1, immrd = (rs1 < imm) ? 1 : 0(有符号)010
sltiu rd, rs1, immrd = (rs1 < imm) ? 1 : 0(无符号)011
xori rd, rs1, immrd = rs1 ^ imm100
srli rd, rs1, shamtrd = rs1 >> shamt(逻辑,shamt[5:0])101
srai rd, rs1, shamtrd = rs1 >> shamt(算术,shamt[5:0])101
ori rd, rs1, immrd = rs1 | imm110
andi rd, rs1, immrd = rs1 & imm111

移位立即数:slli/srli/srai 的 shamt 取低 6 位(0-63),funct7 用于区分 srli(0000000)和 srai(0100000),汇编器根据指令名自动填入。

RV64I 特有 32 位算术运算(R-type,opcode=0111011)

操作 32 位数据,结果符号扩展至 64 位写入 rd。

指令操作语义funct3funct7
addw rd, rs1, rs2rd = sign_extend((rs1 + rs2)[31:0])0000000000
subw rd, rs1, rs2rd = sign_extend((rs1 - rs2)[31:0])0000100000
sllw rd, rs1, rs2rd = sign_extend(rs1[31:0] << rs2[4:0])0010000000
srlw rd, rs1, rs2rd = sign_extend(rs1[31:0] >> rs2[4:0] 逻辑)1010000000
sraw rd, rs1, rs2rd = sign_extend(rs1[31:0] >> rs2[4:0] 算术)1010100000

RV64I 特有 32 位立即数运算(I-type,opcode=0011011)

指令操作语义funct3
addiw rd, rs1, immrd = sign_extend((rs1 + imm)[31:0])000
slliw rd, rs1, shamtrd = sign_extend(rs1[31:0] << shamt[4:0])001
srliw rd, rs1, shamtrd = sign_extend(rs1[31:0] >> shamt[4:0] 逻辑)101
sraiw rd, rs1, shamtrd = sign_extend(rs1[31:0] >> shamt[4:0] 算术)101

注意:W 后缀指令的移位量仅取低 5 位(0-31)。slliw/srliw/sraiw 的 funct7 用于区分 srliw(0000000)和 sraiw(0100000)。

Load 指令(I-type,opcode=0000011)

从内存加载数据到寄存器。地址 = rs1 + imm(12 位有符号立即数)。

指令位宽符号扩展操作语义funct3
lb rd, imm(rs1)8rd = sign_extend(M[rs1+imm][7:0])000
lh rd, imm(rs1)16rd = sign_extend(M[rs1+imm][15:0])001
lw rd, imm(rs1)32rd = sign_extend(M[rs1+imm][31:0])010
ld rd, imm(rs1)64rd = M[rs1+imm][63:0]011
lbu rd, imm(rs1)8零扩展rd = zero_extend(M[rs1+imm][7:0])100
lhu rd, imm(rs1)16零扩展rd = zero_extend(M[rs1+imm][15:0])101
lwu rd, imm(rs1)32零扩展rd = zero_extend(M[rs1+imm][31:0])110

Store 指令(S-type,opcode=0100011)

将寄存器数据写入内存。地址 = rs1 + imm(12 位有符号立即数,inst[31:25] 存放 imm[11:5],inst[11:7] 存放 imm[4:0])。

指令位宽操作语义funct3
sb rs2, imm(rs1)8M[rs1+imm][7:0] = rs2[7:0]000
sh rs2, imm(rs1)16M[rs1+imm][15:0] = rs2[15:0]001
sw rs2, imm(rs1)32M[rs1+imm][31:0] = rs2[31:0]010
sd rs2, imm(rs1)64M[rs1+imm][63:0] = rs2[63:0]011

分支指令(B-type,opcode=1100011)

比较 rs1 与 rs2,条件满足时跳转至 PC + imm(imm 为 13 位有符号立即数,以 2 字节为单位的偏移量)。B-type 编码:inst[31]=imm[12],inst[7]=imm[11],inst[30:25]=imm[10:5],inst[11:8]=imm[4:1]。

指令条件说明funct3
beq rs1, rs2, labelrs1 == rs2相等则跳转000
bne rs1, rs2, labelrs1 != rs2不等则跳转001
blt rs1, rs2, labelrs1 < rs2有符号小于100
bge rs1, rs2, labelrs1 >= rs2有符号大于等于101
bltu rs1, rs2, labelrs1 < rs2无符号小于110
bgeu rs1, rs2, labelrs1 >= rs2无符号大于等于111

跳转指令

指令格式操作语义
jal rd, labelJ-typerd = PC+4; PC = PC + offset(21 位有符号立即数,2 字节对齐)
jalr rd, imm(rs1)I-typerd = PC+4; PC = (rs1 + imm) & ~1

J-type 立即数编码:inst[31]=imm[20],inst[19:12]=imm[19:12],inst[20]=imm[11],inst[30:21]=imm[10:1]。最终跳转偏移 = {imm[20], imm[1], imm[11], imm[19:12], imm[10:5], imm[4:1], 1'b0}。

Load Upper / Add Upper 指令(U-type)

U-type 格式:20 位立即数存放于指令的 [31:12] 位,写入 rd 的高 20 位。

指令格式操作语义opcode
lui rd, immU-typerd = imm << 12(低 12 位填 0)0110111
auipc rd, immU-typerd = PC + (imm << 12)0010111

系统指令(I-type,opcode=1110011)

指令操作语义funct3说明
ecall触发环境调用异常000系统调用 / 调试
ebreak触发断点异常000调试器断点
fence iorw, iorw内存访问顺序约束001多核/IO 同步
fence.i指令缓存同步001自修改代码后使用

ecall 和 ebreak 的 funct12 字段不同:ecall=000000000000,ebreak=000000000001。

控制状态寄存器(CSR)指令(I-type,opcode=1110011)

指令操作语义funct3
csrrw rd, csr, rs1rd = CSR; CSR = rs1(原子读写)001
csrrs rd, csr, rs1rd = CSR; CSR = CSR | rs1(原子读后置位)010
csrrc rd, csr, rs1rd = CSR; CSR = CSR & ~rs1(原子读后清除)011
csrrwi rd, csr, uimmrd = CSR; CSR = uimm(立即数原子读写)101
csrrsi rd, csr, uimmrd = CSR; CSR = CSR | uimm(立即数读后置位)110
csrrci rd, csr, uimmrd = CSR; CSR = CSR & ~uimm(立即数读后清除)111

rs1/uimm 为 x0 时,CSR 不写入(伪读操作)。rd 为 x0 时,CSR 旧值丢弃(伪写操作)。

opcode 速查表

opcode[6:0]指令类型格式
0110111luiU-type
0010111auipcU-type
1101111jalJ-type
1100111jalrI-type
1100011分支指令(beq/bne/blt/bge/bltu/bgeu)B-type
0000011Load 指令(lb/lh/lw/ld/lbu/lhu/lwu)I-type
0100011Store 指令(sb/sh/sw/sd)S-type
0010011立即数算术(addi/slti/sltiu/xori/ori/andi/slli/srli/srai)I-type
0110011寄存器算术(add/sub/sll/slt/sltu/xor/srl/sra/or/and)R-type
0011011RV64I 32 位立即数算术(addiw/slliw/srliw/sraiw)I-type
0111011RV64I 32 位寄存器算术(addw/subw/sllw/srlw/sraw)R-type
0001111FENCE / FENCE.II-type
1110011系统指令(ecall/ebreak/CSR)I-type

指令格式位域速查

格式位域布局
R-typefunct7[31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0]
I-typeimm[11:0][31:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0]
S-typeimm[11:5][31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | imm[4:0][11:7] | opcode[6:0]
B-typeimm[12|10:5][31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | imm[4:1|11][11:7] | opcode[6:0]
U-typeimm[31:12][31:12] | rd[11:7] | opcode[6:0]
J-typeimm[20|10:1|11|19:12][31:12] | rd[11:7] | opcode[6:0]

指令数统计

类别指令数备注
寄存器算术10add/sub/sll/slt/sltu/xor/srl/sra/or/and
立即数算术9addi/slli/slti/sltiu/xori/srli/srai/ori/andi
RV64 W 寄存器算术5addw/subw/sllw/srlw/sraw
RV64 W 立即数算术4addiw/slliw/srliw/sraiw
Load7lb/lh/lw/ld/lbu/lhu/lwu
Store4sb/sh/sw/sd
分支6beq/bne/blt/bge/bltu/bgeu
跳转2jal/jalr
Upper2lui/auipc
系统4ecall/ebreak/fence/fence.i
CSR6csrrw/csrrs/csrrc/csrrwi/csrrsi/csrrci
合计59