Это код, который я сейчас играю:
# file-name: test.s
# 64-bit GNU as source code.
.global main
.section .text
main:
lea message, %rdi
push %rdi
call puts
lea message, %rdi
push %rdi
call printf
push $0
call _exit
.section .data
message: .asciz "Hello, World!"
Инструкции по компиляции: gcc test.s -o test
Версия 1:
.global main
.section .text
main:
lea message, %rdi
call puts
lea message, %rdi
call printf
mov $0, %rdi
call _exit
.section .data
message: .asciz "Hello, World!"
Окончательный вариант (Works):
.global main
.section .text
main:
lea message, %rdi
call puts
mov $0, %rax
lea message, %rdi
call printf
# flush stdout buffer.
mov $0, %rdi
call fflush
# put newline to offset PS1 prompt when the program ends.
# - ironically, doing this makes the flush above redundant and can be removed.
# - The call to fflush is retained for display and
# to keep the block self contained.
mov $'\n', %rdi
call putchar
mov $0, %rdi
call _exit
.section .data
message: .asciz "Hello, World!"
Я изо всех сил пытаюсь понять, почему вызов ставится успешно, но вызов printf приводит к ошибке сегментации.
Может кто-нибудь объяснить это поведение и как printf предназначен для вызова?
Спасибо заранее.
Резюме
- printf получает строку печати из% rdi и число дополнительных аргументов в% rax lower DWORD.
- Результаты printf не могут быть просмотрены до тех пор, пока в stdout не будет введена новая строка, или вызывается fflush (0).