제가 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 ---> 그리고 리턴 값은 (TAN TAN TAN) 아무것도 아닙니다! 내 껍질에 아무것도 appepare하지 않았다!
프로세스가 반환하지 않는, 내 시스템 모니터에 내가 그것을보고, 그래서 그것으로 의미 루프 영원히
내 첫 번째 질문은 : 내가 아무것도 인쇄되지 않는 이유는 무엇입니까? 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와 보았다는 루프을 befor라고합니다!
그래서 어떻게 가능합니까?
두 번째 질문 : "\ n"을 정적 문자열에 추가하면 예상대로 작동합니다!
1 #include <stdio.h>
2
3 int main(){
4 printf("ciao come va\n");
5 for(;;);
6 return 0;
7 }
프로세스 v 여러 와서, 어셈블리 코드는 내가결과는 다음과 같습니다 챠오 루프 의 때문에 반환하지 않습니다
를 예상대로 :
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 행에서 어떻게 볼 수 있었는지, 호출 된 함수 puts가 아니라 printf입니다!
두 번째 질문은 두 번째 코드가 작동하는 이유와 첫 번째 질문이 아닌 이유입니다. 왜 어셈블리에서 내 C 프로그램의 printf를 호출하면 puts라고 부릅 니 까? 왜 내가 문자열에 새로운 줄 "\ n"을 쓰는 것일까?
확인, 그것은이다 옳은? Enter 키를 누르거나 프로그램을 끝낼 때 화면에 인쇄하는 것보다 내 OS의 커널이 맞습니까? –