- ベストアンサー
NOP命令のオペランドは無し?
アセンブラ言語の命令文である「NOP命令」は「何もしない」という命令がありますが、「オペランド(値)」はそれ自体ない命令(オペコード)なんでしょうか? わかりやすく教えてください。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
オペランドは無いですね。 ※ NOPは何もしない分けではなく、プログラムカウンタはひとつ進めます。 NOPの使い方は様々ありますが、問題のあるコードを NOPに上書きや編集することがあります。 パソコン上では、ソースを修正し再度コンパイルして再実行で済みますが、 組み込み系のプログラミングの場合、再度コンパイルしたあとは、 ROMに書き込んだり、ICEなどデバッグ用機器へ転送します。 これらの時間は馬鹿にできないことが多いので、問題箇所を 一時的にNOPで潰し、デバッグや動作確認などを進めることは、 一般的な手法です。 マシン語にコンパイルされたコードは1バイトの場合もあれば、 3バイトなどの複数で奇数バイトの場合があります。 もしNOPにオペランドがあったりすると、潰す作業が大変になります。 オペランド分余計に潰す必要がでますし、潰したい領域のコードと、 合わない可能性が出るからです。 また製品版のROM焼きした後でも上書きができるよう、そのROMの 特性に合わせて、0x00か0xFFのどちらかに割り当てられています。 (ROMが基本は一度しか書き込みできないのは、片方の動作しか行わないため) このような背景から、NOPにオペランドは無いほうが使いやすいですし、 ROMの事情もあるので、そもそも1つしかコードを割り当てることができません。 以上、参考にならなかったらごめんなさい。
その他の回答 (3)
- trapezium
- ベストアンサー率62% (276/442)
CPU の実装によるでしょう。RISC だと大抵ゼロレジスタ r0 使った実質何もしない命令で代用してますし (例えば sll r0, r0, r0 とか)、x86 でも元々は xchg ax,ax の alias ですが、nop dword ptr [eax] などオペランドありの nop もあります。 あとは CPU によっては branch never (ニーモニックだと BN とか BRN とか) でマルチバイトの nop 代りに使うことはありました。どちらもアライメントのパディングだったり、バイト数節約やらサイクル数節約やらなにやら、macro とか使えばある程度それらしくも使えますし
- hahaha8635
- ベストアンサー率22% (800/3610)
http://7shi.hateblo.jp/entry/2013/06/05/015758 8086での nop =x90 です 1バイト命令であり 命令系では 何もしないですが 1サイクル=1クロック分 時間がかかります ioアクセスで他のデバイスに書き込み すぐ読みだした場合 デバイスに書き込むのには 数十サイクルかかる そも時間を埋めるのに よく nop を使った この技術は マシンクロック数に依存するので 現在は使いにくい 将来の予備領域 として nop として埋める プロテクトチェックを潰す プロテクトは所詮 サブルーチン や 分岐命令なので その命令を潰すために nop で埋める
- 中京区 桑原町(@l4330)
- ベストアンサー率22% (4373/19606)
何もしないのだからオペランド部が合っても意味ないでしょ。 STOPやRETも同じ