sw

sw

RISC-V アセンブリ 参考

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 ビットです。ロードはメモリからレジスタへデータを移動して演算できるようにし、ストアは結果を再び外へ送り出します。算術演算はレジスタ内でのみ行われるため、この 2 つの命令が RISC-V のロード、計算、ストアのサイクルを構成します。

sw の構文は以下に示します。オペランドの順序はほとんどの命令と異なります。

sw rs2, offset(rs1)

rs2 は書き込む値を保持します。第 2 オペランドの offset(rs1) はメモリ内の宛先アドレス、すなわちベースレジスタ rs1 のアドレスに小さな定数オフセットを加えたものを与えます。これは lw が使うのと同じアドレッシングです。以下の行は t1 の値を t0 が保持するアドレスに書き込みます。

sw t1, 0(t0)

sw はどのレジスタも変更しません。その効果は完全にメモリに及びますが、ほぼ他のすべての命令はレジスタに書き込みます。

RISC-V マニュアルには、sw、sh、sb がレジスタ rs2 の下位ビットから 32 ビット、16 ビット、8 ビットの値をメモリにストアすると記載されています。実効アドレスはレジスタ rs1 に符号拡張された 12 ビットオフセットを加えたものです。自然にアラインされたアドレスでのロードとストアはアラインメントエラーを決して発生させず、マニュアルはそれらが 1 つの不可分なステップとしてアトミックに実行されることを保証しています。

ストアは結果を配列や変数に保存し、関数はそれを使ってスタック上のスクラッチ空間に値を配置します。ストアは対象アドレスの 4 バイトすべてを上書きします。この例では 99 をメモリ内のラベル付きの場所に書き込み、そこにあったものを置き換えます。レジスタとは異なり、メモリは別のストアが上書きするまでその値を保持します。

例

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99