Skip to content

Latest commit

 

History

History
68 lines (45 loc) · 2.82 KB

day8-learning.md

File metadata and controls

68 lines (45 loc) · 2.82 KB

Risc-V学习

第一章 为什么要有 RISC-V

RISC-V的目标是成为一个通用的指令集架构(ISA):

模块化与增量型 ISA

ISA 设计 101

第二章 RV32I: RISC-V 基础整数指令集

  • 32 位字节可寻址的地址空间
  • 所有指令均为 32 位长
  • 31 个寄存器,全部 32 位宽,寄存器 0 硬连线为零
  • 所有操作都在寄存器之间(没有寄存器到内存的操作)
  • 加载/存储字加上有符号和无符号加载/存储字节和半字
  • 所有算术,逻辑和移位指令都有立即数版本的指令
  • 立即数总是符号扩展
  • 仅提供一种数据寻址模式(寄存器+立即数)和 PC 相对分支
  • 无乘法或除法指令
  • 一个指令,用于将大立即数加载到寄存器的高位,这样加载 32 位常量到寄存器只需要两条指令

六种基本指令格式:

  • 用于寄存器-寄存器操作的 R 类型指令
  • 用于短立即数和访存 load 操作的 I 型指令
  • 用于访存 store 操作的 S 型指令
  • 用于条件跳转操作的 B 类型指令
  • 用于长立即数的 U 型指令
  • 用于无条件跳转的 J 型指令

RV32I 寄存器:

  • RV32I 有 31 寄存器加上一个值恒为 0 的 x0 寄存器

RV32I 整数计算:

  • 简单的算术指令(add, sub)、逻辑指令(and, or, xor),以及图 2.1 中的移位指令(sll, srl, sra) 和其他 ISA 差不多。
  • RV32I 提供一个当小于时置位的指令
  • RISC-V 中没有字节或半字宽度的整数计算操作
  • RV32I 也不包含乘法和除法,它们包含在可选的 RV32M 扩展中

RV32I 的 Load 和 Store

  • RV32I 支持加载有符号和无符号字节和半字(lb, lbu, lh, lhu)和存储字节和半字(sb, sh)

RV32I 条件分支 无条件跳转

  • RV32I 可以比较两个寄存器并根据比较结果上进行分支跳转。
  • 跳转并链接指令(jal)具有双重功能。

RV32I 杂项

  • 控制状态寄存器指令 (csrrc、 csrrs、 csrrw、 csrrci、 csrrsi、 csrrwi),使我们可以轻松地访问一些程序性能计数器
  • ecall 指令用于向运行时环境发出请求,例如系统调用。
  • fence 指令对外部可见的访存请求,如设备 I / O 和内存访问等进行串行化。

第三章 RISC-V 汇编语言

  • 汇编器向 RISC-V ISA 中增加了 60 条伪指令,使得 RISC-V 代码更易于读写,并且不增加硬件开销。
  • 将一个寄存器硬编码为 0 使得其中许多伪指令更容易实现。
  • 使用加载高位立即数(lui)和程序计数器与高位立即数相加(auipc)两条指令,简化了编译器和链接器寻找外部数据/函数的地址的过程。
  • 使用相对地址转移的代码与位置无关,减少了链接器的工作。
  • 大量的寄存器减少了寄存器保存和恢复的次数,加速函数调用和返回。