riscv学习参考自如下的书,感谢几位优秀的老师和同学的工作,让我不用看英文。
RISC-V 手册(中文版)
翻译:勾凌睿、黄成、刘志刚
校阅:包云岗
还有感谢Patterson等人,创造出如此优秀的ISA
本书主要参考资料:
- 参考卡
RISC-V全部指令集的精简描述(P1) - 指令图
每章的第一个图
以同样的格式列出了所有RISC-V指令的全称 - 操作码映射
这些表格在一页展示了指令布局,操作码,格式类型和每页指令扩展的指令助记符 - 指令术语表
附录A
对每个RISC-V指令和伪指令的详细描述,加起来还不到50页。 - 索引
通过指令全称或助记符找到描述指令说明、定义、或图标的页面。
risc-v有六种基本指令格式
- R-type
寄存机-寄存器操作 - I-type
短立即数和访存load操作 - S-type
访存store操作 - B-type
条件跳转操作 - U-type
长立即数操作 - J-type
无条件跳转
RISC-V更简洁的ISA设计能够提高性能功耗比
- 指令只有6种格式,并且所有指令都是32位长,简化了指令解码(这一点在做PA工程中尤其能感受到)
- RISC-V提供三个寄存器操作数
- x86-32中,让源操作数和目的操作数共享一个字段,当一个操作天然就需要三个不同的操作数,而ISA只提供了两个操作数的时候,编译器或汇编程序员就需要多使用一条move指令,来保存寄存器的值。
- 在risc-v中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器
- 这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位
第二章 RV32I:risc-v基础整数指令集
- 所有位全部是0是非法的RV32I指令
- 因此,试图跳转到被清零的内存区域的错误跳转会立即触发异常。
- 所有为全部是1的指令也是非法指令
- 它将捕获其他常见的错误
RV32I 寄存器
- RV32I 有31寄存器加上一个值恒为0的x0寄存器,还有一个PC
- 与之相比,ARM-32有16个寄存器,x86-32有8个寄存器
- 程序计数器(PC)是ARM-32的16个寄存器之一,这意味着任何改变寄存器的指令都有可能导致分支跳转。
- PC作为一个寄存器使硬件分支预测变得复杂
- PC作为一个寄存器使硬件分支预测变得复杂
RV32I 整数计算
RV32I 包含以下:
- 算数指令: add,sub
- 逻辑指令: and,or,xor
- 移位指令: sll,srl,sra
- 它们从寄存器读取两个32位的值,并将32位结果写到目标寄存器
- RV32I还提供了这些指令的立即数版本,立即数总是进行符号扩展(与ARM-32不同),这样子如果需要,我们可以用立即数表示负数。因此,不需要一个立即数版本的sub
- 当小于时置位:slt,sltu
- 加载立即数到高位:lui
- 将20位常量加载到寄存器的高20位
- 向PC高位加上立即数(auipc)
- Load和Store:
- 32位字的加载和存储:lw,sw
- 有符号和无符号字节和半字:lb,lbu,lh,lhu
- 存储字节和半字:sb,sh
- 字节和半字扩展为32位在写入目的寄存器
- 条件分支:
- 相等:beq,不相等:bne
- 大于等于:bge,小于:blt。 (有符号比较)
- bdeu,bltu(无符号比较)
- 无条件跳转:
- 跳转并链接指令:jal,jalr(寄存器版本)
- 杂项:
- 控制状态寄存器指令:csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi
访问一些程序性能计数器(64位) - ecal指令 用于向运行时环境发出请求
如系统调用 - 调试器使用ebreak指令 将控制转移到调试环境
- fence指令对外部可见的访存请求
- 控制状态寄存器指令:csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi
特点
- RISC-V 中没有字节或半字宽度的整数计算操作,操作始终以完整的寄存器宽度(32位)。
- 注意:内存访问时,字节或半字宽度会节省大量能量(比如能耗、速度),但低宽度的计算不会,意义不大。
- RV32I 不包含乘法和除法,它们包含在可选的RV32M扩展中(第4章)
- NOTE:RISC-V 选择了小端字节序,因为它在商业上占主导地位。
- 获取PC:
- 当前PC可以通过quipc的U立即数字段设置为0来获得
特性
- 当前PC可以通过quipc的U立即数字段设置为0来获得