Принтф с газовой сборкой

Я не знаю, почему я не могу ничего напечатать с printf в сборке GAS, если \n (LF - новая строка) отсутствует в конце строки. Если я помещаю символ новой строки \n, строка печатается, но если я удаляю \n, строка не печатается. Может кто-нибудь сказать мне, почему?

.extern printf
.section .data

hello:
    .string "Hello!" # doesn't print this way when \n is missing

.section .text

.globl _start

_start:
    nop
    movl $hello, %edi
    movl $0, %eax
    call printf

_end:    
    movq $60, %rax  #use the _exit syscall
    movq $0, %rdi   #return error code 0
    syscall         #make syscall

person morophla    schedule 25.05.2016    source источник
comment
Если вы хотите использовать библиотеку C (частью которой является printf), используйте main как точку входа и не используйте системный вызов exit. Вы не позволяете библиотеке C завершиться должным образом, поэтому буферизованная строка не печатается. PS: в следующий раз, если вы увидите, что ваш вопрос возникнет с неправильным форматированием, исправьте его самостоятельно. При необходимости используйте предварительный просмотр.   -  person Jester    schedule 25.05.2016
comment
Попробуйте .asciz вместо .string в определении строки для вывода.   -  person zx485    schedule 25.05.2016
comment
Извините, Джестер, за то, что не соответствует вашим высоким стандартам.   -  person morophla    schedule 25.05.2016
comment
Использование правильного форматирования - довольно низкий стандарт. Вы же видели, что получился ужасный беспорядок, верно? И бедный zx485 должен был исправить это за вас. Вы просите о помощи, это простая вежливость - размещать сообщения должным образом.   -  person Jester    schedule 26.05.2016
comment
Шут прав, вам следует рассмотреть возможность использования main в качестве точки входа и ссылки на среду выполнения C. Затем вы можете использовать ret для возврата в среду выполнения C, которая вызвала main (а ​​не exit syscall), которая должным образом очистит выходные буферы и выйдет из программы. Если вы непреклонны в использовании _start в качестве точки входа, то вместо использования системного вызова exit вам следует вызвать функцию exit (через call exit). Введите код возврата в %edi.   -  person Michael Petch    schedule 26.05.2016
comment
Это не высокие стандарты Jester, а стандарты сборки интерфейсов и C.   -  person David Hoelzer    schedule 26.05.2016


Ответы (1)


person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Badacadabra; 01.06.2017