2013-06-24 169 views
0

我有一個包含C代碼和彙編代碼的示例項目 有Main.c,Main.hconvert.S一個包含C代碼和彙編代碼的C項目

裏面的彙編代碼convert.S有下面的代碼:

.global 
.section .bss 
.section .text 

.global _FIL_2ORD     
_FIL_2ORD: 

的CONVERT.H文件中:

extern int FIL_2ORD(
    tFIL2HISTORY *history; 
    tFIL2COEFF *coeff; 
    int input; 
); 

裏面的MAIN.C功能如果它調用FIL_2ORD();這樣纔有通過convert.h文件中聲明的彙編代碼中的函數解決?

我的問題是彙編代碼是否會得到編譯和鏈接,並隨時根據main.c調用該函數將它被引用和解決?

+0

我不明白你的問題。這當然是可能的,如果你想要一個例子,從C調用到組件,在一個單獨的文件在C中定義的虛擬函數與編譯「GCC -S」。然後看看gcc生成的.s文件。 –

+0

您的意思是主要的功能,當你寫的「MAIN.C功能」? –

回答

4

編譯C,組裝ASM,並連接在一起的兩成一個可執行文件。鏈接器在發現C的目標文件需要它時,將在ASM的目標文件中找到FIL_2ORD()。

對象文件是由C編譯器和彙編程序,用於分別每個源文件創建的。

1

我的問題是彙編代碼是否會被編譯和鏈接 ,並且每當main.c中調用該函數會是 引用和解決?

我假設你正在使用的GCC編譯器 - 是的.global指令的彙編文件,使_FIL_2ORD符號公共給連接器,因此,它將成爲從組件的源代碼之外調用。

這是你如何編譯,彙編和鏈接使用命令行

gcc -o myexe Main.c convert.S 

extern聲明中convert.h是暗示什麼參數的外部函數需要C編譯器的例子。彙編源代碼應該遵守這個聲明。您應該查找目標平臺的標準C調用約定,以查看參數如何傳遞的規則,並相應地編寫彙編代碼。

根據不同的目標平臺上,在_FIL_2ORD聲明前導下劃線字符(內部convert.S)可能會或可能沒有必要(這是我在上段提到的特定於平臺的C調用約定的一部分) 。如果程序無法鏈接,請重試,這次刪除前導下劃線。