发布日期:
2023-09-19
更新日期:
2024-08-02
文章字数:
755
阅读时长:
2 分
阅读次数:
计算机指令系统
Risc-V 指令
U 型


- lui 和 auipc 主要用于构造大的常量数值和链接.
- lui 设置寄存器高位立即数, 用两条指令便可以任意偏移量转移控制流或者加载任意 32 位数据.
- 将 lui 中的 20 位立即数与 jalr 中 12 位立即数组合, 可以将执行流转移到任何 32 位绝对地址.
- lui 加上标准的立即指令, 可构造一个任意 32 位常量.
- auipc 向 PC 高位加上立即数, 仅用两条指令便可以基于当前 PC 以任意偏移量转移控制流或者访问数据.
- 将 auipc 中的 20 位立即数与 jalr 中 12 位立即数组合, 可以将执行流转移到任何 32 位 PC 相对地址.
- auipc 加上普通加载或存储指令中的 12 位立即数偏移量, 可以访问任何 32 位 PC 相对地址的数据.
UJ/J 型

- J 类型的直接字段在 U 类型的基础上旋转了 12 位. 这可以降低指令信号扇出和立即数多路复用的成本, 并简化低端实现中的数据通路逻辑.
- 由于指令长度必须是两个字节的倍数, J 格式的分支和跳转地址必须向左移动 1 位以将地址乘以 2, 给予分支和跳转指令更大的跳转范围, 进行符号扩展后再添加到 PC 上, 得到跳转地址.
- jal 具有双重功能. 若将下一条指令 PC + 4 的地址保存到目标寄存器中.
- 通常是返回地址寄存器 ra, 便可实现过程调用.
- 使用零寄存器 x0 替换 ra 作为目标寄存器, 则可实现无条件跳转.
I 型 - 1

- 跳转链接指令的寄存器版本 jalr 同样是多用途的.
- 可以调用地址是动态计算出来的函数.
- 可以实现调用返回 (ra 作为源寄存器, x0 作为目的寄存器).
- switch 和 case 语句的地址跳转也可使用 jalr 指令, 目的寄存器设为 x0.


I 型 - 2





- slli 和 srli 的 shamt[4:0] 为移动量, 范围都是[4:0], 因为在 RV32I 中最大的移位量是 31 位.
- imm[10] 用来区分移位类型, 其中 slli 和 srli 指令机器码的 bit 30 为 0, 而 srai 指令机器码的 bit 30 为 1.
R 型




S 型


SB/B 型


- B 类型的立即数字段在 S 类型的基础上旋转了 1 位. 这可以降低指令信号扇出和立即数多路复用的成本, 并简化低端实现中的数据通路逻辑.
- 由于指令长度必须是两个字节的倍数, B 格式的分支和跳转地址必须向左移动 1 位以将地址乘以 2, 给予分支和跳转指令更大的跳转范围, 进行符号扩展后再添加到 PC 上, 得到跳转地址.