は、私がnopw
命令のマシンコードのエンコードがどのように機能するかを理解しようとしています:http://john.freml.in/amd64-noplで「nopw」に関するいくつかの議論がありAMD64 - nopwアセンブリ命令?このコンパイラの出力で
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
。誰でも4004d2-4004e0の意味を説明できますか?オペコードのリストを見ると、66 ..
のコードはマルチバイト展開であるようです。私はおそらく、私が数時間にわたってオペコードのリストを掘り下げようとしない限り、ここより良い答えを得ることができると感じています。
は、ASM出力は、単純な無限ループにまで最適化Cに下記(非常識)コードからのものであること:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
gcc -O2
でコンパイルされ、コンパイラは無限の再帰とターンを認識するそれは無限ループに入ります。それは実際にrecurse()
機能を呼び出すことなくmain()
でループするということは、実際には、とてもよくこれを行います。
編集者メモ:NOPを使ったパディング関数は、無限ループに特有のものではありません。ここでのNOPの長さの範囲と機能のセットは、私は、これは単なる分岐遅延命令で推測、on the Godbolt compiler explorer.
ランダムなジャンクパディングを見ていますか? –
おそらく!私は本当に知りません!それはすべての美しさです! WHEEE。しかし、実際には、リンクから、プロセッサが速度最適化のための1つの命令としてブロックをロードするはずですが、 'jmp'のおかげでそれは実現しません。私はちょうどそれの意味を得る。私は0x90が何であるかを知っていますが、 '66 .. ..'で何が起こっているのか、なぜ72ビット長であるのか分かりません。 –
これは理由ではありませんが、あなたは[私、奇妙なNOPsがあります! - The Old New Thing](http://blogs.msdn.com/b/oldnewthing/archive/2011/01/12/10114521.aspx)を読んでください。 – ephemient