Menu Close

RISC-V指令集讲解(6)load/store指令

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]。

 

LOAD/STORE机器码

图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

LW机器码

图2 LW机器编码格式 [2]

%title插图%num

 

 

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寄存器。

LH机器码

图3 LH机器编码格式 [2]

 

指令示例:

LH x13,0(x12)

在x12寄存器中的对应地址中,读出两个字节,经符号位扩展后,存到x13寄存器中,如下图所示。

%title插图%num

 

 

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寄存器中。

LHU机器码

图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寄存器中。

LB机器码

图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寄存器中。

LBU机器码

图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)存入有效地址。

SW机器码

图7 SW机器编码格式 [2]

指令示例:

SW x13,8(x12)

在x12寄存器中的数加上8的偏移量对应地址中,将x13寄存器中四个字节存进去,如下图所示。

%title插图%num

 

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寄存器中低位两个字节存进去。

SH机器码

图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寄存器中低位一个字节存进去。

SB机器码

图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.

Posted in FPGA开发板, RISC-V, RISC-V IPcore设计, RISC-V 教材教案, RISC-V开发板, 开发板, 指令集, 教材与教案, 文章

2 Comments

  1. 9班张洪泉

    文中提到cpu的寄存器只能由算术指令操作,这里讲的寄存器和算术指令,是不是就是指前面几节讲的通用寄存器和各种指令

发表回复

相关链接