みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

NOP命令のオペランドは無し?

アセンブラ言語の命令文である「NOP命令」は「何もしない」という命令がありますが、「オペランド(値)」はそれ自体ない命令(オペコード)なんでしょうか?

わかりやすく教えてください。

よろしくお願いいたします。

投稿日時 - 2019-02-03 13:08:15

QNo.9584176

すぐに回答ほしいです

質問者が選んだベストアンサー

オペランドは無いですね。


NOPは何もしない分けではなく、プログラムカウンタはひとつ進めます。
NOPの使い方は様々ありますが、問題のあるコードを
NOPに上書きや編集することがあります。

パソコン上では、ソースを修正し再度コンパイルして再実行で済みますが、
組み込み系のプログラミングの場合、再度コンパイルしたあとは、
ROMに書き込んだり、ICEなどデバッグ用機器へ転送します。
これらの時間は馬鹿にできないことが多いので、問題箇所を
一時的にNOPで潰し、デバッグや動作確認などを進めることは、
一般的な手法です。

マシン語にコンパイルされたコードは1バイトの場合もあれば、
3バイトなどの複数で奇数バイトの場合があります。
もしNOPにオペランドがあったりすると、潰す作業が大変になります。
オペランド分余計に潰す必要がでますし、潰したい領域のコードと、
合わない可能性が出るからです。

また製品版のROM焼きした後でも上書きができるよう、そのROMの
特性に合わせて、0x00か0xFFのどちらかに割り当てられています。
(ROMが基本は一度しか書き込みできないのは、片方の動作しか行わないため)

このような背景から、NOPにオペランドは無いほうが使いやすいですし、
ROMの事情もあるので、そもそも1つしかコードを割り当てることができません。

以上、参考にならなかったらごめんなさい。

投稿日時 - 2019-02-03 14:57:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

CPU の実装によるでしょう。RISC だと大抵ゼロレジスタ r0 使った実質何もしない命令で代用してますし (例えば sll r0, r0, r0 とか)、x86 でも元々は xchg ax,ax の alias ですが、nop dword ptr [eax] などオペランドありの nop もあります。

あとは CPU によっては branch never (ニーモニックだと BN とか BRN とか) でマルチバイトの nop 代りに使うことはありました。どちらもアライメントのパディングだったり、バイト数節約やらサイクル数節約やらなにやら、macro とか使えばある程度それらしくも使えますし

投稿日時 - 2019-02-03 20:27:11

ANo.3

http://7shi.hateblo.jp/entry/2013/06/05/015758

8086での
nop =x90
です
1バイト命令であり
命令系では 何もしないですが
1サイクル=1クロック分 時間がかかります

ioアクセスで他のデバイスに書き込み
すぐ読みだした場合 デバイスに書き込むのには 数十サイクルかかる
そも時間を埋めるのに よく nop を使った

この技術は マシンクロック数に依存するので 現在は使いにくい


将来の予備領域 として nop として埋める


プロテクトチェックを潰す
プロテクトは所詮 サブルーチン や 分岐命令なので その命令を潰すために
nop で埋める

投稿日時 - 2019-02-03 20:23:11

ANo.1

 
何もしないのだからオペランド部が合っても意味ないでしょ。
STOPやRETも同じ
 

投稿日時 - 2019-02-03 13:27:49

あなたにオススメの質問