为什么打印垃圾而不是退出我的程序优雅?我在BSD上以这种方式使用系统调用,并且我想知道如何使它在Linux中工作。从x86_64 Linux中的内联asm系统调用?
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
谢谢。
为什么打印垃圾而不是退出我的程序优雅?我在BSD上以这种方式使用系统调用,并且我想知道如何使它在Linux中工作。从x86_64 Linux中的内联asm系统调用?
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
谢谢。
为什么我退出这个程序打印垃圾,而不是正常?
每CESA-2009-001,“系统调用1退出i386但在x86_64上写入”。
我需要什么,使之在Linux中
使用系统调用序工作,从目前的unistd_64.h
希望这有助于!
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??
嗯,这个注册信息是否错误? OP建议是否为arg1的rdi? – 2009-07-30 02:45:28
是的。顺序是rdi,rsi,rdx,...就像常规函数中的系统调用号码一样。对于可能复制i386 abi的第一个Linux x86_64版本,情况可能如此,但我不确定。无论如何,在这种情况下,对于arg1等的错误值不可能导致问题,因为退出总是会成功并终止进程。 – jbcreix 2009-07-30 10:25:49