2011-12-14 112 views
14

我目前在Linux上學習彙編語言。我一直在使用「從頭開始編程」一書,所有例子都是32位的。我的操作系統是64位的,我一直試圖在64位上做所有的例子。我有麻煩,但是:x86_64彙編Linux系統調用混淆

.section .data 

.section .text 
.global _start 
_start: 
movq $60, %rax 
movq $2, %rbx 
int $0x80 

這只是調用Linux退出系統調用或它應該。相反,它會導致一個SEG FAULT,而當我改爲做這個時

.section .data 

.section .text 
.global _start 
_start: 
movq $1, %rax 
movq $2, %rbx 
int $0x80 

它的工作原理。很顯然,問題是我轉向%rax的價值。我在第二個例子中使用的價值$ 1是'從頭開始編程',據說可以使用互聯網上的多個來源說64位系統呼叫號碼是60美元。 Reference 我在做什麼錯?另外還應該注意哪些其他問題以及我應該使用什麼參考?以防萬一你需要知道,我從第五章開始編程。

回答

15

您正在運行i386和x86_64之間的一個令人驚訝的區別:它們不使用相同的系統調用機制。正確的代碼是:

movq $60, %rax 
movq $2, %rdi ; not %rbx! 
syscall 

中斷0x80總是調用32位的系統調用。它用於允許32位應用程序在64位系統上運行。

爲了學習的目的,您應該儘量正確地按照教程進行操作,而不是隨時隨地翻譯爲64位 - 您可能遇到的其他一些重大行爲差異。一旦你熟悉i386,,然後,你可以單獨拿起x86_64。

+0

我可能最終會這樣做。感謝您的答覆。 – 2011-12-14 19:32:33

+0

應該爲第一個系統調用參數使用`%rdi`,而不是`%rbx`。 – 2011-12-14 20:18:56

10

請仔細閱讀本What are the calling conventions for UNIX & Linux system calls on x86-64

,並注意使用int 0x80的系統調用在x64系統是一個古老的兼容層。您應該在x64系統上使用syscall指令。

您仍然可以使用這種舊方法,但需要在x86模式下編譯二進制文件,請參閱編譯器/彙編程序手冊以獲取詳細信息。

+0

很高興看到有人指出x86_64 Linux實際上使用`syscall`而不是`sysenter`!我寫了一個[更長的答案來解釋兩者之間的混淆](// stackoverflow.com/a/31510342/20789)。 – 2015-07-20 06:56:55

4

i386和x86_64之間的很多變化,包括用於進入內核的指令和用於傳送系統調用參數的寄存器。這裏就相當於你的代碼:

.section .data 

.section .text 
.global _start 
_start: 
movq $60, %rax 
movq $2, %rdi 
syscall 

this answer引用到一個相關的問題:

的系統調用號是在拱下/ 86 /包括/ ASM/unistd_64.h Linux源代碼。系統調用號碼在rax寄存器中傳遞。參數爲rdi,rsi,rdx,r10,r8,r9。該調用通過「系統調用」指令進行調用。系統調用覆蓋rcx寄存器。回報是rax。

2

如果檢查/usr/include/asm/unistd_32.h退出相當於1/usr/include/asm/unistd_64.h出口相當於60

4

duskwuffanswer正確指出64位x86 Linux與32位Linux系統調用的機制不同。

然而,這個答案是不完整的和誤導性的一對夫婦的原因:

由於pointed out in the commentsSYSENTER實際上並沒有很多64位Linux系統 -namely 64位AMD系統工作。

這是一個公認混亂的情況。該gory details are here,但它歸結爲是這樣的:

對於32位內核,SYSENTER/SYSEXIT是唯一兼容對

對於龍64位內核[AMD和英特爾CPU之間]模式下... SYSCALL/SYSRET是唯一兼容對[之間的AMD和英特爾CPU]

目前看來,在64位模式下英特爾 CPU上,你可以得到AWA y使用SYSENTER,因爲它與SYSCALL的功能相同,但AMD系統並非如此。

底線:始終在64位x86系統上的Linux上使用SYSCALL。這正是x86-64 ABI實際指定的內容。 (更多細節見wiki answer。)