• ベストアンサー

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

アセンブラ言語の命令文である「NOP命令」は「何もしない」という命令がありますが、「オペランド(値)」はそれ自体ない命令(オペコード)なんでしょうか? わかりやすく教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
  • skp026
  • ベストアンサー率45% (1011/2238)
回答No.2

オペランドは無いですね。 ※ NOPは何もしない分けではなく、プログラムカウンタはひとつ進めます。 NOPの使い方は様々ありますが、問題のあるコードを NOPに上書きや編集することがあります。 パソコン上では、ソースを修正し再度コンパイルして再実行で済みますが、 組み込み系のプログラミングの場合、再度コンパイルしたあとは、 ROMに書き込んだり、ICEなどデバッグ用機器へ転送します。 これらの時間は馬鹿にできないことが多いので、問題箇所を 一時的にNOPで潰し、デバッグや動作確認などを進めることは、 一般的な手法です。 マシン語にコンパイルされたコードは1バイトの場合もあれば、 3バイトなどの複数で奇数バイトの場合があります。 もしNOPにオペランドがあったりすると、潰す作業が大変になります。 オペランド分余計に潰す必要がでますし、潰したい領域のコードと、 合わない可能性が出るからです。 また製品版のROM焼きした後でも上書きができるよう、そのROMの 特性に合わせて、0x00か0xFFのどちらかに割り当てられています。 (ROMが基本は一度しか書き込みできないのは、片方の動作しか行わないため) このような背景から、NOPにオペランドは無いほうが使いやすいですし、 ROMの事情もあるので、そもそも1つしかコードを割り当てることができません。 以上、参考にならなかったらごめんなさい。

その他の回答 (3)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.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 とか使えばある程度それらしくも使えますし

  • hahaha8635
  • ベストアンサー率22% (800/3609)
回答No.3

http://7shi.hateblo.jp/entry/2013/06/05/015758 8086での nop =x90 です 1バイト命令であり 命令系では 何もしないですが 1サイクル=1クロック分 時間がかかります ioアクセスで他のデバイスに書き込み すぐ読みだした場合 デバイスに書き込むのには 数十サイクルかかる そも時間を埋めるのに よく nop を使った この技術は マシンクロック数に依存するので 現在は使いにくい 将来の予備領域 として nop として埋める プロテクトチェックを潰す プロテクトは所詮 サブルーチン や 分岐命令なので その命令を潰すために nop で埋める

回答No.1

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

関連するQ&A

  • LEA命令についてわかりやすく

    アセンブラ言語の命令(オペコード)の一つに「LEA命令」というのがあるのですが この「LEA命令」というのはどんなことをするのですか? イメージが全然湧きません。 わかりやすく教えてください。できればわかりやすい「例え」で教えてくれたほうが幸いです。 よろしくお願いいたします。

  • x86・x64系でのアセンブラで頻出する主な命令

    以前の質問と重複しますが・・・ アセンブラ言語に関して(「x86系」「x64系」のもの)、ネットで検索すると命令の種類が沢山ありすぎて、全て覚えるのが大変で、しかも、どの命令が良く頻出するのかよくわからないので、よく頻出する基本的な命令(オペコード等)の種類を教えてください。 特に「x86系」「x64系」等でよく頻出する基本的な命令(オペコード等)の種類を教えてください。 よろしくお願いします。

  • オペランド

    基本情報技術者の問題でわからないところがあったので教えてください。 【問題】 機械語命令のインデックス就職によってオペランドアドレスを指定する場合、表に示す値のときの有効アドレスはいくらか? 【答え】 110 【表】 インデックスレジスタの値 10 命令語のアドレスの値  100 命令が格納されているアドレス 1000 【質問】 オペランドの意味はわかりますが、どうしてこうなるのわかりません。(問題の意味がわかってないかも)

  • 2オペランドの加算命令

    2オペランドの加算命令の設計を絶対アドレス指定・相対アドレス指定・直接アドレス指定・間接アドレス指定を使うと、それぞれどのようになりますか? またそれぞれの長所・短所もお願いいたします。

  • 2オペランドの加算命令についての実行サイクル

    2オペランド加算命令について、その実行サイクルを具体的に教えてくれませんか?

  • TEST命令はどんなことするの?

    アセンブラ言語の命令(オペコード)の一つに「TEST命令」というのがあるのですが、この「TEST命令」というのはどんなことをするのですか? ネットで検索したら「論理積をするもの」と書かれていたのですが命令の一つである「AND命令」とはどう違うのでしょうか? わかりやすく教えてください。 よろしくお願いいたします。

  • java オペランド、フィールド

    Javaにおいて オペランド フィールド メソッドという言葉があると思いますが これらは上から順に他の言語でいう 変数 変数宣言 関数 という事で合っていますか? 合っていても合っていなくても また何故オペランドやフィールドという言葉を使うのでしょうか?他の言語と差別化を図る為ですか?

    • ベストアンサー
    • Java
  • CASL アセンブラ命令 アプリ機能

    例えば、CASLのアセンブラ命令にDCがある。 LABER DC 100 とすると。 これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。 CASLには機械語命令・マクロ命令・アセンブラ命令がある。 機械語命令は人に分かりやすいようにニーモニックが付けられているだけだが、 アセンブラ命令はプログラムが変更されればそのアドレスは移動するという、ハンドアセンブリでは、できない機能が含まれている。 アセンブリ言語は色々ありますが、アセンブラ言語は人に見やすいようにニーモニックが付けられているだけでなく、CASLのDC命令のように、ハンドアセンブリではできないアドレスの自動変更のようなアプリケーションとしての機能(OS的機能)も一般にふくまれているとかんがえてよいのでしょうか? よろしく願います。

  • アセンブラの擬似命令について

    kigin と申します。 アセンブラの擬似命令に「align」というものがありますがこれは一体どういう意味なのでしょうか? また、アセンブラの擬似命令やアセンブラプログラミングに関して詳しいガイダンス的な紹介がなされているホームページ等がありましたら、教えていただきたいのですが。 よろしくお願いいたします。

  • 機械語の事で質問があります。

    最近、パソコンに詳しくなろうと思い勉強している者です。 わかりにくい部分があったので質問させてください。 ある本に機械語がこのように説明されていました。 「機械語とは命令とパラメータで構成されている」 また別の本には機械語がこのように説明されていました。 「機械語は命令部(オペコード)とアドレス部(オペランド)で構成されている。」 パラメータ、アドレス部、オペランドのこれらの意味の違いとは何なんでしょうか?