Я начинаю изучать 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) ничего! На моей раковине ничего не было!
и процесс не возвращаются, на моей системе монитора я видел его, так что это означает, что в для цикла навсегда
мой первый вопрос: почему я ничего не печатать? printf - вызов befor loop!
с 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 }
Результат: чао приходят ва
и процесс не возвращаются, потому что цикл , как я ожидаю
Код Ассамблея:
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, функция, которая была вызвана ставит и не печатаетf!
так что второй вопрос: почему второй код работает, а первый нет? и почему, если я вызываю printf в моей программе c в сборке, один называется puts? и почему только я пишу новую строку «\ n» в строке?
ок, если я undestood хорошо, когда я называю Printf я на самом деле не печатать на моем экране, но I'am писать на буфер в моей памяти, это верный? Является ли ядром моей ОС, чем печать на экране, когда нажимаете: ENTER или моя программа заканчивается? –