12

为什么这个打印垃圾而不是优雅地退出我的程序?我在 BSD 上以这种方式使用系统调用,我想知道我需要什么才能让它在 Linux 中工作。

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

谢谢。

4

2 回答 2

13

为什么这个打印垃圾而不是优雅地退出我的程序?

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

我需要什么让它在 Linux 中工作

使用当前unistd_64.h中的系统调用序号

希望这可以帮助!

于 2009-07-30T02:13:30.133 回答
3

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

编辑:这似乎不准确:根据网络,这似乎没有太多关于 x86-64 Linux 程序集的信息,这似乎是 syscall 指令之前的预期寄存器设置。

 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??
于 2009-07-30T02:10:22.803 回答