RISC-V基础整数指令集
导言
- RV32I基础指令集命名规则:将有下划线的字母从左到右链接起来,即可完成完整的RV32I指令集。
- 集合标志{}内列举了指令的所有变体,变体用加下划线的字母或下划线字符_表示。特别的,下划线字符_表示对于此指令不需要用字符表示。
RV32I指令格式
六种基本指令格式:
- 用于寄存器-寄存器操作的R类型指令
- 用于短立即数和访存load操作的I型指令
- 用于访存store操作的S型指令
- 用于条件跳转操作的B类型指令
- 用于长立即数的U型指令和用于无条件跳转的J型指令
指令只有六种格式,并且所有的指令都是32位长,这简化了指令解码。
RISC-V指令提供三个寄存器操作数,而不是像x86-32一样,让源操作数和目的操作数共享一个字段。
在RISC-V中对于所有指令,要读写的寄存器的标志符总是在同一位置,意味着在解码指令之前,就可以开始访问寄存器。
这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位。
RV32I寄存器
RV32I右31个寄存器加上1个值恒为0的x0寄存器
简单算术指令(add sub)、逻辑指令(and or xor)移位指令(sll srl sra)和其他ISA差不多,立即数总是进行符号扩展,这样可用立即数表示负数。
RV32I的Load和Store
除了提供32位字lw sw的加载和存储外,还支持加载有符号和无符号字节和半字lb lbu lh lhu和存储字节和半字sb sh
有什么不同之处?
- 省略了其他ISA复杂的寻址模式
- 寻址不会起始任何数据类型,可以模仿某些x86模式
- 没有特殊的堆栈指令
- 不支持延迟加载
- 不需要边界对齐
条件分支
可以比较两个寄存器并葛军比较结果进行分支跳转。
比较可以是:相等beq,不相等bne,大于等于bge,或小于blt。无符号版本bgeu和bltu
指令长度必须是两个字节的整数倍,分支指令的寻址方式是12位的立即数乘以2,符号扩展它,然后加到PC上作为分支的跳转指令。
有什么不同之处?
去掉了分支延迟,省略了一些循环指令
无条件跳转
跳转并链接指令jal
跳转并链接的寄存器版本jalr
不同之处?
RISC-V使用内存映射I/O,支持字符串处理,实现了字节存取
杂项
- 控制状态寄存器指令 (csrrc、 csrrs、 csrrw、 csrrci、 csrrsi、 csrrwi),使我们可以轻松地访问一些程- 序性能计数器
- ecall 指令用于向运行时环境发出请求,例如系统调用。
- fence 指令对外部可见的访存请求,如设备 I / O 和内存访问等进行串行化。
总结
- RISC-V继承了这些特性:
- 32位字节可寻址的地址空间
- 所有指令均为32位长
- 31个寄存器,全部32位宽,寄存器0硬连线为零
- 素有操作都在寄存器之间(没有寄存器到内存的操作)
- 加载/存储字加上有符号和无符号加载/存储字节和半字
- 所有算术,逻辑和移位指令都有立即数版本的指令
- 立即数总是符号扩展
- 仅提供一种数据寻址模式(寄存器+立即数)和PC相对分支
- 无乘法或出发指令
- 一个指令,用于将大立即数加载到寄存器的高位,这样加载32位常量到寄存器只需要两条指令
有何不同?
完整的软件对战只需要RV32I中的基本指令
RV32I具有更简单的基础ISA,具有64位地址版本