Я пытаюсь определить некоторые подпрограммы, в которых есть вызовы 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
Здесь test просто имеет вызов printf, который выводит на экран число 10. Я не ожидал, что он будет вызван, поскольку у меня нет к нему обращения.
Однако при компиляции и запуске:
nasm -f elf64 test.asm
gcc -m64 -o test test.o
я получаю вывод:
10
10
Я совершенно озадачен и хотел бы узнать, может ли кто-нибудь объяснить, почему это происходит?