la疑似

la

疑似
RISC-V アセンブリ 参考

lyszt.netはlaおよびその他のRISC-V命令をより詳しく扱っています。

説明

la は何かのアドレスをレジスタにロードします。そのアドレスはメモリ位置であり、その位置に格納されている値は別のものです。この名前は load address の略です。

メモリ内にデータを確保するとき、arr や msg のような名前を付けます。これにより、生のアドレス番号を追跡する手間が省けます。その名前はラベルであり、メモリアドレスの読みやすい代替物です。次の行は、ラベル arr で示されるアドレスを t0 にロードします。配列が始まる位置を渡すだけで、配列の内容は読み取りません。

la t0, arr

ロード命令とストア命令(lw、sw など)は、レジスタに保持されたアドレスを受け取ります。名前付きデータを読み書きする前に、そのアドレスがレジスタに入っている必要があり、la がそれをそこに置きます。値を読み取るには2つの命令が必要です。la はデータがどこにあるかを見つけ、lw はそこにあるものを読み取ります。

RISC-V のマニュアルでは、auipc を pc 相対アドレスを構築する命令として説明しています。12ビットのオフセットを伴うロードまたはストアが後に続く auipc は、任意の32ビット pc 相対データアドレスに到達できると述べています。

アドレスとその内容の違いは、ポインタと値の違いと同じです。アドレスがレジスタに入った後は、それにオフセットを加えることで個々の要素に到達します。この例では、あるテキストのアドレスを a0 にロードします。これは print-string サービスが要求するものです。テキストがどこにあるかを伝える必要があり、サービスはそこからテキストを読み取ります。la は、アセンブラがいくつかの実際の命令から組み立てる疑似命令です。

展開先

auipc rd, hi(label)
addi  rd, rd, lo(label)

アセンブラはこの疑似命令を、上記に示された実際の命令または複数の命令に置き換えます。

例

.data
msg: .string "hi"
.text
la a0, msg     # a0 = address of msg