j疑似

j

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

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