问题描述
在RISC-V中,我可以使用什么代码来提取值并将其存储到内存中?
例如,我可以使用:
s1
这会将结果保存到新的内存地址nextcloud:fpm
还是将其放回并存储在数组中?因此,所有数组值都存储在fastcgi_proxy
解决方法
RV32I是一种加载存储体系结构,其中只有加载和存储指令才能访问内存,而算术指令仅对CPU寄存器进行操作。加载和存储指令在寄存器和存储器之间传输值。
负载
imm[11:0] | rs1 | funct3 | rd | opcode
12 | 5 | 3 | 5 | 7
offset[11:0]| base | width | dest | LOAD
商店
imm[11:5] | rs2 | rs1 | funct3 | imm[4:0] | opcode
7 | 5 | 5 | 3 | 5 | 7
offset[11:5]| src |base | width | offset[4:0]| STORE
说明:
Load Byte LB rd,rs1,imm
Load Halfword LH rd,imm
Load Word L{W|D|Q} rd,imm
Load Byte Unsigned LBU rd,imm
Load Half Unsigned L{H|W|D}U rd,imm
Store Byte SB rs1,rs2,imm
Store Halfword SH rs1,imm
Store Word S{W|D|Q} rs1,imm
其中rs-寄存器源,rd-寄存器目标,imm-立即值。
换句话说,我们只是从内存中加载和存储数据。如果要从内存加载,则应使用:
lw t1,28(a0)
其中t1-临时寄存器,内存读取操作的目标地址为偏移量为28的地址a0。如果a0等于4000,则我们要从中读取的地址将为4028。
以相同的方式存储,反之亦然:
sw t1,28(a0)
将值从t1寄存器存储到内存地址a0 + 28。 强烈建议将数据与其数据类型对齐,否则运行速度会很慢! 同样对于RV64,我们只是将地址空间扩展到64位。其余几乎相同。 尝试查看此文档,这对于riscv程序员非常有用: https://riscv.org//wp-content/uploads/2017/05/riscv-spec-v2.2.pdf