基于TMS320C62X DSP的混合編程研究
1 C語言與匯編語言混合編程的接口規(guī)范和標(biāo)準(zhǔn)
用C語言編寫的代碼中核心代碼常常只是整個程序代碼的5%,但是卻占用了整個程序約95%的執(zhí)行時間。對這些核心代碼采用匯編語言編寫,可以大大提高代碼的執(zhí)行效率,而C語言程序可以象調(diào)用C程序的一個函數(shù)那樣去調(diào)用這個匯編函數(shù)。為了實現(xiàn)C語言和匯編語言的混合編程,需要注意一些規(guī)定的接口規(guī)范和標(biāo)準(zhǔn)。
(1)采用C語言和匯編語言混合編程時,TMS320C62X定義了一套嚴(yán)格的寄存器規(guī)則。這個寄存器規(guī)則表明了編譯器如何使用這些寄存器以及在函數(shù)調(diào)用過程中如何保護(hù)這些寄存器。
調(diào)用函數(shù)保護(hù)了寄存器A0~A9和B0~B9,這就使得在編寫匯編程序的時候可以任意的使用這幾個寄存器而不需保護(hù)它們。但當(dāng)使用到寄存器A10~A15或B10~B15的時候,則必須自行對它們進(jìn)行保護(hù)。長型、雙精度型或者是長雙精度型的數(shù)據(jù)對象要放在一個奇/偶寄存器對(如A1:A0)里,奇數(shù)寄存器存放著數(shù)據(jù)的符號位、指數(shù)位和最高有效位,而偶數(shù)寄存器則存放著低有效位。
在默認(rèn)情況下,A3用作返回結(jié)構(gòu)指針寄存器,B3用作被調(diào)用函數(shù)返回地址寄存器,A15用作幀指針寄存器,B14用作數(shù)據(jù)頁指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調(diào)用的匯編函數(shù)中用到時都要進(jìn)行保護(hù)。
(2)調(diào)用函數(shù)將參數(shù)傳遞到被調(diào)用函數(shù)中,前十個參數(shù)將被從左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果傳遞的參數(shù)是長型、雙精度型或者是長雙精度型,則將參數(shù)依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數(shù)是一個結(jié)構(gòu)類型的參數(shù),則傳遞的是該結(jié)構(gòu)類型的地址。
(3)如果在C/C++調(diào)用函數(shù)中做了正確的函數(shù)返回聲明,則被調(diào)用的匯編函數(shù)可以返回有效值。如果返回值是整型或32位的浮點型,則放在寄存器A4中返回;如果返回值是雙精度或是長雙精度型,則放在A5:A4中返回;如果返回值是一個結(jié)構(gòu)類型,則將其結(jié)構(gòu)的地址放在A3中返回。
(4)編譯器為所有的外部對象指定一個鏈接時的名字。當(dāng)寫匯編語言代碼時,必須用與這個名字相同的名字。對于只在匯編語言模塊中用到的變量的標(biāo)識符,不能從下劃線開始。任何一個在匯編語言中聲明的對象都要使其在C/C++中是可訪問的,那么在匯編語言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語言中要引用C/C++函數(shù)或?qū)ο髸r,必須用.ref 或.global將C/C++對象聲明,這將產(chǎn)生一個在匯編語言函數(shù)中沒有定義的由鏈接器辨識的外部引用。
還有一些細(xì)節(jié)也需要注意,如中斷子程序必須把該子程序?qū)⒁玫降乃屑拇嫫鬟M(jìn)行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因為任何目的而使用.cinit段;匯編代碼的結(jié)束需用指令B.s2 B3將程序執(zhí)行從被調(diào)用函數(shù)返回到C語言調(diào)用函數(shù)中。
評論