2013-04-14 54 views
7

我正在寫一個非常輕量級的libc替換庫,以便我能更好地理解內核 - 應用程序接口。第一個任務顯然是獲得一些系統調用包裝。我已經成功地獲得了1到3個參數包裝器,但我正在努力爭取4個參數變量。這裏是我的起點:在gcc內聯x86_64程序集中約束r10寄存器

long _syscall4(long type, long a1, long a2, long a3, long a4) 
{ 
    long ret; 
    asm 
    (
     "syscall" 
     : "=a"(ret) 
     : "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4) 
     : "c", "r11" 
    ); 
    return ret; 
} 

編譯器給了我以下錯誤:

error: matching constraint references invalid operand number 

我_syscall3功能工作正常,但犯規的使用R10或有撞名單。

有什麼想法?

回答

0

大概是因爲沒有指令對r10寄存器有特殊要求,所以gcc人員沒有爲它創建一個約束(考慮到約束主要針對機器描述)。如果你堅持內聯asm,我不認爲你可以比使用通用的"r"(或"m")約束更好,並且自己移動到r10(並將其添加到clobber列表中)。

5

寄存器沒有限制:%r8 .. %15。然而,最近的(如在GCC-4.x的)應該接受:

register long r10 asm("r10") = a4; 

然後使用輸入約束:"r" (r10)

這可能需要__asm____volatile__合格 - 我跑斷記憶在這裏,所以我不能告訴你什麼時候這個語法是正式的,等等。這是一個合理的循環使用否則無用register關鍵字。

+2

偉大的提示。這是一個非常棒的功能,它確實有助於將GCC內聯彙編程序分開設置。以下是相關文檔:https://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html – linguamachina

相關問題