2012-02-18 49 views
4

我有一些程序集例程由C函數調用並從中獲取參數。現在,我假設這些參數是以cdecl順序在堆棧上傳遞的。這是一個公平的假設嗎?假設在組合C和x86程序集時調用約定

編譯器(GCC)會檢測到這一點,並確保參數傳遞正確,或者我應該手動去聲明它們的cdecl?如果是這樣,如果我指定更高的優化級別,該屬性是否仍然有效?

+3

不,您的彙編代碼在鏈接時間之前不符合您的C代碼。爲了讓C編譯器對您採用的任何調用約定很聰明,時間已經太晚了。內聯彙編很流行的一個原因。 – 2012-02-18 22:44:57

回答

1

這是您編寫代碼的平臺的ABI問題。幾乎所有的平臺都遵循用於C調用約定和其他ABI問題的Unix System V ABI,其中包括詳述所有CPU體系結構中常見ABI特性的通用ABI(gABI)文檔以及特定於處理器的專用ABI(psABI)文檔特定的CPU架構/系列。說到x86,這與您所稱的「cdecl」相匹配。因此,從實際的角度來看,意圖從C調用的x86彙編應該寫成假定「cdecl」。基本上,這個調用約定的普遍性的唯一例外是Windows API函數,由於傳統的Win16 dll thunk兼容性問題,它們使用自己的非標準「stdcall」調用約定;儘管如此,x86 Windows上的「默認」調用約定仍然是「cdecl」。

編寫要從C中調用的asm時,更重要的問題是符號名稱是否應加前綴下劃線。這在平臺之間差別很大,總的趨勢是基於ELF的平臺不使用前綴,並且大多數其他平臺都這樣做...

0

快速和骯髒的方法是創建一個虛擬的C函數,匹配你想要實現的asm函數,在虛函數函數中用傳入的參數做一些事情,這樣你就可以區分它們,編譯然後拆開。不是萬無一失的,但經常工作。