2009-07-30 28 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