我开始学习c编程语言,当我做一个练习时,我看到一个非常奇怪的错误,确保这是真正的错误,而不是程序中的其他内容,我写的另一个项目printf在循环前似乎工作不同
代码:
1 #include <stdio.h>
2
3 int main(){
4 printf("ciao come va");
5 for(;;);
6 return 0;
7 }
的gcc -o测试的main.c ; ./test --->和回报是(谭坦谭) 没事!在我的外壳上没有出现任何东西!
和过程不返回,我的系统监视器上,我看到它,所以这意味着它是进入了死循环
我的第一个问题是:为什么我不显示任何信息? printf正在调用befor循环!
用gcc -S我编译并没有Assamble,也是汇编代码接缝是正确的
1 .file "main.c"
2 .section .rodata
3 .LC0:
4 .string "ciao come va"
5 .text
6 .globl main
7 .type main, @function
8 main:
9 .LFB0:
10 .cfi_startproc
11 pushq %rbp
12 .cfi_def_cfa_offset 16
13 .cfi_offset 6, -16
14 movq %rsp, %rbp
15 .cfi_def_cfa_register 6
16 movl $.LC0, %edi
17 movl $0, %eax
18 call printf
19 .L2:
20 jmp .L2
21 .cfi_endproc
22 .LFE0:
23 .size main, .-main
24 .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
25 .section .note.GNU-stack,"",@progbits
我不很清楚组装,但我看到的printf被称为以前生产循环!
那么它怎么可能?
第二个问题:如果我为静态字符串添加“\ n”,它就像我期望的那样工作!
1 #include <stdio.h>
2
3 int main(){
4 printf("ciao come va\n");
5 for(;;);
6 return 0;
7 }
结果是:侨前来VA
和过程中不要因为返回循环 ,如我所料
汇编代码是:
1 .file "main_con_new_line.c"
2 .section .rodata
3 .LC0:
4 .string "ciao come va"
5 .text
6 .globl main
7 .type main, @function
8 main:
9 .LFB0:
10 .cfi_startproc
11 pushq %rbp
12 .cfi_def_cfa_offset 16
13 .cfi_offset 6, -16
14 movq %rsp, %rbp
15 .cfi_def_cfa_register 6
16 movl $.LC0, %edi
17 call puts
18 .L2:
19 jmp .L2
20 .cfi_endproc
21 .LFE0:
22 .size main, .-main
23 .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
24 .section .note.GNU-stack,"",@progbits
所以,你如何看到17行,被调用的函数是put而不是printf!
所以第二个问题是:为什么第二个代码的作品和第一个不是? 为什么如果我在程序中调用printf在程序集中被称为puts?为什么只有我在字符串中写入新行“\ n”字符?
好的,如果我undestood很好,当我调用printf我真的不打印我的屏幕上,但我'在我的记忆中的缓冲区写入,它是正确?当按下时,我的操作系统的内核是否在屏幕上打印:ENTER或我的程序结束? –