lw
lyszt.netはlwおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
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
