[C/C++]無限ループをいくつか書き出します

1629 ワード

1.いくつかのデッドサイクルを書く
while (1) {

}

注:1省略不可
for ( ; ; ) {

}
注:最初の条件は初期条件、2番目の条件はループ終了条件、3番目の式は変更式
サイクル終了条件が省略されている場合は、サイクルボディに書き込む.この時点でループに終了条件がない(この時点でプログラムはループに入っている)ため、プログラムは常に実行されます.の
for(;;)アセンブリにコンパイルすると無条件に移行し、while(1)は0と1を比較するので、この方向からfor(;)while(1)よりも速いのは比較命令が1つ少ないためだが、現在のコンパイラには一定の最適化能力があり、while(1)のように和for(;)に最適化される.同じアセンブリコード.
gdbのdisassemble functionnameコマンド:(for(;;)
(gdb) disassemble main 
Dump of assembler code for function main:
   0x080483ec :	push   %ebp
   0x080483ed :	mov    %esp,%ebp
   0x080483ef :	jmp    0x80483ef 
End of assembler dump.

(while(1))
Dump of assembler code for function main:
   0x080483ec :	push   %ebp
   0x080483ed :	mov    %esp,%ebp
   0x080483ef :	jmp    0x80483ef 
End of assembler dump.

やっぱり同じアセンブリコード!
#########################################################
でも、どうやって出したの?違うよ!
	while (1)
00D5138E  mov         eax,1 
00D51393  test        eax,eax 
00D51395  je          main+29h (0D51399h) 
		;
00D51397  jmp         main+1Eh (0D5138Eh) 

	for ( ; ;)
		;
00D51399  jmp         main+29h (0D51399h)

3つ目の方法はgoto:
loop:
.....
goto loop;
注意:アセンブリコードを取得する方法(http://wenku.baidu.com/link?url=hAqeZYHNdl9AYQqDIFyXby1-RoRJtR3wjKvnis_kTFy4jAeqYuP7bX4BFB5CV7GfKrzyOqEfgjhyfQtu6io1RCtvzg0nmtqmCosfYjQ8nMO###)
1. $gcc -S test.c
gccコンパイルは4ステップ、プリコンパイル、コンパイル、アセンブリ、接続があります
2. $gdb test
$disassemble関数名
該当するコードセグメントのアセンブリコードを表示します.
3.$objdump -d test.oまたはtest