nop疑似

nop

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

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

説明

nop は何もしません。名前は「no operation」を短縮したものです。プロセッサが nop に到達しても、レジスタは変化せず、メモリにも触れず、実行は次の命令へと続きます。プログラム内の1スロットを占め、1ティックの時間が経過します。

nop は以下の行のための疑似命令です。

addi zero, zero, 0

RISC-V には常に 0 を保持する zero と呼ばれるレジスタがあります。読み出しは 0 を返し、書き込みは破棄されます。この addi は 0 と 0 を加算して結果を破棄するため、命令は完了し、何も変化しません。RISC-V では zero レジスタが nop を提供するため、専用の nop は必要ありません。

実際のプロセッサは、後続の命令がハードウェアにとってより高速に処理できるメモリ境界から始まるようにするためのパディングとして、また、ツールが後で実際の命令に上書きするプレースホルダーとして nop を使用します。コンパイラは当然のようにこれらを挿入するため、プログラマが入力していなくても逆アセンブルされたコードに含まれます。

RISC-V のマニュアルには、nop は pc を進め、パフォーマンスカウンタをインクリメントすることを除いて、プログラムが観察できるものを含め、アーキテクチャ上可視の状態を何も変更しないと記載されています。用途は2つ示されています。コードセグメントをハードウェアに適したアドレス境界に整列させることと、後でコードを変更するための余地を残すことです。マニュアルは、このエンコーディングが addi を使用する理由を、この命令がレジスタを1つしか読まないため、ほとんどのシステムで最も少ないリソースで済むからだと説明しています。

このシミュレータでは、nop は実験中のスペーサーまたはマーカーとして機能します。1つをステップオーバーすると、pc は 4 進み、レジスタやメモリの位置は変化しません。

展開先

addi zero, zero, 0

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

例

li t0, 1
nop              # advances one instruction, changes nothing
addi t0, t0, 1   # t0 = 2