我想要定义一些调用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
我完全感到困惑,不知道,如果有人可以解释为什么发生这种情况?
谢谢!是否将值60(EXIT)放入rdi中,而不是rax,类似于调用printf? –
不,将系统调用号码放在'rax'中,并将第一个参数放在'rdi'中是正确的。请参阅http://www.x86-64.org/documentation/abi.pdf(特别是附录A),了解内核系统调用ABI的一些文档以及与用户级调用约定的差异。 –
对不起,我一直在喋喋不休,但我改变了“int LINUX”这一行来调用系统调用,并将extern系统调用添加到顶端,仍然得到了两个十。有没有可能向我展示一个如何调用系统调用的小例子?非常感谢:) –