x86マシンでNOPLの機能は何ですか?それは何もしないように感じますが、なぜそれがアセンブリコード内にあるのですか?NOPLはx86システムで何をしますか?
答えて
NOP
は、1バイトの「何もしない」操作であり、文字通り「操作なし」です。 NOPW、NOPLなどは同等の注意点ですが、単語とロングサイズのバイトを取ります。
NOP // 1byte opcode
NOP // 1byte opcode
は、彼らはパディング物事アウトのために非常に便利です
NOPW // 2byte opcode.
を行うことと等価であるので、コードシーケンスは、命令スペースの数バイトを取ることで、特定のメモリ境界から始まり、まだありません実際に何かをしている。
CPUのNOPの唯一の効果はNOPX同等物は、2、4、などによってそうします。1.でIP
/EIP
をインクリメントすることです...
編集:gas
ドキュメントへの追加しまし参照とgas
エンコーディング異なるnop
形態について:John Fremlin's blog: Operands to NOP on AMD64、nopw
、nopl
などによると
ない& T構文AT gas
構文、です。
以下は、命令長が3〜15バイトの場合のの場合のgas
によって生成された命令エンコードです。gas
sourceです。いくつかはインテルが推奨するnop
フォーム(以下を参照)と同じであるが、すべてではないことに注意してください。インテルのは、任意の単一推奨nop
の命令で複数の0x66
オペランドの接頭辞を使用することはありませんnop
フォームを推奨一方長いで、特定のnop
のではgas
は、(5まで)、複数の異なるnop
形で連続し0x66
オペランドの接頭辞を使用しています。 (読みやすいように再フォーマット)gas
sourceから
nop
エンコーディング:
/* nopl (%[re]ax) */
static const char alt_3[] = {0x0f,0x1f,0x00};
/* nopl 0(%[re]ax) */
static const char alt_4[] = {0x0f,0x1f,0x40,0x00};
/* nopl 0(%[re]ax,%[re]ax,1) */
static const char alt_5[] = {0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_6[] = {0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopl 0L(%[re]ax) */
static const char alt_7[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax,%[re]ax,1) */
static const char alt_8[] = {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopw 0L(%[re]ax,%[re]ax,1) */
static const char alt_9[] = {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_10[] = {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_11[] = {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_12[] = {0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_13[] = {0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_14[] = {0x66,0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_15[] = {0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopl 0(%[re]ax,%[re]ax,1)
nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_short_11[] = {0x0f,0x1f,0x44,0x00,0x00,0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1)
nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_short_12[] = {0x66,0x0f,0x1f,0x44,0x00,0x00,0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1)
nopl 0L(%[re]ax) */
static const char alt_short_13[] = {0x66,0x0f,0x1f,0x44,0x00,0x00,0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax)
nopl 0L(%[re]ax) */
static const char alt_short_14[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax)
nopl 0L(%[re]ax,%[re]ax,1) */
static const char alt_short_15[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
Intelは異なる構文を使用して、1〜9バイトからすべての命令長のために利用可能なnop
」Sが存在します。 nop
にはいくつかの異なるものがあります。すべてnop
の2バイトより長いものは1オペランドを受け入れます。 1バイトnop
(0x90
)は、xchg (e)ax,(e)ax
と同義です。
Table 4-12. Recommended Multi-Byte Sequence of NOP Instruction
Length Assembly Byte Sequence
2 bytes 66 NOP 66 90H
3 bytes NOP DWORD ptr [EAX] 0F 1F 00H
4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H
5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H
6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H
7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H
8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H
9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H
だからこれらnop
に加えて、Sあまりにも「はインテルが推奨するのは、多くの他のnop
がある」は:
Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z, CHAPTER 4: INSTRUCTION SET REFERENCE, M-Zリストは異なる命令長のためのnop
のフォームをお勧めします。マークBが答えで述べるように、命令を特定のメモリ境界に合わせることに加えて、nop
は、自己修正コード、デバッグ、リバースエンジニアリングにも非常に役立ちます。
amd64では、 'nop'はもはや' xchg eax、eax'と同義ではないことに注意してください。 'nop'は' eax'の上位32ビットをゼロにしませんが、 'xchg eax、eax'は行いません。 – fuz
実際には、コードをパッチする必要がある場合、アセンブリコードにNOPが使用されます。
新しい命令のサイズが古い命令のサイズと異なる可能性があるため、パディングが必要です。
パディング命令は、いくつかのバイトを占める可能性がありますが、NOPと同じように動作する必要があります。
いくつかのNOPの代わりに66 90のようなより複雑な命令を挿入する理由は、1つの命令が一般的にいくつかのNOPよりも速く実行されるからです。
- 1. x86のnopl命令がオペランドを取得するのはなぜですか?
- 2. $ {env:ProgramFiles(x86)} Powershell変数には32ビット/ x86システムに含まれるものは何ですか?
- 3. x86アセンブラ - システム時刻からのファイル名
- 4. x86系の "imulq $ 44、(%rbx)、%rax"は何をしますか?
- 5. Big Endianシステムでhtons()は何をしますか?
- 6. x86アセンブリ言語のCLDとSTDは何ですか? DFは何をしていますか?
- 7. tortoisehg 2.1.3コンテキストメニューのクリックはwin7 x86では何もしません
- 8. 統合型システムとは何ですか?
- 9. Yesodのシステム要件は何ですか?
- 10. ADTのシステム要件は何ですか?
- 11. 私のJSオーディオストリーミングコードがx86システムとx86_64システムで異なるのはなぜですか?
- 12. x86システムでC#.NET x64バイナリをコンパイルする
- 13. 良いx86アセンブリ言語リソースには何がありますか?
- 14. Xcode 9 x86システムに未定義のシンボルがあります。
- 15. 何がProcessorArchitectureをx86またはMSILにロックするのですか?
- 16. .NetにCovert Paradox(objectpal)システムに最も適したシステムは何ですか?
- 17. android sdk managerのIntel x86アトムシステムイメージは何ですか?
- 18. K3D x86 ISA拡張機能とは何ですか?
- 19. x86 RISCまたはCISCですか?
- 20. OBIEEは無料ですか?システム要件は何ですか?
- 21. centos yumは何かインストールやシステムのアップデートに失敗します
- 22. QEMUは、x86〜x86エミュレーションのゲストレジスタと同じホストレジスタを使用しますか?
- 23. x64システムでStackOverflowExceptionがスローされました。 x86で正しく動作します
- 24. システム構成のMagento - モジュール、保存時に何かしますか?
- 25. Linuxプラットフォームでx86アセンブリを学ぶ最も良い方法は何ですか?
- 26. 代替システムを使用するLinuxシステムでJAVA_HOMEの正しいパスは何ですか?
- 27. x86とx64オプションは、Windows phone 7アプリに何か意味がありますか?
- 28. Visual Studio 2017 x64とx86をインストールする際の違いは何ですか?
- 29. Ruby on Rails3で使用するcaptchaシステムは何ですか?
- 30. x86のAndroid AVDはAMDのLinuxで動作しますか?
「なぜアセンブリコードにはいつも入っていますか? - 通常、アセンブリコードには多くのNOPがありません。あなたが見ている特定のコードには多くのNOPがありますか? – ugoren
男、コードがしていることを「感じる」ことができたらよかった! –
http://stackoverflow.com/questions/6776385/what-is-faster-jmp-or-string-of-nops/6777644 –