金微
摘 要:隨著網絡與通信技術的發展,正在涌現出大量新的嵌入式系統,通常情況用C或者C++完成大部分的編程任務,僅有初始化部分用匯編語言完成。本文主要研究匯編語言和C語言混合編程,在當前程序開發領域提供了新的途徑。
關鍵詞:匯編程序;C語言;編排技術
1 引言
在平常編寫程序時,我們一般都希望選擇C、Pascal、Basic等這樣的高級語言來編寫,高級語言由于有編譯器的支持,它們的語法更接近于自然語言,表達能力強,使用靈活,具有強大的庫函數,更重要的是高級語言與機器無關,可移殖性較好,這樣使程序開發周期比較短,省時省力。為了提高程序運行速度,或直接訪問硬件,用匯編語言編程可以提高程序的運行效率。為了既能縮短程序開發周期,又能保證程序的執行效率,較好的解決辦法是程序的框架或主體部分用C語言編寫,要求執行效率高的部分用匯編語言編寫。這里就涉及到了混合編程的問題,這種混合編程的方法將C語言和匯編語言的優點結合起來,所以成為目前單片機開發最流行的編程方法?;旌暇幊痰年P鍵是解決好高級語言與匯編語言的接口問題,可采用兩種方法:一是使用嵌入式匯編,即在高級語言的語句中直接使用匯編語句,這種方法比較簡潔直觀,但功能較弱;另一種方法是獨立編程,分別產生各自的目標文件,然后經過連接,形成一個完整的程序。
2 匯編語言和C語言程序的變量相互調用
在一個工程中,一般都會由多個匯編文件和多個C/C++程序文件有機組成。在這些匯編文件和C/C++文件之間就存在變量相互訪問和函數相互調用的問題。內嵌匯編不用單獨編輯匯編語言文件,比較簡潔,但是有諸多限制,當匯編的代碼較多時一般放在單獨的匯編文件中。這時就需要在匯編和C之間進行一些數據的傳遞,最簡便的辦法就是使用全局變量。
2.1 匯編程序中訪問C程序變量
在C/C++程序中聲明的全局變量可以被匯編程序通過地址間接訪問。具體訪問方法/步驟如下:
①C/C++程序中聲明全局變量;②在匯編程序使用IMPORT/EXTERN偽指令聲明引用該全局變量;③使用LDR偽指令讀取該變量的內存地址;④根據該數據的類型使用相應的LDR或STR指令讀取或設置該變量的值。對于無符號變量,使用LDRB/STRB訪問char;使用LDRH/STRH訪問short;使用LDR/STR訪問integer。對于有符號數,使用LDRSB/LDRSH。
在匯編的源程序中調用C語言風格的字符串需要使用IMPORT偽操作。IMPORT相當于C語言中的extern關鍵字,告訴編譯器引用的符號不是在本文件中定義的,而是在其他的源文件中定義的。
偽操作的格式:
IMPORT symbol[,WEAK]
symbol是聲明的符號的名稱;[,WEAK]指示編譯器如果發現symbol在所有的源文件中都沒有找到,那么它也不會產生任何的錯誤信息。
2.2 C程序中訪問匯編程序變量
在匯編程序中聲明的數據可以被C/C++程序所訪問,具體訪問方法/步驟是:在匯編程序中用EX-PORT/GLOBAL偽指令聲明該符號為全局標號,可以被其他文件應用;C/C++程序中定義相應數據類型的指針變量;對該指針變量賦值為匯編程序中的全局標號,利用該指針訪問匯編程序中的數據。
3 匯編語言和C語言程序相互調用
3.1 在C程序中調用匯編函數
在C程序中調用匯編函數一般情況下,在C中要調用一個匯編編寫的函數,需要首先在C語言中聲明此函數的函數原型,同時C語言希望所有的外部標號均以下劃線/_0開頭,如果匯編模塊中定義的函數及變量準備供C調用,應以下劃線開頭。如若有函數F_Sub,要定義為供C調用的函數,在匯編程序中應定義為PUBLIC _F_Sub。因為C語言區別對待大小寫字母,所以在編寫準備與C模塊相連接的匯編模塊時,應該注意符號名的大小寫,以便保持一致。以下是在C中調用匯編程序的實例:
//C語言主函數main()
void F_Sub(void); //聲明要調用的函數的函數原型,此函數無參數傳遞
intmain(void){
while(1)
F_Sub(); //調用匯編函數
return 0;
}
//匯編子函數F_Sub()
.CODE
. PUBLIC _F_Sub
_F_Sub:
NOP
RETF
以上程序在IDE集成開發環境下編譯連接后即可運行。
3.2 在匯編程序中調用C函數
在匯編函數中要調用C語言的子函數,應該根據C函數原型所要求的參數類型,分別把參數壓入堆棧后,再調用C函數。調用結束后還須再進行彈棧,以恢復調用C函數前的堆棧指針。以下是匯編調用C函數的。
例如下面的程序,利用函數調用形式輸出字符串″Hello world e″
Extern void display(void)L
Main()
{
display()L
}
.model small
.data
string db ″Hello world e$″
.code
public _display
_display proc
mov ah,9
mov dx,offset string
int 21h
ret
_display endp
end
說明:①在C程序中使用關鍵字″extern″對函數作顯式說明;②對不同的存儲模式要選用不同的匯編語言格式。當C程序為微型、小型、緊湊型模式時,匯編用近過程;當C程序為中型、大型、巨型模式時,匯編用遠過程;③匯編程序取C的參數。遠過程返回地址占四個字節,BP壓入占二字節,所以第一個參數在BP+6所指向的單元,而近過程第一個參數在BP+4所指向的單元;④匯編程序中寄存器的保護。TurboC允許子過程使用SI 和DI存放局部變量,當寄存器變量多于兩個時,多余部分會自動轉到堆棧中存儲。因此,匯編過程的格式為:
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI…
…………
…………
…………
POP SI
POP DI
POP BP
RET
⑤返回值。每種C語言的數據類型都有一個標準的返回位置,一般在AX (微型、小型、緊湊型模式)或DX:AX(中型、大型、巨型模式)中,如:char,unsigned char,short int等,返回值位置為AX,且返回數據必須放置在RET指令之前。匯編子程序要定義為遠過程,并用public偽指令把過程名定義為公共。
4 結束語
本文研究了匯編語言與C語言混合編程的編程問題,重點對編程時C語言與匯編語言和C語言變量與程序的相互調用問題進行了分析,并給出了實例。當采用兩種或兩種以上的編程語言組合編程,彼此相互調用,進行參數傳遞,是一種有效的程序設計方法。這種方法可以發揮各種語言的優勢和特點,充分利用現有的多種實用程序、庫程序等,使軟件的開發周期大大縮短,是當前程序接口技術的一個重要研究和應用領域。
[參考文獻]
[1]沈美明,溫冬嬋.IBM-PC匯編語言程序設計[M].北京:清華大學出版社, 2001.
[2]周學毛.匯編語言程序設計[M].北京:高等教育出版社,2002.
[3]張永,黃建宇,劉治生.C語言與匯編語言混合編程的研究與實現[J].計算機與數字工程,2006.