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によると、「Syscall 1 は i386 で終了しますが、x86_64 で書き込みます」。

Linuxで動作させるには何が必要ですか

現在のunistd_64.hの syscall 序数を使用します。

お役に立てれば!

于 2009-07-30T02:13:30.133 に答える
3

Syscall 1 は i386 で終了しますが、x86-64 で書き込みます。

編集: これは不正確なようです: Web によると、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 に答える