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
http://john.freml.in/amd64-noplで、「nopw」に関するいくつかの議論があります。4004d2-4004e0の意味を誰かが説明できますか?オペコードリストを見ると、66 ..
コードはマルチバイト拡張であるように見えます。数時間オペコードリストを調べようとしない限り、ここではおそらく私よりも良い答えを得ることができると思います。
そのasm出力は、Cの次の(非常識な)コードからのものであり、単純な無限ループに最適化されます。
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
でコンパイルするとgcc -O2
、コンパイラは無限再帰を認識し、それを無限ループに変換します。main()
実際、これは非常にうまく機能するため、関数を呼び出さずに実際にループしrecurse()
ます。
編集者注:NOPを使用したパディング関数は、無限ループに固有のものではありません。これは、Godboltコンパイラエクスプローラーにある、さまざまな長さのNOPを持つ関数のセットです。