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)
我真的找不到任何好的文檔,所以任何輸入將不勝感激。
編輯:錯字
'syscall'應該可以在64位系統上工作,但是在不同的寄存器中需要不同的sys_call號碼和參數。有趣的是,不推薦'int 80h',但似乎可以工作 - 即使是在64位系統上!你有一個64位寄存器和32位系統調用號碼和參數的「混合包」。 –
啊,好的,謝謝。 $ b和$ 0分別進入寄存器rsi和rdi。 – jtx