齊晶薇
(哈爾濱遠(yuǎn)東理工學(xué)院,黑龍江 哈爾濱 150025)
現(xiàn)階段廣泛采用的計(jì)算機(jī)軟件開(kāi)發(fā)語(yǔ)言,如C語(yǔ)言,由于其具備較高的編程效率,在各個(gè)行業(yè)軟件研究開(kāi)發(fā)中得到了廣泛應(yīng)用.作為一種低級(jí)語(yǔ)言,匯編語(yǔ)言與高級(jí)語(yǔ)言相比,又具有無(wú)可比擬的運(yùn)行速度優(yōu)勢(shì).在這兩種計(jì)算機(jī)語(yǔ)言進(jìn)行混編時(shí),如何使兩者實(shí)現(xiàn)有效連接,就成為計(jì)算機(jī)編程人員需要著力探究的問(wèn)題.
在現(xiàn)階段計(jì)算機(jī)軟件研究開(kāi)發(fā)中,在同一個(gè)應(yīng)用系統(tǒng)中采取兩種或多種不同類型的計(jì)算機(jī)編碼語(yǔ)言,已經(jīng)成為可能,并獲得了實(shí)踐的認(rèn)可.作為計(jì)算機(jī)語(yǔ)言而言,即便一種語(yǔ)言具備再?gòu)?qiáng)的功能,但總有該項(xiàng)語(yǔ)言的弱點(diǎn)和不足,呈現(xiàn)出局限性和先進(jìn)性并存的特征.
例如,數(shù)據(jù)庫(kù)語(yǔ)言,與C語(yǔ)言、Fortran等計(jì)算機(jī)高級(jí)語(yǔ)言形式相比,其在數(shù)據(jù)管理方面性能突出,但在計(jì)算能力及運(yùn)行速度等層面又遠(yuǎn)遠(yuǎn)不及后兩者.計(jì)算機(jī)匯編語(yǔ)言,作為一種低級(jí)語(yǔ)言,又具備了較快的運(yùn)行速度,在存儲(chǔ)空間占用上,小于C語(yǔ)言等高級(jí)語(yǔ)言,更為重要的一點(diǎn)是,匯編語(yǔ)言具備對(duì)計(jì)算機(jī)硬件進(jìn)行訪問(wèn)控制的能力[1].因此,不同的計(jì)算機(jī)語(yǔ)言各有其優(yōu)劣,將不同計(jì)算機(jī)語(yǔ)言進(jìn)行混合編程,則可以吸取各種語(yǔ)言的優(yōu)勢(shì)及特長(zhǎng),為計(jì)算機(jī)編程用戶提供更具針對(duì)性的編程需求.例如,在計(jì)算機(jī)編程中,將大部分程序采用高級(jí)語(yǔ)言的形式進(jìn)行編寫,在計(jì)算機(jī)程序的一些重點(diǎn)部分,需要多次運(yùn)行的部位,其對(duì)運(yùn)行速度和效率具有較高的要求時(shí),或者需要對(duì)計(jì)算機(jī)硬件進(jìn)行直接訪問(wèn)時(shí),此時(shí)就可采用匯編語(yǔ)言進(jìn)行編程.如此一來(lái),可以發(fā)揮出各自語(yǔ)言的優(yōu)點(diǎn),既達(dá)到了多種計(jì)算機(jī)語(yǔ)言綜合運(yùn)用的目的,又能使計(jì)算機(jī)編程效率提升,縮短研發(fā)周期.
不同計(jì)算機(jī)語(yǔ)言混合編程在進(jìn)行連接時(shí),應(yīng)考慮并解決的基本問(wèn)題有以下幾方面:
計(jì)算機(jī)高級(jí)語(yǔ)言在經(jīng)過(guò)編譯之后,往往會(huì)產(chǎn)生格式為OBJ的文件,與之相應(yīng)地,計(jì)算機(jī)匯編語(yǔ)言在經(jīng)過(guò)編譯之后,同樣會(huì)產(chǎn)生OBJ格式的文件,借助連接程序,通過(guò)將兩者加以連接,從而構(gòu)成了具備執(zhí)行條件的EXE文件,在EXE文件形成后,連接程序就已將其裝入計(jì)算機(jī)內(nèi)存系統(tǒng)中,等待執(zhí)行.從這一流程可以看到,在存儲(chǔ)器分配環(huán)節(jié),主要是由連接程序加以掌控的,因此,用戶可以忽略這一環(huán)節(jié).
但涉及到Basic語(yǔ)言時(shí),因?yàn)槠涑袚?dān)解釋程序的任務(wù),因此,情況就要稍顯復(fù)雜,此時(shí)應(yīng)從計(jì)算機(jī)存儲(chǔ)器中找到匯編語(yǔ)言的存放位置,再將相關(guān)信息加以傳送,使Basic語(yǔ)言能夠有效接收.
匯編語(yǔ)言和計(jì)算機(jī)高級(jí)語(yǔ)言之間呈現(xiàn)出一種彼此依存的關(guān)系,一般而言,可將匯編語(yǔ)言視為計(jì)算機(jī)高級(jí)語(yǔ)言所具備的外部過(guò)程,在對(duì)匯編語(yǔ)言進(jìn)行調(diào)用時(shí),由計(jì)算機(jī)高級(jí)語(yǔ)言采取函數(shù)方式或過(guò)程方式進(jìn)行[2].而匯編語(yǔ)言和計(jì)算機(jī)高級(jí)語(yǔ)言這兩種程序在進(jìn)行參數(shù)傳遞時(shí),常采用堆棧的方式進(jìn)行,具體而言,就是調(diào)用程序首先將參數(shù)在堆棧中進(jìn)行依次壓入,當(dāng)調(diào)用程序被啟用,此時(shí)堆棧中被壓入的參數(shù)再依次彈出,轉(zhuǎn)變?yōu)椴僮鲾?shù),以備使用.
因此,要使參數(shù)有效傳遞,需要對(duì)計(jì)算機(jī)不同語(yǔ)言所具有的生成方式、堆棧結(jié)構(gòu)及其參數(shù)入棧方式加以明確.Pascal、Fortran、Basic等高級(jí)語(yǔ)言在參數(shù)入棧的順序上和參數(shù)表中參數(shù)的順序相一致,也就是采用自左至右的方式,C語(yǔ)言在參數(shù)入棧順序上則采取自右至左的相反順序.
Pascal語(yǔ)言作為一種計(jì)算機(jī)高級(jí)語(yǔ)言,可將匯編語(yǔ)言看做是其外部過(guò)程,匯編語(yǔ)言在寫法上與外部調(diào)用過(guò)程相同,在進(jìn)行匯編語(yǔ)言程序編寫時(shí),首先要有公共程序名稱,即public procedure name.在對(duì)程序段進(jìn)行定義編寫時(shí),要采用public組合型加以說(shuō)明解釋,程序運(yùn)行結(jié)束后,在返回上采用ret指令,又因?yàn)閰?shù)傳遞時(shí)采用的是堆棧方式,因此,在程序返回處理時(shí),通常要使返回指令帶有常數(shù),這樣即可越過(guò)參數(shù)區(qū).
除了調(diào)用匯編語(yǔ)言過(guò)程之外,Pascal語(yǔ)言還要對(duì)過(guò)程的定義加以解決.在對(duì)調(diào)用過(guò)程進(jìn)行定義時(shí),可以使用語(yǔ)句$include:’name’,在這一語(yǔ)句中,文件名為 name,以 name作為Pascal語(yǔ)言調(diào)用函數(shù)或過(guò)程名,此時(shí)對(duì)程序進(jìn)行編譯時(shí),include語(yǔ)句如碰到編譯程序,編譯程序就能夠?qū)ascal語(yǔ)言文件加以編譯處理.
在對(duì)匯編語(yǔ)言進(jìn)行調(diào)用時(shí),Pascal程序可以根據(jù)參數(shù)順序依次將變量壓入堆棧,在堆棧中變量以字作為單位,并將段地址及偏移地址加以保存,Pascal程序中的參數(shù)獲取借助BP寄存器得以實(shí)現(xiàn).
3.2.1 C語(yǔ)言程序中匯編碼集成方法
與Pascal語(yǔ)言與匯編語(yǔ)言間的關(guān)系相同,C語(yǔ)言與匯編語(yǔ)言連接時(shí),匯編程序也是以外部過(guò)程的形式存在,然后借助函數(shù)及過(guò)程,C語(yǔ)言達(dá)到對(duì)匯編語(yǔ)言程序進(jìn)行調(diào)用的目的.一般而言,在混合編程過(guò)程中,C語(yǔ)言與匯編語(yǔ)言的混編方法有以下兩種:
3.2.1.1 將匯編程序從C語(yǔ)言中直接加以調(diào)用
如混編過(guò)程中需要多次使用匯編代碼時(shí),較常采用此方法.該方法的實(shí)現(xiàn)過(guò)程主要分為以下幾步:將匯編子程序進(jìn)行編寫,使其具備特定功能;采用C函數(shù)的形式,將匯編子程序從C程序中加以調(diào)用.在這一過(guò)程中,尤其應(yīng)注意以下幾個(gè)要點(diǎn):①采用C函數(shù)形式對(duì)匯編子程序進(jìn)行調(diào)用時(shí),需要對(duì)函數(shù)加以顯式說(shuō)明,主要通過(guò)將“Extern”作為C程序中的關(guān)鍵字這一方式實(shí)現(xiàn);②存儲(chǔ)模式如不同,則匯編語(yǔ)言在格式上也要加以區(qū)別,例如,小模式下的C程序,需要采用近過(guò)程進(jìn)行匯編,相應(yīng)地,大模式下的C程序,就應(yīng)采用遠(yuǎn)過(guò)程進(jìn)行匯編;③在參數(shù)獲取中,由于遠(yuǎn)過(guò)程匯編方式下,其返回地址需要占用四個(gè)字節(jié),而在借助BP寄存器進(jìn)行參數(shù)壓入時(shí),這一過(guò)程又需要占用二個(gè)字節(jié),因此,遠(yuǎn)過(guò)程匯編方式下,要從BP+6對(duì)應(yīng)的單元來(lái)獲取首個(gè)參數(shù).在近過(guò)程匯編方式下,從BP+4對(duì)應(yīng)的單元獲取首個(gè)參數(shù);④BP寄存器在匯編程序中的保護(hù)問(wèn)題.在子過(guò)程變量的存放上,Turbo C對(duì)DI及SI存放方式不加阻攔,而當(dāng)兩個(gè)或兩個(gè)以上的變量存入BP寄存器中時(shí),BP寄存器會(huì)將多出的變量部分轉(zhuǎn)移到堆棧中加以存儲(chǔ).這一匯編過(guò)程可以用以下程序加以說(shuō)明:
⑤返回值問(wèn)題.C數(shù)據(jù)在返回位置上,每個(gè)數(shù)據(jù)類型都占有一個(gè)標(biāo)準(zhǔn),通常具有極小模式、小模式、中模式(AX)及緊湊模式、大模式、巨模式(DX:AX),以AX為返回值位置的數(shù)據(jù)類型有char;enum;unsigned char;short int,這些數(shù)據(jù)類型的返回?cái)?shù)據(jù)要在RET指令前加以放置.采用遠(yuǎn)過(guò)程定義匯編子程序,在過(guò)程名上要借助PUBLIC偽指令,將其作公共類型定義.下面用實(shí)例加以說(shuō)明:
為更為全面地對(duì)此連接方法加以說(shuō)明,可再列舉一個(gè)實(shí)例.例如,在計(jì)算機(jī)中將兩個(gè)整型數(shù)據(jù)鍵入,并將整型數(shù)據(jù)之間的差加以顯示.數(shù)據(jù)的鍵入及顯示部分采用C語(yǔ)言編寫,而數(shù)據(jù)之差采用匯編語(yǔ)言編寫.此實(shí)例的程序編寫如下所示:
3.2.1.2 內(nèi)聯(lián)匯編
內(nèi)聯(lián)匯編的方法指的是在C語(yǔ)言程序中直接插入?yún)R編語(yǔ)言的代碼,因此,也被稱為嵌入式匯編方法,C語(yǔ)言編譯器基本都支持此方法.內(nèi)聯(lián)匯編的連接方式主要是借助“asm”這一C語(yǔ)言中的關(guān)鍵字加以實(shí)現(xiàn),將匯編語(yǔ)言的代碼直接放置在asm之后,此時(shí)再通過(guò)C語(yǔ)言編譯程序?qū)崿F(xiàn)匯編指令的傳送及匯編步驟.內(nèi)聯(lián)匯編具有簡(jiǎn)單直接等特點(diǎn),無(wú)須考慮參數(shù)傳遞及外鏈命名等方面,但涉及到對(duì)不同的目標(biāo)平臺(tái)加以編譯時(shí),內(nèi)聯(lián)匯編的方法就不具備可移植性.下面列舉相關(guān)實(shí)例:
結(jié)合這一實(shí)例,在內(nèi)聯(lián)匯編中,要注意以下幾個(gè)要點(diǎn):①匯編語(yǔ)言的代碼應(yīng)將C語(yǔ)言變量進(jìn)行初始化后再加以使用,在匯編類型上要用ptr加以指示;②C語(yǔ)言以分號(hào)結(jié)束語(yǔ)句,匯編語(yǔ)言結(jié)束語(yǔ)句采用換行時(shí),此時(shí)嵌入C語(yǔ)言程序中的匯編指令可以不用分號(hào)(;)結(jié)束;③采用C語(yǔ)言中的return指令進(jìn)行返回,而不是按照asm中的ret指令;④C程序中不能嵌入偽指令,如DW,DB等;⑤宏指令及宏操作符也不能嵌入C程序,如ENDM,IRP,MACRO,%,,&等.
3.2.2 C語(yǔ)言程序和匯編子程序間的連接
集成環(huán)境下,如對(duì)由C語(yǔ)言及匯編語(yǔ)言混編而成的程序加以編譯及連接,首先要采用MASM.EXE這一宏匯編方式對(duì)匯編語(yǔ)言加以編譯,得到OBJ格式文件.在生成OBJ文件后,將其嵌入C語(yǔ)言程序中,經(jīng)連接后,即可得到EXE文件.在C語(yǔ)言程序中嵌入OBJ文件的步驟為:于Turbo C中編輯格式為*.Prj的工程文件,以文件名列表,作為文件內(nèi)容,如mymasm.obj等;選擇project name這一位于project中的選項(xiàng),然后采用(*)格式鍵入工程文件的名稱,即可實(shí)現(xiàn)C語(yǔ)言程序與匯編子程序間的連接[5].
不同計(jì)算機(jī)語(yǔ)言混合編程能夠?qū)崿F(xiàn)語(yǔ)言間的調(diào)用,借助參數(shù)傳遞,一方面充分利用了匯編語(yǔ)言的優(yōu)勢(shì),另一方面又為諸如C程序等計(jì)算機(jī)高級(jí)語(yǔ)言性能的發(fā)揮提供了空間,在社會(huì)各行業(yè)的計(jì)算機(jī)軟件研發(fā)中,多語(yǔ)言混合編程已顯示出其重要價(jià)值.本文主要對(duì)Pascal語(yǔ)言、C語(yǔ)言與匯編語(yǔ)言的連接方法進(jìn)行了闡述,希望為計(jì)算機(jī)語(yǔ)言接口技術(shù)的深入研究提供借鑒參考.
〔1〕周謐.C/C++與FORTRAN混合編程技術(shù)及其應(yīng)用研究[J].科技創(chuàng)新與應(yīng)用,2015(13):76.
〔2〕張喆,鄭賓.基于N I TestStand的多語(yǔ)言混合編程技術(shù)研究[J].電子測(cè)試,2012(11):78-83.
〔3〕孟祥娜.匯編語(yǔ)言與C語(yǔ)言混合編程方法探討[J].電腦編程技巧與維護(hù),2014(22):26-27.
〔4〕王茹.ARM匯編語(yǔ)言與C/C++語(yǔ)言混合編程實(shí)現(xiàn)方法[J].電大理工,2012(2):27-29.
〔5〕金微.匯編語(yǔ)言與C語(yǔ)言混合編程的接口技術(shù)[J].無(wú)線互聯(lián)科技,2013(9):109+111.