jr疑似

jr

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

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

説明

jr はレジスタに格納されたアドレスへジャンプします。名前は jump register の略です。j はコードに書かれた固定のラベルへジャンプします。jr はレジスタが保持する任意のアドレスへジャンプし、そのアドレスはプログラムが実行中に算出します。戻りアドレスは保存しません。

jr は以下の行の擬似命令であり、戻りアドレスを破棄するレジスタジャンプです(jalr を参照)。

jalr zero, rs, 0

ジャンプテーブルとは、複数のルーチンのアドレスを保持するメモリ内の配列であり、jr はこれと組み合わせて使われます。ルーチン番号 i を選ぶには、プログラムはテーブル内のそのスロットを計算し、そこに格納されたアドレスをレジスタにロードして jr でそこへジャンプします。1 回の参照と 1 回のジャンプで、長い一連の比較(case 0 か、case 1 か、case 2 か、など)を置き換えられます。ケースの数がいくつであっても変わりません。密な switch 文やインタプリタの内部ループのディスパッチはこの方式で行います。

RISC-V のマニュアルでは、単純な無条件間接ジャンプは rd を x0 に設定した jalr としてエンコードされます。jalr は条件分岐とは異なり、その即値を 2 バイトの倍数として扱わないこと、また jalr のほとんどの使用では即値がゼロであるか、lui または auipc の後に来ることに言及しています。

関数からの戻りは ra 内のアドレスへのジャンプであるため、ret は別名の jr ra です。ジャンプ命令のグループは、アドレスの出所と戻りアドレスを保存するかどうかが異なります。

展開先

jalr zero, rs, 0

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

例

la t0, target
jr t0            # jump to the address held in t0