康晶晶
摘 要: 匯編語(yǔ)言作為一種面向機(jī)器的語(yǔ)言,具有占用存儲(chǔ)空間小、運(yùn)行速度快的優(yōu)點(diǎn),并可直接控制硬件,在某些場(chǎng)合具有重要的作用;然而,匯編語(yǔ)言的編寫(xiě)和調(diào)試卻相對(duì)困難和復(fù)雜,在進(jìn)行數(shù)值混合運(yùn)算與數(shù)據(jù)處理上尤為突出。C語(yǔ)言具有開(kāi)發(fā)效率高,功能豐富、使用靈活、表達(dá)能力強(qiáng)的優(yōu)點(diǎn)。在軟件開(kāi)發(fā)中,采用匯編語(yǔ)言與C語(yǔ)言混合程序設(shè)計(jì)技術(shù),能有效提高運(yùn)行效率。筆者結(jié)合自身工作經(jīng)驗(yàn),具體探討了這一混合程序設(shè)計(jì)技術(shù),希望能為廣大同行提供借鑒。
關(guān)鍵詞: 匯編語(yǔ)言; C語(yǔ)言; 混合編程
中圖分類(lèi)號(hào):TP311.1 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言
在大型程序的設(shè)計(jì)中,如果將匯編語(yǔ)言程序和高級(jí)語(yǔ)言程序結(jié)合使用,能充分發(fā)揮其各自的優(yōu)點(diǎn),實(shí)現(xiàn)兩種語(yǔ)言的混合編程。在程序設(shè)計(jì)中,C語(yǔ)言可以調(diào)用匯編語(yǔ)言的子程序,而匯編語(yǔ)言也可調(diào)用C語(yǔ)言的子程序,還可在C語(yǔ)言程序中嵌入?yún)R編語(yǔ)句,具有極大的優(yōu)點(diǎn)[1]。同時(shí),在混合編程中,模塊的連接、參數(shù)的傳遞和調(diào)用關(guān)系的確定等都是應(yīng)當(dāng)引起編程者注意的重要問(wèn)題。
1 匯編語(yǔ)言與C語(yǔ)言混合編程的方法
匯編語(yǔ)言與C語(yǔ)言混合編程的方法主要包括以下幾種:
⑴ 在C語(yǔ)言程序中使用匯編程序定義的常量與變量[2];
⑵ 在C語(yǔ)言程序中內(nèi)嵌匯編語(yǔ)句,實(shí)現(xiàn)C語(yǔ)言不能做到的對(duì)硬件的控制功能;
⑶ 在C語(yǔ)言程序中使用內(nèi)部函數(shù)調(diào)用匯編語(yǔ)句;
⑷ 混合編程時(shí),單個(gè)任務(wù)可被分成若干個(gè)功能模塊,每個(gè)功能模塊均以子程序或函數(shù)的形式存在,根據(jù)各單一模塊的特點(diǎn),選擇合適的編程語(yǔ)言進(jìn)行獨(dú)立編程,然后通過(guò)對(duì)應(yīng)的語(yǔ)言編譯系統(tǒng)編譯成目標(biāo)文件,最后將諸多目標(biāo)文件集合在一起成為一個(gè)可執(zhí)行文件。
1.1 C語(yǔ)言程序嵌入?yún)R編語(yǔ)句
在C語(yǔ)言中,可直接編寫(xiě)匯編語(yǔ)言代碼,在C語(yǔ)言中嵌入?yún)R編語(yǔ)句時(shí)不需要分號(hào),具體語(yǔ)法為:
asm
如果要嵌入一組語(yǔ)句,則需要用大括號(hào){}將其括起來(lái):
asm {
mov ax,data1
xchg ax,data2
mov data1,ax
}
C語(yǔ)言允許嵌入的匯編命令包括四類(lèi):一般指令、跳轉(zhuǎn)指令和數(shù)據(jù)定義、串操作指令、分配指令。
1.2 C語(yǔ)言調(diào)用匯編語(yǔ)言子程序
為了實(shí)現(xiàn)C語(yǔ)言對(duì)匯編語(yǔ)言子程序的調(diào)用,匯編語(yǔ)言源程序一定要嚴(yán)格依據(jù)編譯系統(tǒng)要求或約定的段組合和段順序。
⑴ 匯編語(yǔ)言子程序格式
匯編語(yǔ)言子程序的格式通常為:
MYCODE SEGMENT PARA PUBLIC ‘CODE
PUBLIC_函數(shù)名;公共符號(hào)說(shuō)明
DGROUP GROUP MYDATA,MYBBS
MYDATA SEGMENT WORD PUBLIC ‘CODE
...定義變量,初始化數(shù)據(jù)
MYDATA ENDS
MYBBS SEGMENT WORD PUBLIC ‘CODE
...非初始化數(shù)據(jù),開(kāi)辟內(nèi)存區(qū)
MY BBS END
ASSUME
CS:MYCODE,DS:DGROUP,SS:DGROUP
...
_函數(shù)名 PROC NEAR/FAR
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
...程序主體語(yǔ)句
POP DI
POP SI
POP BP
RET
_函數(shù)名 END UP
...
MYCODE ENDS
END
⑵ 被調(diào)用匯編語(yǔ)言的子程序格式
將被調(diào)用的程序的格式與一般匯編語(yǔ)言程序的格式相對(duì)比,可得以下結(jié)論:
第一,由于匯編語(yǔ)言子程序與C語(yǔ)言程序共用一個(gè)堆棧段,因此,匯編語(yǔ)言子程序的開(kāi)頭必須運(yùn)行以下兩個(gè)命令:
PUSH BP
MOVE BO,SP
第二,將要被C語(yǔ)言程序調(diào)用的子程序必須要以PUBLIC偽操作來(lái)說(shuō)明該子程序是外部調(diào)用的。
第三,C語(yǔ)言程序允許子程序使用DI和SI存放局部變量,當(dāng)變量超過(guò)兩個(gè)時(shí)才可存放在堆棧中,因此,模式中出現(xiàn)了PUSH DI與PUSH SI語(yǔ)句[3]。
第四,在整個(gè)程序中,定義了MYCODE代碼段、MYDATA初始化數(shù)據(jù)段、MYBBS費(fèi)初始化數(shù)據(jù)段,并將MYBBS與MYDATA合成為DGROUP段組,且同一段組中各段共享基址。
第五,程序主體語(yǔ)句部分要有函數(shù)值返回語(yǔ)句,該返回值必須在RET語(yǔ)句前。
第六,被調(diào)用過(guò)程要以RET命令返回。
第七,結(jié)束處的END只表示程序的結(jié)束,未標(biāo)示啟動(dòng)位置。
1.3 匯編語(yǔ)言調(diào)用C語(yǔ)言子程序
匯編語(yǔ)言具有C語(yǔ)言難以比擬的優(yōu)勢(shì),如:輸入時(shí)可采用任意進(jìn)制的數(shù)據(jù),并可直接對(duì)其讀取。因此,可以在匯編程序中調(diào)用C語(yǔ)言子程序。
匯編語(yǔ)言主程序的格式與其子程序相同,只需在程序開(kāi)始處添加語(yǔ)句:
EXTERN 函數(shù)名
用以說(shuō)明該函數(shù)是被調(diào)用的C語(yǔ)言子程序,是外部的。
在主過(guò)程語(yǔ)句中,可通過(guò)CALL語(yǔ)句調(diào)用外部函數(shù),格式為:
CALL NEAR PTR 函數(shù)名
當(dāng)C語(yǔ)言子程序作為子程序時(shí),其中可只含有C函數(shù),無(wú)需EXTERN說(shuō)明。
2 C語(yǔ)言與匯編語(yǔ)言的連接
2.1 參數(shù)傳遞
C語(yǔ)言和匯編語(yǔ)言在調(diào)用時(shí)會(huì)有參數(shù)傳遞的問(wèn)題,通常采用堆棧來(lái)傳遞,在匯編語(yǔ)言中,將BP作為基址寄存器,先將來(lái)源于C語(yǔ)言的參數(shù)壓入堆棧,當(dāng)使用這些參數(shù)時(shí),再通過(guò)BP利用不同的偏移量對(duì)堆棧中的數(shù)據(jù)進(jìn)行存取[4]。
2.2 確定調(diào)用關(guān)系
對(duì)將要調(diào)用的函數(shù)或過(guò)程,應(yīng)進(jìn)行事先說(shuō)明,建立調(diào)用、被調(diào)用關(guān)系,被調(diào)用的函數(shù)或過(guò)程應(yīng)先說(shuō)明外部類(lèi)型,調(diào)用程序也應(yīng)說(shuō)明要引用的外部模塊。
此外,還應(yīng)依據(jù)存儲(chǔ)模式的不同而確定匯編語(yǔ)言格式,C程序大模式通常對(duì)應(yīng)匯編程序的遠(yuǎn)類(lèi)型過(guò)程,而C程序小模式通常對(duì)應(yīng)匯編程序的近類(lèi)型過(guò)程[5]。
2.3 C語(yǔ)言與匯編語(yǔ)句程序的模塊連接
匯編語(yǔ)言與C語(yǔ)言模塊的正確連接有兩點(diǎn)要求:匯編模塊與C模塊的存儲(chǔ)方式須一致;匯編模塊必須遵從與C模塊兼容的命名約定。編譯系統(tǒng)在編譯C源程序時(shí),會(huì)在函數(shù)名和變量名前加下劃線,為保持連接前后的一致性,所有被C語(yǔ)言調(diào)研的匯編子程序標(biāo)示符都應(yīng)加下劃線。同時(shí),為使匯編語(yǔ)言標(biāo)示符在C語(yǔ)言中可見(jiàn),必須以PUBLIC定義。匯編語(yǔ)言中的C語(yǔ)言函數(shù)與變量,須在其前加下劃線,匯編程序開(kāi)始部分調(diào)用的C函數(shù)與變量則應(yīng)以EXTERN說(shuō)明[6]。
3 結(jié)束語(yǔ)
綜上所述,C語(yǔ)言與匯編語(yǔ)言混合編程可互相取長(zhǎng)補(bǔ)短,發(fā)揮各自優(yōu)勢(shì),進(jìn)行參數(shù)傳遞、共享數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)信息,從而用以開(kāi)發(fā)出更安全、實(shí)用、可靠的元件,使軟件開(kāi)發(fā)與編程事半功倍。
參考文獻(xiàn):
[1] 宋金華.匯編語(yǔ)言和C語(yǔ)言在圖形處理中的綜合應(yīng)用[J].湖北廣播電
視大學(xué)學(xué)報(bào),2010.10(12):11-12
[2] 張銀,索旭華,廖建林,郭娟.AOCC應(yīng)用軟件的快速仿真平臺(tái)的研究
與技術(shù)實(shí)現(xiàn)[J].航天控制,2010.4(2):55-56
[3] 羅南超,向昌成,李唐輝.匯編語(yǔ)言實(shí)現(xiàn)多種進(jìn)制的通用輸入輸出[J].
電腦知識(shí)與技術(shù),2008.5(36):120-121
[4] 王文東,李竹林,尚建人.匯編語(yǔ)言與C語(yǔ)言的混合程序設(shè)計(jì)技術(shù)[J].
計(jì)算機(jī)技術(shù)與發(fā)展,2006.8(8):89-90
[5] 左艷麗.C語(yǔ)言和匯編語(yǔ)言混合編程的方法和實(shí)現(xiàn)[J].職教與經(jīng)濟(jì)研
究(婁底職業(yè)技術(shù)學(xué)院學(xué)報(bào)),2008.6(3):12-13
[6] 王詠寧.高級(jí)語(yǔ)言與匯編語(yǔ)言混合編程的實(shí)現(xiàn)方法[J].科技信息(學(xué)術(shù)
研究),2007.10(24):101-102