2012-12-25 142 views
1

我試圖編寫一個簡單的程序,它從stdin中獲取大量字符。爲了簡便起見,相關代碼:在GNU彙編程序中sys_read系統調用與int 0x80

mov $3, %rax # sys_read = 3 
mov $0, %rbx # stdin fd = 0 
mov $b, %rcx # '.lcomm b, 32' declared in .bss section 
mov $32,%rdx # size_t 
# syscall 
int $0x80 

當我使用int $0x80程序發揮預期的作用,然而,隨着syscall它出現segfaults。我讀到它與使用中斷需要內核記住機器狀態的事實有關,而syscall不符合該要求,即內核在它自己的時間內處理它。我不確定這是否是真正的原因 - 我會假設syscall對寄存器執行某些操作,使得sys_read失敗。

我還從之前發佈的一個問題中讀到「syscall是進入內核的默認方式」,並且「int 0x80是調用系統調用的傳統方式,應該避免。」 (Link

我真的找不到任何好的文檔,所以任何輸入將不勝感激。

編輯:錯字

+0

'syscall'應該可以在64位系統上工作,但是在不同的寄存器中需要不同的sys_call號碼和參數。有趣的是,不推薦'int 80h',但似乎可以工作 - 即使是在64位系統上!你有一個64位寄存器和32位系統調用號碼和參數的「混合包」。 –

+0

啊,好的,謝謝。 $ b和$ 0分別進入寄存器rsi和rdi。 – jtx

回答

0

檢查this問題。在x86_64上,正確的退出系統調用是$60,應該在%rax

mov $60, %rax 
mov $0, %rdi 
syscall 
相關問題