加载和存储指令对编码有相同的要求:两个寄存器和一个 12 位立即数。然而,存储指令(sb、sh、sw)具有称为S 型的专用格式,而加载指令使用与 addi 指令相同的I 型格式。
我不明白为什么加载和存储不共享指令格式,但存储只有自己专用的指令格式(S-type)。
我相信这两种格式是不同的,以简化解码。查看 I 和 S 指令的格式,您会看到:
I: | imm[11:0] | rs1 | funct3 | rd | opcode |
S: | imm[11:5] | rs2 | rs1 | funct3 | imm[4:0] | opcode |
Run Code Online (Sandbox Code Playgroud)
加载rd位于指令的相同位位置,因为在所有其他需要一个的指令中rd(I、R、U 和 UJ 格式都放在rd同一位置)。相比之下,Store 指令没有目标寄存器,而是有一个地址寄存器和一个我们存储其值的寄存器,因此所需的位rd被用作立即编码的一部分。
如果您自己尝试实现 RISC-V(在 FPGA、Logisim 或您选择的任何方式中),您会发现rd始终在同一个地方是多么方便。
总结一下为什么 S 指令具有独特的格式:在load/store像 RISC-V 这样的架构中,它们是唯一一种不修改寄存器内容的指令。其余指令确实修改了寄存器,因此需要一个rd.