Я пытаюсь определить некоторые подпрограммы, в которых есть вызовы printf.
Очень тривиальный пример:
extern printf
LINUX equ 80H
EXIT equ 60
section .data
intfmt: db "%ld", 10, 0
segment .text
global main
main:
call os_return ; return to operating system
os_return:
mov rax, EXIT ; Linux system call 60 i.e. exit ()
mov rdi, 0 ; Error code 0 i.e. no errors
int LINUX ; Interrupt Linux kernel
test:
push rdi
push rsi
mov rsi, 10
mov rdi, intfmt
xor rax, rax
call printf
pop rdi
pop rsi
ret
Здесь у теста просто есть вызов printf, который выводит число 10 на экран. Я не ожидал бы, что это вызовут, поскольку у меня нет вызова к нему.
Однако при компиляции и запуске:
nasm -f elf64 test.asm
gcc -m64 -o test test.o
Я получаю вывод:
10
10
Я совершенно сбит с толку и спрашиваю себя, может ли кто-нибудь объяснить, почему это происходит?