編程語(yǔ)言與匯編語(yǔ)言混編

時(shí)間:2022-04-27 05:56:00

導(dǎo)語(yǔ):編程語(yǔ)言與匯編語(yǔ)言混編一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

編程語(yǔ)言與匯編語(yǔ)言混編

C語(yǔ)言是目前非常流行的一種編程語(yǔ)言,除具有高級(jí)語(yǔ)言使用方便靈活、數(shù)據(jù)處理能力強(qiáng)、編程簡(jiǎn)單等優(yōu)點(diǎn)外:還可實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,如可直接對(duì)硬件進(jìn)行操作、生成的目標(biāo)代碼質(zhì)量較高等,而匯編語(yǔ)言沒(méi)有高級(jí)語(yǔ)言要占用較大的存儲(chǔ)空間和較長(zhǎng)的運(yùn)行時(shí)間等缺點(diǎn),它的運(yùn)行速度快是高級(jí)語(yǔ)言所不能比擬的,可以說(shuō)高級(jí)語(yǔ)言與匯編語(yǔ)言各有千秋。目前c語(yǔ)言與匯編語(yǔ)言的混合編程在諸如對(duì)硬件的直接操作、中斷處理、快速執(zhí)行等場(chǎng)合有著廣泛的應(yīng)用。但由于匯編語(yǔ)言在函數(shù)調(diào)用、參數(shù)傳遞、返回值及寄存器的使用等方面與C語(yǔ)言有很多的不同,所以在混合編程時(shí)應(yīng)多考慮這些方面的設(shè)計(jì)技術(shù)問(wèn)題。

一、變量與函數(shù)的相互調(diào)用

c語(yǔ)言可以調(diào)用匯編子程序和匯編語(yǔ)言中定義的變量。但要注意由于。編譯后的目標(biāo)文件自動(dòng)地在函數(shù)名和變量名前加一個(gè)下劃線,所以在匯編語(yǔ)言中調(diào)用C語(yǔ)言的函數(shù)和變量時(shí),應(yīng)在函數(shù)名和變量名前加一下劃線。在匯編語(yǔ)言程序開(kāi)始部分,應(yīng)對(duì)調(diào)用的函數(shù)和變量用EXTERN加以說(shuō)明。

二、調(diào)用者與被調(diào)用者的參數(shù)傳遞

這種數(shù)據(jù)傳遞通過(guò)堆棧完成,在執(zhí)行調(diào)用時(shí)從調(diào)用程序參數(shù)表中的最后一個(gè)參數(shù)開(kāi)始,即從右到左自動(dòng)依次壓人堆棧;將所有參數(shù)壓人堆棧后,再自動(dòng)將被調(diào)用程序執(zhí)行結(jié)束后的返回地址(斷點(diǎn))壓人堆棧,以使被調(diào)程序結(jié)束后能返回主調(diào)程序的正確位置而繼續(xù)執(zhí)行。進(jìn)人匯編子程序后,為了能正確獲取主調(diào)程序并存人堆棧中的數(shù)據(jù),被調(diào)的匯編子程序先后要做如下一些工作:

l、保存sp的副本進(jìn)人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時(shí)刻在變化。為了能用SP訪問(wèn)堆棧中的參數(shù),安全辦法是一進(jìn)人子程序后,先為SP制副本,以后對(duì)傳遞參數(shù)的訪問(wèn)都用副本進(jìn)行。一般可用BP保存SP,如:pushbPmovbP,sp

2、保留數(shù)據(jù)空間如果匯編子程序中需要一些局部數(shù)據(jù),可以簡(jiǎn)單地減小SP的值,以便在棧空間中保留出一段存貯區(qū),用于存放局部數(shù)據(jù),該區(qū)域須在子程序結(jié)束后恢復(fù)。如下語(yǔ)句可以保留一個(gè)局部數(shù)據(jù)區(qū):pushbPmovbP,spsubsp,spaee;設(shè)spaee=4如上語(yǔ)句段中,SPACE是局部數(shù)據(jù)的總字節(jié)數(shù)。在以后的應(yīng)用中,由于SP是變化的,而B(niǎo)P是固定的,用負(fù)偏移量可以存取局部變量。上例利用BP及偏移量,將兩個(gè)字的局部數(shù)據(jù)初始化為0。

3、保留寄存器值如果在被調(diào)子程序中用到sI、DI等其它寄存器,則應(yīng)先把它們壓人堆棧,以保留寄存器原值。例如,下例就是將SI和DI寄存器的值壓棧:pushbpmoybp,SpsubSp,sPaeePush51Pushdi

4、獲取傳遞參數(shù)BP保留了SP在參數(shù)傳遞完并將BP壓棧后的一個(gè)副本,利用BP可以很方便地訪問(wèn)各參數(shù)。現(xiàn)假設(shè)調(diào)用了名為funcl匯編程序模塊的主函數(shù):maln(){……fund(pl,pZ,p3);……}。各參數(shù)都是2字節(jié)的整數(shù)值,返回地址retumaddress,在小模式編譯方式共占用2個(gè)字節(jié)。如果要將傳遞的參數(shù)p卜pZ、p3取出,并分別賦給bx、Cx、dx寄存器,可由下列語(yǔ)句完成這一功能:movbx,[bp+4jmovcx,[bp+6]movdx,[bp+8〕

5、子程序返回值當(dāng)子程序的執(zhí)行結(jié)果需要返回時(shí),根據(jù)返回值的字長(zhǎng),c按如下約定接收返回值:1字節(jié)在AL寄存器中;2字節(jié)在Ax寄存器中;4字節(jié)則高位部分在Dx中、低位部分在Ax寄存器中。C可從這些寄存器中取出返回值。

6、退出匯編子程序結(jié)束匯編子程序的步驟如下:l〕若55、DS、51或nl已被壓棧,則需按保存它們的相反順序彈出它們。2〕若在過(guò)程開(kāi)始時(shí)分配了局部數(shù)據(jù)空間,則以指令movsp,bp恢復(fù)sv。3]以指令p叩bp恢復(fù)bp,該步是必須的。4」最后以ret結(jié)束匯編程序。