j
疑似lyszt.netはjおよびその他のRISC-V命令をより詳しく扱っています。
説明
j は最も単純なジャンプを実行します。常にラベルへ制御を移し、条件は付きません。分岐命令は比較が成功したときにのみ制御を移します。構文は j label です。
これは無条件ジャンプであり、goto とも呼ばれます。ループや if/else ブロックはこれに依存しています。基本的なループでは、先頭に条件分岐を置いて脱出するタイミングを決め、ループ本体を実行し、最後に先頭へ戻る j で終わります。このジャンプがなければ、実行は末尾で終わり、ループは決して繰り返されません。if と else では、if ブロックの末尾の j が else ブロックを飛び越えるため、2 つのブロックのうち片方だけが実行されます。
j は戻りアドレスを記録しません。これが関数呼び出しとの違いです。ループのためであれブロックを飛ばすためであれ、コード内を移動するには j を使い、実行が戻ってくる必要があるときは call を使います。判断の決め手は、戻りが必要かどうかです。
RISC-V マニュアルでは、単純な無条件ジャンプは rd を x0 に設定した jal としてエンコードされます。常に真となる条件分岐ではなく、無条件分岐には常にこのジャンプを使うべきだと述べています。ジャンプは pc 相対でもあり、分岐よりもはるかに広い範囲をカバーし、条件分岐予測テーブルには手を付けません。
j は以下の行の疑似命令です。
jal zero, label
これは jump and link であり、戻りアドレスを zero レジスタに書き込みます。その値は破棄されるため、ジャンプだけが残ります。この例ではループの先頭へジャンプして戻ります。
展開先
jal zero, label
アセンブラはこの疑似命令を、上記に示された実際の命令または複数の命令に置き換えます。
例
j loop # go back to the top of the loop
電子
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.2, Conditional Branches, pages 31 to 32.
