я стараюсь использовать printf
из моего ассемблере, это минимальный пример, который должен просто напечатать hello
на стандартный вывод:Использования Printf в сборке приводит к пустому выводу
.section .rodata
hello:
.ascii "hello\n\0"
.section .text
.globl _start
_start:
movq $hello, %rdi #first parameter
xorl %eax, %eax #0 - number of used vector registers
call printf
#exit
movq $60, %rax
movq $0, %rdi
syscall
Я построить его с
gcc -nostdlib try_printf.s -o try_printf -lc
и когда я запускаю его, кажется, работает: строка hello
печатается и статус выхода 0
:
XXX$ ./try_printf
hello
XXX$ echo $?
0
XXX$
Но когда я пытаюсь захватить текст, то очевидно, что что-то не работает должным образом:
XXX$ output=$(./try_printf)
XXX$ echo $output
XXX$
Переменная output
должна иметь значение hello
, но пуста.
Что не так с моим использованием printf
?
Использование syscall для выхода не очищает выходные буферы, используемые средой _C_. Замените системный вызов exit на «exit call» (выход также является частью библиотеки _C_) –
Если вы просмотрите [страницу руководства] (http://man7.org/linux/man-pages/man3/exit.3 .html) для 'exit' (exit (3)) вы найдете это в описании _ Все открытые stdio (3) потоки размыты и закрыты. Файлы, созданные tmpfile (3), удаляются. Это не гарантируется при использовании 'movq $ 60,% rax movq $ 0,% rdi syscall' –