2009-07-30 12 views
12

私はプログラムを正常に終了するのではなく、なぜガーベジを印刷しますか?私はBSDでこのようにシステムコールを使用しています。そして、Linuxでこれを動作させるためには何が必要なのでしょうか?x86_64 LinuxのインラインasmのSyscall?

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

ありがとうございます。

答えて

13

なぜこの印刷ゴミの代わりには正常私のプログラムを終了しますか?

CESA-2009-001の場合、「Syscall 1はi386では終了しますが、x86_64では書き込み」です。私はそれが現在のunistd_64.h

・ホープ、このことができますから、システムコールの序数を使用してLinuxの

を動作させるために必要があるだろうか

+0

ありがとうございます!これだよ。なぜ彼らはそれを変更しなければならなかったのかわかりません。したがって、BSDは従来の数値を使用していますが、Linux 64はそれらを変更しました。これは私がコードを再利用することができないことを意味します:( – jbcreix

+1

@jbcreix、好奇心から*なぜあなたはポータブルコールを 'exit()'と 'write()'の代わりに使用しますか? ? – RBerteig

+0

ポータブルコールはglibcや他のCライブラリにリンクする必要があります。私は、必要な機能とOSから独立した機能しか実装できません。もちろん、静的リンクでも同様の結果が得られますが、 – jbcreix

3

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

編集:これは間違っているようです: これはsyscall命令の前に予想されるレジスタ設定であるようですが、x86-64 Linuxアセンブリに関する情報があまりにも多くないようです。

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ですか? –

+1

はい。順序はrdi、rsi、rdx、...です。通常の関数のように、システムコール番号はraxになります。これはおそらくi386 abiをコピーしたLinux x86_64の最初のバージョンに当てはまるかもしれませんが、わかりません。とにかくこの場合exit1は常に成功してプロセスを終了するので、arg1などの値が悪いと問題を引き起こしていない可能性があります。 – jbcreix

+0

はい、私は、主な問題はNR_exitの代わりにNR_writeを使用していたことによると確信していましたが、引数がオフになっている可能性もあると考えました! –

関連する問題