Tôi đang cố xác định một số chương trình con có các cuộc gọi đến printf trong chúng. Một ví dụ rất tầm thường như sau:các chương trình con hội họp được gọi hai lần mà không bị gọi từ chính
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
đây kiểm tra chỉ có một cuộc gọi đến printf rằng kết quả đầu ra số lượng từ 10 đến màn hình. Tôi sẽ không mong đợi điều này để được gọi là tôi không có cuộc gọi đến nó.
Tuy nhiên khi biên dịch và chạy:
nasm -f elf64 test.asm
gcc -m64 -o test test.o
tôi nhận được kết quả:
10
10
Tôi hoàn toàn bối rối và tự hỏi nếu ai đó có thể giải thích tại sao điều này xảy ra?
Cảm ơn! Tôi có đặt giá trị 60 (EXIT) vào rdi sau đó thay vì rax, tương tự như gọi printf? –
Không, đặt số syscall trong 'rax' và đối số đầu tiên trong' rdi' là chính xác. Xem http://www.x86-64.org/documentation/abi.pdf (phụ lục A đặc biệt) cho một số tài liệu về syscall ABI hạt nhân và sự khác biệt từ các quy ước gọi điện cấp người dùng. –
Xin lỗi để giữ cho bạn xấu về điều này nhưng tôi đã thay đổi dòng "int LINUX" để gọi syscall và thêm syscall extern vào đầu và vẫn nhận được hai của mười. Có cơ hội nào bạn có thể chỉ cho tôi một ví dụ nhỏ về cách gọi syscall không? Cảm ơn rất nhiều :) –