sw
lyszt.net 更详细地介绍了 sw 和其他 RISC-V 指令。
编码格式
R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode
描述
sw 从寄存器中取值并将其写入内存,与 lw 相反。该名称代表 store word,而一个 word 是 32 位。加载将数据从内存移入寄存器以便处理,存储则将结果送回。这两条指令构成了 RISC-V 的加载、计算、存储循环,因为算术运算只在寄存器中进行。
sw 的语法如下所示。其操作数顺序与大多数指令不同。
sw rs2, offset(rs1)
rs2 保存要写入的值。第二个操作数 offset(rs1) 给出内存中的目标地址:基址寄存器 rs1 中的地址加上一个小常量偏移,这与 lw 使用的寻址方式相同。下面这行将 t1 中的值写入 t0 所保存的地址。
sw t1, 0(t0)
sw 不改变任何寄存器。它的效果完全落在内存上,而几乎所有其他指令都会写入寄存器。
RISC-V 手册指出,sw、sh 和 sb 将寄存器 rs2 低位中的 32 位、16 位和 8 位值存储到内存。有效地址是寄存器 rs1 加上符号扩展的 12 位偏移。在自然对齐的地址上进行加载和存储绝不会引发对齐错误,手册保证它们以原子方式执行,即作为一个不可分割的步骤。
存储将结果保存到数组和变量中,函数用它们将值放入栈上的暂存空间。一次存储会覆盖目标地址处的全部 4 个字节。该示例将 99 写入内存中一个带标签的位置,替换原来那里的内容。与寄存器不同,内存会一直保存该值,直到另一次存储将其覆盖。
示例
la t0, slot li t1, 99 sw t1, 0(t0) # memory at slot now holds 99
