康晶晶
摘 要: 匯編語言作為一種面向機器的語言,具有占用存儲空間小、運行速度快的優點,并可直接控制硬件,在某些場合具有重要的作用;然而,匯編語言的編寫和調試卻相對困難和復雜,在進行數值混合運算與數據處理上尤為突出。C語言具有開發效率高,功能豐富、使用靈活、表達能力強的優點。在軟件開發中,采用匯編語言與C語言混合程序設計技術,能有效提高運行效率。筆者結合自身工作經驗,具體探討了這一混合程序設計技術,希望能為廣大同行提供借鑒。
關鍵詞: 匯編語言; C語言; 混合編程
中圖分類號:TP311.1 文獻標志碼:A 文章編號:1006-8228(2013)06-01-02
Exploration on design technique of hybrid programming of assembly language and C language
Kang Jingjing
(Institute of Information, Shanxi Agricultural University, Jinzhong, Shanxi 030800, China)
Abstract: Assembly language, as a machine-oriented language, has advantages of less storage space and faster processing, and can directly control hardware. It plays an important role in some occasions. However, writing and debugging in assembly language are relatively difficult and complicated, especially when conducting numerical hybrid computing and data processing. C language shows strengths of high efficiency of development, abundant feature, flexibility, strong expression abilities. During developing software, hybrid programming of assembly language and C language can effectively improve operational efficiency. Combined with author's own work experience, the technique is discussed in detail, in order to provide a reference for the peers.
Key words: assembly language; C language; hybrid programming
0 引言
在大型程序的設計中,如果將匯編語言程序和高級語言程序結合使用,能充分發揮其各自的優點,實現兩種語言的混合編程。在程序設計中,C語言可以調用匯編語言的子程序,而匯編語言也可調用C語言的子程序,還可在C語言程序中嵌入匯編語句,具有極大的優點[1]。同時,在混合編程中,模塊的連接、參數的傳遞和調用關系的確定等都是應當引起編程者注意的重要問題。
1 匯編語言與C語言混合編程的方法
匯編語言與C語言混合編程的方法主要包括以下幾種:
⑴ 在C語言程序中使用匯編程序定義的常量與變量[2];
⑵ 在C語言程序中內嵌匯編語句,實現C語言不能做到的對硬件的控制功能;
⑶ 在C語言程序中使用內部函數調用匯編語句;
⑷ 混合編程時,單個任務可被分成若干個功能模塊,每個功能模塊均以子程序或函數的形式存在,根據各單一模塊的特點,選擇合適的編程語言進行獨立編程,然后通過對應的語言編譯系統編譯成目標文件,最后將諸多目標文件集合在一起成為一個可執行文件。
1.1 C語言程序嵌入匯編語句
在C語言中,可直接編寫匯編語言代碼,在C語言中嵌入匯編語句時不需要分號,具體語法為:
asm
如果要嵌入一組語句,則需要用大括號{}將其括起來:
asm {
mov ax,data1
xchg ax,data2
mov data1,ax
}
C語言允許嵌入的匯編命令包括四類:一般指令、跳轉指令和數據定義、串操作指令、分配指令。
1.2 C語言調用匯編語言子程序
為了實現C語言對匯編語言子程序的調用,匯編語言源程序一定要嚴格依據編譯系統要求或約定的段組合和段順序。
⑴ 匯編語言子程序格式
匯編語言子程序的格式通常為:
MYCODE SEGMENT PARA PUBLIC ‘CODE
PUBLIC_函數名;公共符號說明
DGROUP GROUP MYDATA,MYBBS
MYDATA SEGMENT WORD PUBLIC ‘CODE
...定義變量,初始化數據
MYDATA ENDS
MYBBS SEGMENT WORD PUBLIC ‘CODE
...非初始化數據,開辟內存區
MY BBS END
ASSUME
CS:MYCODE,DS:DGROUP,SS:DGROUP
...
_函數名 PROC NEAR/FAR
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
...程序主體語句
POP DI
POP SI
POP BP
RET
_函數名 END UP
...
MYCODE ENDS
END
⑵ 被調用匯編語言的子程序格式
將被調用的程序的格式與一般匯編語言程序的格式相對比,可得以下結論:
第一,由于匯編語言子程序與C語言程序共用一個堆棧段,因此,匯編語言子程序的開頭必須運行以下兩個命令:
PUSH BP
MOVE BO,SP
第二,將要被C語言程序調用的子程序必須要以PUBLIC偽操作來說明該子程序是外部調用的。
第三,C語言程序允許子程序使用DI和SI存放局部變量,當變量超過兩個時才可存放在堆棧中,因此,模式中出現了PUSH DI與PUSH SI語句[3]。
第四,在整個程序中,定義了MYCODE代碼段、MYDATA初始化數據段、MYBBS費初始化數據段,并將MYBBS與MYDATA合成為DGROUP段組,且同一段組中各段共享基址。
第五,程序主體語句部分要有函數值返回語句,該返回值必須在RET語句前。
第六,被調用過程要以RET命令返回。
第七,結束處的END只表示程序的結束,未標示啟動位置。
1.3 匯編語言調用C語言子程序
匯編語言具有C語言難以比擬的優勢,如:輸入時可采用任意進制的數據,并可直接對其讀取。因此,可以在匯編程序中調用C語言子程序。
匯編語言主程序的格式與其子程序相同,只需在程序開始處添加語句:
EXTERN 函數名
用以說明該函數是被調用的C語言子程序,是外部的。
在主過程語句中,可通過CALL語句調用外部函數,格式為:
CALL NEAR PTR 函數名
當C語言子程序作為子程序時,其中可只含有C函數,無需EXTERN說明。
2 C語言與匯編語言的連接
2.1 參數傳遞
C語言和匯編語言在調用時會有參數傳遞的問題,通常采用堆棧來傳遞,在匯編語言中,將BP作為基址寄存器,先將來源于C語言的參數壓入堆棧,當使用這些參數時,再通過BP利用不同的偏移量對堆棧中的數據進行存取[4]。
2.2 確定調用關系
對將要調用的函數或過程,應進行事先說明,建立調用、被調用關系,被調用的函數或過程應先說明外部類型,調用程序也應說明要引用的外部模塊。
此外,還應依據存儲模式的不同而確定匯編語言格式,C程序大模式通常對應匯編程序的遠類型過程,而C程序小模式通常對應匯編程序的近類型過程[5]。
2.3 C語言與匯編語句程序的模塊連接
匯編語言與C語言模塊的正確連接有兩點要求:匯編模塊與C模塊的存儲方式須一致;匯編模塊必須遵從與C模塊兼容的命名約定。編譯系統在編譯C源程序時,會在函數名和變量名前加下劃線,為保持連接前后的一致性,所有被C語言調研的匯編子程序標示符都應加下劃線。同時,為使匯編語言標示符在C語言中可見,必須以PUBLIC定義。匯編語言中的C語言函數與變量,須在其前加下劃線,匯編程序開始部分調用的C函數與變量則應以EXTERN說明[6]。
3 結束語
綜上所述,C語言與匯編語言混合編程可互相取長補短,發揮各自優勢,進行參數傳遞、共享數據結構和數據信息,從而用以開發出更安全、實用、可靠的元件,使軟件開發與編程事半功倍。
參考文獻:
[1] 宋金華.匯編語言和C語言在圖形處理中的綜合應用[J].湖北廣播電
視大學學報,2010.10(12):11-12
[2] 張銀,索旭華,廖建林,郭娟.AOCC應用軟件的快速仿真平臺的研究
與技術實現[J].航天控制,2010.4(2):55-56
[3] 羅南超,向昌成,李唐輝.匯編語言實現多種進制的通用輸入輸出[J].
電腦知識與技術,2008.5(36):120-121
[4] 王文東,李竹林,尚建人.匯編語言與C語言的混合程序設計技術[J].
計算機技術與發展,2006.8(8):89-90
[5] 左艷麗.C語言和匯編語言混合編程的方法和實現[J].職教與經濟研
究(婁底職業技術學院學報),2008.6(3):12-13
[6] 王詠寧.高級語言與匯編語言混合編程的實現方法[J].科技信息(學術
研究),2007.10(24):101-102