RISC-V 常用指令和伪指令系统分类总结
算术运算指令
- 基本算术运算
指令 | 格式 | 功能描述 |
---|---|---|
add |
add rd, rs1, rs2 |
寄存器加法 (rd = rs1 + rs2) |
sub |
sub rd, rs1, rs2 |
寄存器减法 (rd = rs1 - rs2) |
addi |
addi rd, rs1, imm |
立即数加法 (rd = rs1 + sign-extended imm) |
mul |
mul rd, rs1, rs2 |
有符号乘法 (RV32M/RV64M) |
div |
div rd, rs1, rs2 |
有符号除法 (RV32M/RV64M) |
- 逻辑运算
指令 | 格式 | 功能描述 |
---|---|---|
and |
and rd, rs1, rs2 |
按位与 |
or |
or rd, rs1, rs2 |
按位或 |
xor |
xor rd, rs1, rs2 |
按位异或 |
andi |
andi rd, rs1, imm |
立即数按位与 |
ori |
ori rd, rs1, imm |
立即数按位或 |
xori |
xori rd, rs1, imm |
立即数按位异或 |
- 移位运算
指令 | 格式 | 功能描述 |
---|---|---|
sll |
sll rd, rs1, rs2 |
逻辑左移 (rd = rs1 << rs2[4:0]) |
srl |
srl rd, rs1, rs2 |
逻辑右移 |
sra |
sra rd, rs1, rs2 |
算术右移 |
slli |
slli rd, rs1, shamt |
立即数逻辑左移 |
srli |
srli rd, rs1, shamt |
立即数逻辑右移 |
srai |
srai rd, rs1, shamt |
立即数算术右移 |
数据传输指令
- 加载指令
指令 | 格式 | 功能描述 |
---|---|---|
lb |
lb rd, offset(rs1) |
加载字节 (符号扩展) |
lh |
lh rd, offset(rs1) |
加载半字 (符号扩展) |
lw |
lw rd, offset(rs1) |
加载字 (32位) |
ld |
ld rd, offset(rs1) |
加载双字 (RV64) |
lbu |
lbu rd, offset(rs1) |
加载无符号字节 |
lhu |
lhu rd, offset(rs1) |
加载无符号半字 |
lwu |
lwu rd, offset(rs1) |
加载无符号字 (RV64) |
- 存储指令
指令 | 格式 | 功能描述 |
---|---|---|
sb |
sb rs2, offset(rs1) |
存储字节 |
sh |
sh rs2, offset(rs1) |
存储半字 |
sw |
sw rs2, offset(rs1) |
存储字 |
sd |
sd rs2, offset(rs1) |
存储双字 (RV64) |
控制流指令
- 无条件跳转
指令 | 格式 | 功能描述 |
---|---|---|
jal |
jal rd, offset |
跳转并链接 (rd = pc+4) |
jalr |
jalr rd, offset(rs1) |
间接跳转并链接 |
j |
j offset |
直接跳转 (伪指令) |
- 条件分支
指令 | 格式 | 功能描述 |
---|---|---|
beq |
beq rs1, rs2, offset |
相等时分支 |
bne |
bne rs1, rs2, offset |
不等时分支 |
blt |
blt rs1, rs2, offset |
有符号小于时分支 |
bge |
bge rs1, rs2, offset |
有符号大于等于时分支 |
bltu |
bltu rs1, rs2, offset |
无符号小于时分支 |
bgeu |
bgeu rs1, rs2, offset |
无符号大于等于时分支 |
伪指令
- 常用伪指令
伪指令 | 实际指令 | 功能描述 |
---|---|---|
nop |
addi x0, x0, 0 |
空操作 |
mv rd, rs |
addi rd, rs, 0 |
寄存器复制 |
not rd, rs |
xori rd, rs, -1 |
按位取反 |
neg rd, rs |
sub rd, x0, rs |
取负值 |
j offset |
jal x0, offset |
无条件跳转 |
ret |
jalr x0, 0(x1) |
从子程序返回 |
call offset |
auipc x1, offset[31:12] jalr x1, offset[11:0](x1) |
调用远过程 |
tail offset |
auipc x0, offset[31:12] jalr x0, offset[11:0](x0) |
尾调用 |
- 地址加载伪指令
伪指令 | 实际指令 | 功能描述 |
---|---|---|
la rd, symbol |
auipc rd, symbol[31:12] addi rd, rd, symbol[11:0] |
加载绝对地址 |
li rd, imm |
根据立即数大小选择不同指令序列 | 加载立即数 |
系统指令
- CSR操作
指令 | 格式 | 功能描述 |
---|---|---|
csrrw |
csrrw rd, csr, rs1 |
CSR读后写 |
csrrs |
csrrs rd, csr, rs1 |
CSR读后置位 |
csrrc |
csrrc rd, csr, rs1 |
CSR读后清除 |
csrr |
csrr rd, csr |
CSR读 (伪指令 = csrrs rd, csr, x0) |
csrw |
csrw csr, rs1 |
CSR写 (伪指令 = csrrw x0, csr, rs1) |
- 特权指令
指令 | 格式 | 功能描述 |
---|---|---|
ecall |
ecall |
环境调用 |
ebreak |
ebreak |
断点 |
wfi |
wfi |
等待中断 |
mret |
mret |
从机器模式异常返回 |
sret |
sret |
从监管模式异常返回 |
原子操作指令 (A扩展)
指令 | 格式 | 功能描述 |
---|---|---|
lr.w |
lr.w rd, (rs1) |
加载保留 (32位) |
sc.w |
sc.w rd, rs2, (rs1) |
条件存储 (32位) |
amoswap.w |
amoswap.w rd, rs2, (rs1) |
原子交换 (32位) |
amoadd.w |
amoadd.w rd, rs2, (rs1) |
原子加 (32位) |
amoand.w |
amoand.w rd, rs2, (rs1) |
原子与 (32位) |
浮点指令 (F/D扩展)
- 基本浮点运算
指令 | 格式 | 功能描述 |
---|---|---|
fadd.s |
fadd.s rd, rs1, rs2 |
单精度浮点加 |
fsub.s |
fsub.s rd, rs1, rs2 |
单精度浮点减 |
fmul.s |
fmul.s rd, rs1, rs2 |
单精度浮点乘 |
fdiv.s |
fdiv.s rd, rs1, rs2 |
单精度浮点除 |
fsqrt.s |
fsqrt.s rd, rs1 |
单精度平方根 |
- 浮点转换
指令 | 格式 | 功能描述 |
---|---|---|
fcvt.w.s |
fcvt.w.s rd, rs1 |
单精度转有符号字 |
fcvt.s.w |
fcvt.s.w rd, rs1 |
有符号字转单精度 |