la
疑似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
