爲什麼打印垃圾而不是退出我的程序優雅?我在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