編程語言與匯編語言混編
時間:2022-04-27 05:56:00
導語:編程語言與匯編語言混編一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
C語言是目前非常流行的一種編程語言,除具有高級語言使用方便靈活、數(shù)據(jù)處理能力強、編程簡單等優(yōu)點外:還可實現(xiàn)匯編語言的大部分功能,如可直接對硬件進行操作、生成的目標代碼質量較高等,而匯編語言沒有高級語言要占用較大的存儲空間和較長的運行時間等缺點,它的運行速度快是高級語言所不能比擬的,可以說高級語言與匯編語言各有千秋。目前c語言與匯編語言的混合編程在諸如對硬件的直接操作、中斷處理、快速執(zhí)行等場合有著廣泛的應用。但由于匯編語言在函數(shù)調用、參數(shù)傳遞、返回值及寄存器的使用等方面與C語言有很多的不同,所以在混合編程時應多考慮這些方面的設計技術問題。
一、變量與函數(shù)的相互調用
c語言可以調用匯編子程序和匯編語言中定義的變量。但要注意由于。編譯后的目標文件自動地在函數(shù)名和變量名前加一個下劃線,所以在匯編語言中調用C語言的函數(shù)和變量時,應在函數(shù)名和變量名前加一下劃線。在匯編語言程序開始部分,應對調用的函數(shù)和變量用EXTERN加以說明。
二、調用者與被調用者的參數(shù)傳遞
這種數(shù)據(jù)傳遞通過堆棧完成,在執(zhí)行調用時從調用程序參數(shù)表中的最后一個參數(shù)開始,即從右到左自動依次壓人堆棧;將所有參數(shù)壓人堆棧后,再自動將被調用程序執(zhí)行結束后的返回地址(斷點)壓人堆棧,以使被調程序結束后能返回主調程序的正確位置而繼續(xù)執(zhí)行。進人匯編子程序后,為了能正確獲取主調程序并存人堆棧中的數(shù)據(jù),被調的匯編子程序先后要做如下一些工作:
l、保存sp的副本進人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時刻在變化。為了能用SP訪問堆棧中的參數(shù),安全辦法是一進人子程序后,先為SP制副本,以后對傳遞參數(shù)的訪問都用副本進行。一般可用BP保存SP,如:pushbPmovbP,sp
2、保留數(shù)據(jù)空間如果匯編子程序中需要一些局部數(shù)據(jù),可以簡單地減小SP的值,以便在棧空間中保留出一段存貯區(qū),用于存放局部數(shù)據(jù),該區(qū)域須在子程序結束后恢復。如下語句可以保留一個局部數(shù)據(jù)區(qū):pushbPmovbP,spsubsp,spaee;設spaee=4如上語句段中,SPACE是局部數(shù)據(jù)的總字節(jié)數(shù)。在以后的應用中,由于SP是變化的,而BP是固定的,用負偏移量可以存取局部變量。上例利用BP及偏移量,將兩個字的局部數(shù)據(jù)初始化為0。
3、保留寄存器值如果在被調子程序中用到sI、DI等其它寄存器,則應先把它們壓人堆棧,以保留寄存器原值。例如,下例就是將SI和DI寄存器的值壓棧:pushbpmoybp,SpsubSp,sPaeePush51Pushdi
4、獲取傳遞參數(shù)BP保留了SP在參數(shù)傳遞完并將BP壓棧后的一個副本,利用BP可以很方便地訪問各參數(shù)。現(xiàn)假設調用了名為funcl匯編程序模塊的主函數(shù):maln(){……fund(pl,pZ,p3);……}。各參數(shù)都是2字節(jié)的整數(shù)值,返回地址retumaddress,在小模式編譯方式共占用2個字節(jié)。如果要將傳遞的參數(shù)p卜pZ、p3取出,并分別賦給bx、Cx、dx寄存器,可由下列語句完成這一功能:movbx,[bp+4jmovcx,[bp+6]movdx,[bp+8〕
5、子程序返回值當子程序的執(zhí)行結果需要返回時,根據(jù)返回值的字長,c按如下約定接收返回值:1字節(jié)在AL寄存器中;2字節(jié)在Ax寄存器中;4字節(jié)則高位部分在Dx中、低位部分在Ax寄存器中。C可從這些寄存器中取出返回值。
6、退出匯編子程序結束匯編子程序的步驟如下:l〕若55、DS、51或nl已被壓棧,則需按保存它們的相反順序彈出它們。2〕若在過程開始時分配了局部數(shù)據(jù)空間,則以指令movsp,bp恢復sv。3]以指令p叩bp恢復bp,該步是必須的。4」最后以ret結束匯編程序。
- 上一篇:建筑給排水質量管控綜述
- 下一篇:藝術設計專業(yè)教育革新培養(yǎng)