1. 写出几个死循环
while (1) {
}
注:1不可省略
for ( ; ; ) {
}
注:第一个条件为初始条件,第二个条件是循环结束条件,第三个表达式是变更表达式
循环结束条件若是省略的话,应写入循环体中。此时循环体中没有结束条件(此时程序已进入循环),故程序将一直执行。。。
for(;;)编译成汇编后是无条件转移,while(1)是要0和1进行一下比较的,所以从这个方向上看for(;;)是要比while(1)快的因为少了一个比较指令,但现在的编译器都是有一定的优化能力的,像while(1)这种会优化成和for(;;)一样的汇编代码。
gdb的disassemble functionname命令:(for (;;))
(gdb) disassemble main
Dump of assembler code for function main:
0x080483ec <+0>: push %ebp
0x080483ed <+1>: mov %esp,%ebp
0x080483ef <+3>: jmp 0x80483ef <main+3>
End of assembler dump.
(while(1))
Dump of assembler code for function main:
0x080483ec <+0>: push %ebp
0x080483ed <+1>: mov %esp,%ebp
0x080483ef <+3>: jmp 0x80483ef <main+3>
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)
第三种方法用goto:
loop:
.....
goto loop;
注:三种获取汇编代码的方法(http://wenku.baidu.com/link?url=hAqeZYHNdl9AYQqDIFyXby1-RoRJtR3wjKvnis_kTFy4jAeqYuP7bX4BFB5CV7GfKrzyOqEfgjhyfQtu6io1RCtvzg0nmtqmCosfYjQ8nMO###)
1. $gcc -S test.c
gcc编译有四步走,预编译,编译,汇编,连接
2. $gdb test
$disassemble 函数名
查看相应代码段的汇编代码!
3.$objdump -d test.o或test