2013-06-10 20 views
11

x86実行可能ファイル内のnopl命令がオペランドを取得するのはなぜですか?何もしないでください。x86のnopl命令がオペランドを取得するのはなぜですか?

nopl 0x0(%rax)

+2

可能な複製http://stackoverflow.com/questions/12559475/what-does-nopl-do-in-x86-system – Hazzit

+0

引数で「何もしない」ことはできますか? '90 nop'も引数を持っています。本当に' xchg eax、eax'です。 – harold

+1

私は使用している逆コンパイラが分岐命令としてそれを分類しているので、私は尋ねます。それが起こっている理由は何ですか? – RouteMapper

答えて

6

多くのプロセッサのバイナリ命令セットは、機能的に同一の命令を表す複数の方法があります。たとえば、元のARM命令セットには、b << nという形式の任意の値でR0をロードする命令が含まれています。bは0〜255の値で、nは0〜24の偶数です。値が256のロードR0 1<<8をロードする命令をロードするか、4<<616<<4、または64<<2の命令を使用することができます。これらの異なる値をロードする命令は、4つの命令すべてが同じ効果を持っていても、異なるバイナリ・エンコーディングを持っています。

一部のコンパイラ用のアセンブラは、コードで使用する必要があるように見える同一の命令を要求する方法を提供しています。これは通常は重要ではありませんが、コード内で特定のバイト値を使用しないことが望ましい場合や、コード内の特定のバイトを変更して特定の効果を持たせることが必要な場合があります。例えば、前述のARM命令内の8ビットは、bの値を指定するために使用される。コードが上記の命令の1つのb部分を値12で上書きする場合、R0にロードされる値は元の4つの命令のどれが使用されたかに依存します。 0x0C00、0x0300、0x00C0、または0x0030になります。

8x86のアセンブラは、一般に、すべての可能な命令コーディングを明示的に区別することはできませんが、命令内にどのバイト値を含めるべきかを指定できるコンテキストがあります。例えば、例外を処理する1つのアプローチは、例外が発生したときにルーチン・チェックを行い、戻りアドレスの命令が何らかの特定の形式のNOPであるかどうかをチェックし、そうであればそのオペランドをデータ構造のアドレス例外関連情報を保持する。実際には、例外をサポートするほとんどの8x86言語では、他の処理方法が使用されますが、前述の方法では長いNOPをフェッチして実行するのに要する時間だけ通常の関数の復帰が遅くなりますが、言語は、例外ではないケースでNOPを実行するコストを回避するために割り込みを処理するために、より遅いアプローチを使用しますが、他の言語では処理が異なる可能性があります)。

+1

trueの場合、コメントの重複リンクに[nrz's answer](http://stackoverflow.com/a/12564044/)で示されているように、オペランドが命令の長さを変更するという点でより便利です。 。 – ughoavgfhw

+0

@ughoavgfhw:適切な長さの任意のNOPを必要とするだけの場合、単純に 'nop'、' nop2'、 'nop3'などを定義するか、または「最速のnバイトのnopシーケンスを生成する」ためのニーモニック引数は必要なサイズでした。例えば、 7バイトのNOPでは、これらのバイトのうちの4バイトに値を指定する必要はありません。 – supercat

2

時には、デバッグ時にnopsを使用します。私が何かが間違っているのを知っていても、何千ものブレークポイントのブレークが見つかると、それをテストするコードを書いています。私は、デバッガがDRXリニア(物理)アドレスで登録を設定します「ASM」の行にブレークポイントを設定

if (condition_occurred) 
{ 
    asm("nop"); 
} 

(に相当する:それは、この(Cスタイルのコード)のようなものに見えるかもしれません仮想アドレス)。この位置に達するとブレークポイント割り込みが発生し、デバッガに入ります。デバッガなしで実行している場合、nopは処理されます(何も起こりません)。だから、ここで私は全く何もしない指示をしたい、それは意味がある(そうではない)。ここで


は「何もしない」nop命令が実際に何かをどこ...ものの、間接的の一例です。

this paperの8ページを参照し、例3のループの最初の(上の)命令に注目してください(これは例2の開発です)。また、ページの右下にある脚注。

追加のnopsがプロセスをさらにスピードアップする可能性があることを著者は示唆しています。

だから、nopsは間違いなくその用途を持っています。

関連する問題