刚才对楼主的编译做了一个测试,请楼主对自己编译后的代码是怎么获取到的解释一下。
刚一看,感觉楼主很犀利,实际验证了一下,请楼主对我的现象解释一下!
编译的过程是:预处理,编译,汇编,链接。
在编译这个步骤的时候把程序编译为汇编代码,对while和for的汇编代码进行对比:
源程序while.c - #include
- #include
- int main(void)
- {
- while(1)
- {
- printf("hello eeworld !\n");
- sleep(1);
- }
- return 0;
- }
复制代码源程序for.c - #include
- #include
- int main(void)
- {
- for(;;)
- {
- printf("hello eeworld !\n");
- sleep(1);
- }
- return 0;
- }
复制代码分别对上面的两个程序进行编译gcc -S while.c; gcc -S for.c
分别在当期目录下面生成 while.s和for.s
汇编代码如下:
while.s - .file "while.c"
- .section .rodata
- .LC0:
- .string "hello eeworld !"
- .text
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- andl $-16, %esp
- subl $16, %esp
- .L2:
- movl $.LC0, (%esp)
- call puts
- movl $1, (%esp)
- call sleep
- jmp .L2
- .size main, .-main
- .ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
- .section .note.GNU-stack,"",@progbits
复制代码for.s - .file "for.c"
- .section .rodata
- .LC0:
- .string "hello eeworld !"
- .text
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- andl $-16, %esp
- subl $16, %esp
- .L2:
- movl $.LC0, (%esp)
- call puts
- movl $1, (%esp)
- call sleep
- jmp .L2
- .size main, .-main
- .ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
- .section .note.GNU-stack,"",@progbits
复制代码对比两个汇编代码,除了第一行的文件名不同,其他都是一样的,请楼主对这个现象解释一下??? |