答えて
多くのプロセッサのバイナリ命令セットは、機能的に同一の命令を表す複数の方法があります。たとえば、元のARM命令セットには、b << n
という形式の任意の値でR0をロードする命令が含まれています。b
は0〜255の値で、n
は0〜24の偶数です。値が256のロードR0 1<<8
をロードする命令をロードするか、4<<6
、16<<4
、または64<<2
の命令を使用することができます。これらの異なる値をロードする命令は、4つの命令すべてが同じ効果を持っていても、異なるバイナリ・エンコーディングを持っています。
一部のコンパイラ用のアセンブラは、コードで使用する必要があるように見える同一の命令を要求する方法を提供しています。これは通常は重要ではありませんが、コード内で特定のバイト値を使用しないことが望ましい場合や、コード内の特定のバイトを変更して特定の効果を持たせることが必要な場合があります。例えば、前述のARM命令内の8ビットは、b
の値を指定するために使用される。コードが上記の命令の1つのb
部分を値12で上書きする場合、R0にロードされる値は元の4つの命令のどれが使用されたかに依存します。 0x0C00、0x0300、0x00C0、または0x0030になります。
8x86のアセンブラは、一般に、すべての可能な命令コーディングを明示的に区別することはできませんが、命令内にどのバイト値を含めるべきかを指定できるコンテキストがあります。例えば、例外を処理する1つのアプローチは、例外が発生したときにルーチン・チェックを行い、戻りアドレスの命令が何らかの特定の形式のNOPであるかどうかをチェックし、そうであればそのオペランドをデータ構造のアドレス例外関連情報を保持する。実際には、例外をサポートするほとんどの8x86言語では、他の処理方法が使用されますが、前述の方法では長いNOPをフェッチして実行するのに要する時間だけ通常の関数の復帰が遅くなりますが、言語は、例外ではないケースでNOPを実行するコストを回避するために割り込みを処理するために、より遅いアプローチを使用しますが、他の言語では処理が異なる可能性があります)。
trueの場合、コメントの重複リンクに[nrz's answer](http://stackoverflow.com/a/12564044/)で示されているように、オペランドが命令の長さを変更するという点でより便利です。 。 – ughoavgfhw
@ughoavgfhw:適切な長さの任意のNOPを必要とするだけの場合、単純に 'nop'、' nop2'、 'nop3'などを定義するか、または「最速のnバイトのnopシーケンスを生成する」ためのニーモニック引数は必要なサイズでした。例えば、 7バイトのNOPでは、これらのバイトのうちの4バイトに値を指定する必要はありません。 – supercat
時には、デバッグ時にnopsを使用します。私が何かが間違っているのを知っていても、何千ものブレークポイントのブレークが見つかると、それをテストするコードを書いています。私は、デバッガがDRXリニア(物理)アドレスで登録を設定します「ASM」の行にブレークポイントを設定
if (condition_occurred)
{
asm("nop");
}
(に相当する:それは、この(Cスタイルのコード)のようなものに見えるかもしれません仮想アドレス)。この位置に達するとブレークポイント割り込みが発生し、デバッガに入ります。デバッガなしで実行している場合、nopは処理されます(何も起こりません)。だから、ここで私は全く何もしない指示をしたい、それは意味がある(そうではない)。ここで
は「何もしない」nop命令が実際に何かをどこ...ものの、間接的の一例です。
this paperの8ページを参照し、例3のループの最初の(上の)命令に注目してください(これは例2の開発です)。また、ページの右下にある脚注。
追加のnopsがプロセスをさらにスピードアップする可能性があることを著者は示唆しています。
だから、nopsは間違いなくその用途を持っています。
- 1. x86 assembly-masm32:無効な命令のオペランド
- 2. LLVM命令のオペランドの取得
- 3. x86アセンブリの乗算命令と除算命令のオペランド、16ビット以上
- 4. x86アセンブリ極端な初心者質問: "無効な命令オペランド"?
- 5. オペランドのx86-64上のCALL命令の世代AMD
- 6. 組立MOV命令のオペランド
- 7. x86の現在の命令のアドレスを取得
- 8. X86 'cmpps'命令とLLVM IR 'fcmp'命令は入れ替え可能ですか?
- 9. x86デコード命令opcodeバイト
- 10. MOVDQAとMOVAPS x86命令の違いは?
- 11. x86文書でinsl命令が見つからないのはなぜですか
- 12. JavaにIINCバイトコード命令があるのはなぜですか?
- 13. *命令オペランドの前に、GNUアセンブリ、AMD64
- 14. 理解のx86 R/m32の命令
- 15. NOPLはx86システムで何をしますか?
- 16. x86命令の機能別リファレンス
- 17. Direction/Sign x86命令セットのビット拡張
- 18. X86アセンブリ - IDIV命令の処理
- 19. x86 ROR命令はどのように機能しますか?
- 20. x86同じターゲットで2つのジャンプ命令をアセンブルする
- 21. x86アセンブリでidiv命令がオーバーフローする最小値
- 22. `std :: memory_order_acquire`のセマンティクスにはx86/x86_64のプロセッサ命令が必要ですか?
- 23. C/C++で命令のアドレスを取得
- 24. x86 CMP命令が単一ワード比較で機能しない
- 25. コンパイラがプッシュ/ポップ命令のペアを生成するのはなぜですか?
- 26. メモリにアクセスしないメモリオペランドを持つx86の唯一の命令ですか?
- 27. 現在の命令をasmjitで取得するには?
- 28. Intel x86命令のエンコーディングを見るためのツールがありますか?
- 29. MOVXZをレジスタに - "無効な命令のオペランド"
- 30. C++コードのx86命令サイズを取得しますか? Visual Studioの分解図で
可能な複製http://stackoverflow.com/questions/12559475/what-does-nopl-do-in-x86-system – Hazzit
引数で「何もしない」ことはできますか? '90 nop'も引数を持っています。本当に' xchg eax、eax'です。 – harold
私は使用している逆コンパイラが分岐命令としてそれを分類しているので、私は尋ねます。それが起こっている理由は何ですか? – RouteMapper