li疑似

li

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

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

説明

li は定数をレジスタにロードします。この名前は load immediate の略で、immediate とはコードに直接書かれた固定値のことです。次の行は 42 を t0 に格納します。

li t0, 42

ほとんどのプログラムは、カウンタ、リミット、サービスコードなど、既知の数値をレジスタに格納することから始まります。

load という言葉はハードウェアの制約に由来します。RISC-V の命令は 32 ビット長で、演算、レジスタ、定数を同時に運ぶ必要があります。1 つの命令で完全な 32 ビット定数を保持することはできません。小さな定数は収まりますが、大きな定数は収まりません。

li はその制約を回避します。これは疑似命令であり、アセンブラがその値に必要な実際の命令に置き換える名前です。小さな値には 1 つの命令で済みます。大きな値には 2 つ必要で、1 つは上位部分を設定し、もう 1 つは下位部分を加算するため、次の行はどんなサイズの数値でも機能します。

li t1, 0x10010000

シミュレータは li が展開される実際の命令を表示します。

RISC-V マニュアルでは、lui を 32 ビット定数を構築する命令として説明しています。これは 20 ビットの値を宛先レジスタの上位ビットに配置し、最下位 12 ビットをゼロで埋めます。

li と la は異なるものをロードします。li は入力した数値をロードし、la はラベルが表すアドレスをロードします。この例では小さな値と大きな値をロードし、アセンブラはどちらも同じように処理します。

展開先

addi rd, zero, imm          # small constants
lui rd, hi  +  addi rd, rd, lo   # large constants

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

例

li t0, 42
li t1, 0x10010000