1. 加载-存储指令
相关参考文章:
RISC-V教学教案
RV32I是一个加载-存储(load-store)架构。也是只有load和store指令才能访问存储器和外设(CPU 内的寄存器只能由算术指令操作) [1]。load和store指令将寄存器和存储器/外设的值相互交换。
load指令被编码成I-type,其opcode为0000_011,store指令被编码成S-type,opcode为0100_011,如图1所示。
有效地址是由rs1寄存器中的值加上符号位扩展的12位立即数(store指令中的立即数被拆分成了两个部分)得到的。
一般来说,load指令将存储器/外设中有效地址的值复制一份到rd寄存器,store指令将rs2寄存器中的值复制到存储器/外设中的有效地址 [1]。
图1 load/store机器编码格式 [1]
2.LOAD指令
2.1.LW
LW(load word)指令格式为LW rd,offset(rs1)。x[rd] = sext ( M [x[rs1] + sext(offset) ] [31:0] )
其机器码如图2所示,其funct3为010。该指令是从有效地址中读取四个字节(一个字,word),并写入rd寄存器。
指令示例:
LW x13,4(x12)
在x12寄存器中的数加上4的偏移量对应地址中,读出四个字节,存到x13寄存器中。
opcode为000_0011
funct3为010
immediate为12’b0000_0000_0100
rs1为 5’b0_1100
rd为 5’b0_1101
所以LW x13,4(x12)对应的机器码为0000_0000_0100_01100_010_01101_0000011,对应的16进制为32’h0046_2683
图2 LW机器编码格式 [2]
2.2.LH
LH(load halfword)指令格式为LH rd,offset(rs1)。x[rd] = sext( M [x[rs1] + sext(offset)] [15:0])
其机器码如图3所示,其funct3为001。该指令是从有效地址中读取两个字节(半个字,halfword),经符号位扩展后写入rd寄存器。
图3 LH机器编码格式 [2]
指令示例:
LH x13,0(x12)
在x12寄存器中的对应地址中,读出两个字节,经符号位扩展后,存到x13寄存器中,如下图所示。
2.3.LHU
LHU(load halfword,unsigned)指令格式为LHU rd,offset(rs1)。x[rd] = M[x[rs1] + sext(offset)][15:0]
其机器码如图4所示,其funct3为101。该指令是从有效地址中读取两个字节(半个字,halfword),经零扩展后写入rd寄存器。
指令示例:
LHU x13,0(x12)
在x12寄存器中的对应地址中,读出两个字节,经零扩展后,存到x13寄存器中。
图4 LHU机器编码格式 [2]
2.4.LB
LB(load byte)指令格式为LB rd,offset(rs1)。x[rd] = sext( M [x[rs1] + sext(offset)] [7:0])
其机器码如图5所示,其funct3为000。该指令是从有效地址中读取一个字节(byte),经符号位扩展后写入rd寄存器。
指令示例:
LB x13,0(x12)
在x12寄存器中的对应地址中,读出一个字节,经符号位扩展后,存到x13寄存器中。
图5 LB机器编码格式 [2]
2.5.LBU
LBU(load byte,unsigned)指令格式为LBU rd,offset(rs1)。x[rd] = M[x[rs1] + sext(offset)][7:0]
其机器码如图6所示,其funct3为100。该指令是从有效地址中读取一个字节(byte),经零扩展后写入rd寄存器。
指令示例:
LBU x13,0(x12)
在x12寄存器中的对应地址中,读出一个字节,经零扩展后,存到x13寄存器中。
图6 LBU机器编码格式 [2]
3.STORE指令
3.1.SW
SW(store word)指令格式为SW rs2,offset(rs1)。M[x[rs1] + sext(offset)]= x[rs2][31: 0]
其机器码如图7所示,其funct3为010。该指令是将rs2寄存器中四个字节(一个字,word)存入有效地址。
图7 SW机器编码格式 [2]
指令示例:
SW x13,8(x12)
在x12寄存器中的数加上8的偏移量对应地址中,将x13寄存器中四个字节存进去,如下图所示。
3.2.SH
SH(store halfword)指令格式为SH rs2,offset(rs1)。M[x[rs1] + sext(offset)] = x[rs2][15: 0]
其机器码如图8所示,其funct3为001。该指令是将rs2寄存器低位两个字节(半个字,halfword)存入有效地址。
指令示例:
SH x13,0(x12)
在x12寄存器中的对应地址中,将x13寄存器中低位两个字节存进去。
图8 SH机器编码格式 [2]
3.3.SB
SB(store byte)指令格式为SB rs2,offset(rs1)。M[x[rs1] + sext(offset)]= x[rs2][7: 0]
其机器码如图9所示,其funct3为000。该指令是将rs2寄存器低位字节(byte)存入有效地址。
指令示例:
SB x13,0(x12)
在x12寄存器中的对应地址中,将x13寄存器中低位一个字节存进去。
图9 SB机器编码格式 [2]
4.文章参考
[1] Riscv.org, 2021. [Online]. Available: https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf. [Accessed: 22- Feb- 2021].
[2] D. Patterson and A. Waterman, The RISC-V reader. Berkeley: Strawberry Canyon LLC, 2018.
1. 地址对齐:目标地址必须是所访问之数据单元字节数的整数倍
文中提到cpu的寄存器只能由算术指令操作,这里讲的寄存器和算术指令,是不是就是指前面几节讲的通用寄存器和各种指令