2015-12-30 63 views
0

我有在Linux的用戶空間運行一個很基本的彙編程序:爲什麼'syscall'指令不能在Linux下工作?

section .text 
global _start 

_start: 
    mov edx, 14 
    mov ecx, msg 
    mov ebx, 1 
    mov eax, 4 
    syscall 

    mov eax, 1 
    syscall 

section .data 
msg db "Hello, World!", 0xA 

然而,這不起作用,因爲它是,但只有當我int 0x80更換syscall秒。不要這些做同樣的事情嗎?我知道syscall被設計爲低延遲,但除此之外,我不認爲有什麼區別。爲什麼它不起作用?

+0

也許您在尋找'sysenter'? Linux將包含用戶空間「sysenter」包裝的頁面映射到32位進程的虛擬地址空間中。這是VDSO。 –

+0

有你所需要查看的所謂的人工頁面。特別是關於'syscall','syscalls'和你想調用的系統調用。你會發現你在那裏必須知道的一切。 – sivizius

回答

2

syscall僅適用於x86-64操作系統,您應該將系統調用號碼放在rax寄存器中,而不是eaxSee this website for more information.

+1

沒有系統調用號碼需要超過32位來表示! 'mov r32,imm32'爲64位寄存器的高32位。寫入'mov rax,231'只會導致機器代碼中的浪費字節,以及一些彙編器。 (或者'REX.W = 1 mov r,imm32'(符號擴展)或者更糟'REX.W = 1 mov r,imm64'。) –

1

syscall指令不存儲「迴歸RIP」或「返回RSP」在任何地方,所以這些通常被存儲在前面的指令寄存器使用syscall指令之前。

我懷疑在Linux上使用RCXRDX是爲了這個目的;並且所有其他參數都因此而結束於不同的寄存器中。

相關問題