mv疑似

mv

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

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

説明

mvは、あるレジスタの値を別のレジスタにコピーします。名前はmoveの略です。以下の行の後、両方のレジスタは同じ値を保持し、ソースであるt0は変更されません。

mv a0, t0

mvは疑似命令です。アセンブラはこの読みやすい名前を、以下に示す実際の命令に書き換えます。

addi rd, rs, 0

値にゼロを加えて別の場所に格納すると、コピーが作られます。RISC-Vには専用のmove命令がなく、代わりに加算を再利用します。

レジスタごとに役割が異なり、これがmvを使う通常の理由です。慣例として、計算は一時レジスタ(t0、t1など)で行われます。関数が呼び出されると、その引数は特定のレジスタ(a0、a1など)に入り、結果はa0で返されます。したがってプログラムは、呼び出しの前にmvを置いて計算された値を呼び出されるコードが読むレジスタに入れ、呼び出しの後にmvを置いて返された結果を安全な場所に保存します。

mv a0, t0
call square
mv s0, a0

適切なタイミングで値を適切なレジスタに配置することはアセンブリの大部分を占め、mvがそれを行います。

RISC-Vのマニュアルには、定数0を伴うaddiがmvアセンブラ疑似命令を実装すると記載されています。

mvは値をコピーするため、後で宛先を変更してもソースは変更されません。これによりmvは、ループが元の値を変更する前に値のコピーを保持するのに役立ちます。シミュレータのトレースは、mvの代わりに実行されるaddiを示します。

展開先

addi rd, rs, 0

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

例

li t0, 42
mv t1, t0         # t1 = 42