lw

lw

RISC-V アセンブリ 参考

lyszt.netはlwおよびその他の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

説明

lwはメモリからレジスタに値をコピーします。32個のレジスタはプロセッサの小さく高速な作業領域を形成します。メモリはその傍らに大きな記憶域として存在します。つまり、配列、テキスト、変数を保持する番号付きスロットの長い列です。スロットの番号がそのアドレスです。計算はレジスタで行われ、データは使用の合間にメモリで待機します。

RISC-Vはレジスタに対してのみ演算を行い、メモリに対して直接行うことはないため、値は使用前にレジスタにロードし、その後でストアし直す必要があります。lwがそのロードを実行します。名前はload wordを意味し、ワードは32ビットの値で、1つのレジスタの幅です。

lwの形式を以下に示します。rs1の値、つまりベースと呼ばれるメモリアドレスを保持するレジスタの値を取り、offsetという小さな定数を加え、結果のアドレスにある値を宛先レジスタrdに読み込みます。

lw rd, offset(rs1)

次の行はt0のアドレスから8バイト先の値8をロードします。

lw t1, 8(t0)

RISC-VのマニュアルはRISC-Vをロードストアアーキテクチャと呼んでいます。メモリに到達する命令はロードとストアのみであり、算術命令はレジスタのみを操作します。アドレス空間は32ビットでバイトアドレス指定であり、ロードの実効アドレスはレジスタrs1に符号拡張された12ビットのオフセットを加えたものです。実行環境、つまりプログラムが動作するシステムは、メモリが最下位バイトを先に保持するか(リトルエンディアンと呼ばれる)、最上位バイトを先に保持するか(ビッグエンディアンと呼ばれる)を決定します。アクセスのアドレスがアクセスのサイズ(ワードの場合は4バイト)で均等に割り切れるとき、そのアクセスは自然に整列しています。自然に整列したアクセスは整列エラーを発生させません。整列していないアクセスは環境が定義するように動作し、非常に遅く実行されることがあります。

オフセットが存在するのは、メモリ内の項目が規則的な間隔で配置されているためです。ワードは4バイトなので、配列の連続する要素は4バイト離れて、オフセット0、4、8などに位置します。laは配列の開始アドレスをレジスタに配置し、オフセットを変更することで異なる要素を読み取ります。例では配列の隣接する2つの値をロードします。オフセット0は最初の値10を与え、オフセット4は次の値20を与えます。

例

.data
arr: .word 10, 20
.text
la t0, arr
lw t1, 0(t0)   # t1 = 10
lw t2, 4(t0)   # t2 = 20