在C與匯編混合編程中:
IMPORT 符號 {[WEAK]}
在匯編中,該偽操作指令的作用是告訴編譯器,該符號是在外源文件中定義的,這一點跟extern的作用是一樣的,但與extern不同的是,不論該符號是否在本源文件中被用到,編譯器均將該符號添加到本文件的符號表中。如果在符號后添加了該聲明 {[WEAK]},則該符號即使在外源文件中沒有被找到,編譯器也不會報錯,否則就會報錯。
EXTERN符號 {[WEAK]} [size=17.27272605896px] 在匯編中,該符號是在外源文件中定義的,在本源文件中可能被用到,如果沒用到,編譯器就不會添加到本源文件的符號表中;{[WEAK]} 作用同上。
EXPORT 符號
在匯編中,對于本源文件中的一個函數,通過EXPORT給這個函數定義一個新的函數的入口,包括名字,地址等,供外面文件(如C源文件)調用。這個函數會被放到kernelimage的__ksymtabsection中,當用到這個函數的模塊在runtime時被加載的時候,loader就會從__ksymtabsection解析這個函數。
所以從源文件的角度講,這就涉及到內部函數與外部函數的問題,在匯編中以IMPORT EXPORT EXTERN來加以聲明,告知編譯器。IMPORT的意思是該函數或符號是外源文件定義的,在本文件中可能加以引用。EXPORT的意思是該函數或符號重新定義一個新的函數入口,包括名稱和地址,以供外源文件引用。
另:匯編語言的指令不區分大小寫,但是函數,符號,字符串等還是區分大小寫的;
在C語言中,也有內部函數與外部函數的區別,格式分別如下:
static 函數類型聲明 函數名(形參表);
static int function(int a,int b); 這是通過static定義了一個內部函數,對外源文件進行屏蔽,尤其是在多人分工編寫程序時,即使名字一樣,也不會發生沖突,增加了程序的可靠性。
同理,
extern int function(int a,int b);就可以為其他源文件調用,如果省略extern,則默認為外部函數。
這是從程序源文件之間的角度來講,分為內部變量與外部變量、內部函數與外部函數;
那么借此,在從源文件內部的角度來表一表,在某一個源文件中,變量的分類:
在一個源文件內,從作用域的角度講:變量分為全局變量與局部變量;從變量的存儲方式上講,又分為靜態存儲方式與動態存儲方式,靜態存儲方式分配的存儲空間是固定的,在整個程序運行期間一直占有該內存空間,不釋放。動態則是動態分配的,其生命周期結束后,就會是釋放,所以根據作用域與存儲方式主要分為以下三種變量:靜態全局變量,靜態局部變量,局部變量,這里主要強調一下靜態局部變量,其他兩種都比較好理解,靜態局部變量就是讓某子函數的局部變量的存儲單元固定,不釋放,該變量初始化一次后,當再次運行到此函數時,該變量的初始化語句跳過不再執行,該變量依然保持著上一次程序運行時的最后一次的賦值,從這個角度叫,該函數不具備可重入性。
|