从RISC-V指令集体系结构-指令集已经了解到RV32I是RISC-V中最基础的指令集,本将概要介绍RV32I的指令。为之后阅读和编写汇编程序做准备。
RV32I指令
RV32I指令分4类,共计47条指令,分别如下:
整数运算指令
总计21条
add/addi 算术加法
sub 算术减法
and/andi 逻辑与
or/ori 逻辑或
xor/xori 逻辑异或
sll/slli 逻辑左移
sra/srai 算术右移
srl/srli 逻辑右移
lui 加载立即数高20bit到寄存器,低12位清0
auipc 将立即数的高20bit和pc相加的结果放入寄存器
slt/sltu/slti/sltiu 小于则置位
速记方式如下:
访存指令
总计8条
lb/lh/lw 将内存内容读取到寄存器
sb/sh/sw 将寄存器内容写到内存
lbu/lhu 将内存内容读取到寄存器,进行无符号扩展
速记方式如下:
条件分支指令
总计8条:
beq 相等跳转
bne 不等跳转
bge/bgeu 大于或者等于跳转
blt/bltu 小于跳转
jal/jalr 跳转并将返回的指令地址放到ra或者寄存器
速记方式如下:
其它指令
总计10条
fence 内存访问屏障
fence.i 指令访问屏障
ebreak 转移到调试环境
ecall 向运行环境发出请求(系统调用)
csrrc/csrrci 读状态寄存器并清位
csrrs/csrrsi 读状态寄存器并置位
csrrw/csrrwi 读状态寄存器并写入值
速记方式如下:
后记
最为精简指令系统的指令集,RV32I的指令真的非常精简,移除了所有冗余的指令,例如:RV32I中没有非指令,是因为取反可以用异或来实现(异或1可以达到取反的目的).
虽然指令只有很少47条,但也无需花精力去被下来,通过速记方式理解指令功能。具体用法可以在实践中熟悉,看看示例代码,然后使用时再查spec或者示例。
参考
http://crva.io/documents/RISC-V-Reader-Chinese-v2p1.pdf
https://github.com/riscv/riscv-isa-manual/releases