计算机组成原理 笔记1


计算机指令系统

Risc-V 指令

U 型

  • luiauipc 主要用于构造大的常量数值和链接.
  • 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

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

R 型

S 型

SB/B 型

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

文章作者: Chengsx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chengsx !
  目录