2009-07-30 50 views
12

为什么打印垃圾而不是退出我的程序优雅?我在BSD上以这种方式使用系统调用,并且我想知道如何使它在Linux中工作。从x86_64 Linux中的内联asm系统调用?

int 
main(int argc, char **argv) 
{ 
    __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */ 
    return 0; 
} 

谢谢。

回答

13

为什么我退出这个程序打印垃圾,而不是正常?

CESA-2009-001,“系统调用1退出i386但在x86_64上写入”。

我需要什么,使之在Linux中

使用系统调用序工作,从目前的unistd_64.h

希望这有助于!

3

Syscall 1在i386上退出,但在x86-64上写入我相信。

编辑:这似乎是不准确的: 根据网络,这似乎并没有有关于Linux的x86-64的装配太多的信息,这似乎是系统调用指令之前预期的寄存器设置。

rax system call number 
rbx arg0 
rcx return address from syscall 
rdx arg2 
rsi arg3 
rdi arg4 
r8 arg5 
r9 arg1 (expected by gcc in %rcx) 
r10-r15 should be saved/restored by C code 
rbp dito What is dito?? 
+1

嗯,这个注册信息是否错误? OP建议是否为arg1的rdi? – 2009-07-30 02:45:28

+1

是的。顺序是rdi,rsi,rdx,...就像常规函数中的系统调用号码一样。对于可能复制i386 abi的第一个Linux x86_64版本,情况可能如此,但我不确定。无论如何,在这种情况下,对于arg1等的错误值不可能导致问题,因为退出总是会成功并终止进程。 – jbcreix 2009-07-30 10:25:49