資源描述:
《arm9匯編語言與cc++語言的混合編程》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、ARM9匯編語言與C/C++語言的混合編程ARM體系結(jié)構(gòu)支持ARM的匯編語言與C/C++語言的混合編程。在一個項目中,至少有一個匯編源文件或C/C++語言文件,可以有多個匯編文件或多個C/C++程序文件,或者C/C++程序文件和匯編文件兩者的組合。一般地,ARM源程序文件名的后綴如表4.2所示。表4.2ARM源文件類型及擴展名文件類型擴展名匯編引入文件.INC匯編源文件.SC/C++頭文件.HC語言源文件.CC++源文件.CPP硅谷芯微嵌入式學院技術(shù)貢獻官方網(wǎng)址:www.threeway.cc一般來講,在設(shè)計一個完整的嵌入式程序中,除了初始化部分用匯編
2、語言完成外,其大部分的編程任務(wù)一般都用C/C++完成。當需要C/C++與匯編混合編程時,可以有以下兩種處理策略:■若匯編代碼較短,則可在C/C++源文件中直接內(nèi)嵌匯編語言實現(xiàn)混合編程。■若匯編代碼較長,可以單獨寫成匯編文件,最后以匯編文件的形式加入項目中,通過ATPCS規(guī)定與C程序相互調(diào)用及訪問。ATPCS,即ARM/Thumb過程調(diào)用標準(ARM/ThumbProcedureCallStandard),它規(guī)定了一些子程序間調(diào)用的基本規(guī)則,如子程序調(diào)用過程中的寄存器的使用規(guī)則、堆棧的使用規(guī)則、參數(shù)的傳遞規(guī)則等。本節(jié)討論混合編程的相關(guān)技術(shù),將其分為以下3
3、個方面:■內(nèi)嵌匯編語言指令?!鰠R編與C/C++程序的變量相互訪問?!鰠R編與C/C++程序的函數(shù)相互調(diào)用。?4.3.1內(nèi)嵌匯編語言指令用C/C++程序嵌入?yún)R編程序中可以實現(xiàn)一些高級語言沒有的功能,提高程序執(zhí)行效率。Armcc編譯器的內(nèi)嵌匯編器支持ARM指令集,tcc編譯器的內(nèi)嵌匯編器支持Thumb指令集。?4.3.1.1內(nèi)嵌匯編指令的語法格式在ARM的C語言程序中可以使用關(guān)鍵字__asm來加入一段匯編語言的程序,格式如下:__asm{指令[;指令]/*注釋*/...[指令]}其中,{}中的指令都為匯編指令,一行允許寫多條匯編指令語句,指令語句之間要用分號
4、隔開。在匯編指令段中,注釋語句采用C語言的注釋格式。ARMC++程序中除了可以使用關(guān)鍵字__asm來標識一段內(nèi)嵌匯編指令程序外,還可以使用關(guān)鍵詞asm來表示一段內(nèi)嵌匯編指令,格式如下:asm("指令");/*注釋*/其中,asm后面的括號中必須是一條匯編指令語句,并且不能包含注釋語句。?4.3.1.2內(nèi)嵌匯編指令的應(yīng)用舉例(1)本小節(jié)通過一個例子幫助讀者理解內(nèi)嵌匯編指令的用法。本例介紹如何利用內(nèi)嵌的匯編指令實現(xiàn)使能中斷和禁止中斷。使能和禁止中斷IRQ是通過修改CPSR寄存器中的位7完成的。因為用C語言無法修改寄存器CPSR的值,所以這些操作必須借助匯編
5、語句完成。例34使能/禁止中斷采用內(nèi)嵌匯編指令來實現(xiàn)。?4.3.1.2內(nèi)嵌匯編指令的應(yīng)用舉例(2)例34使能/禁止中斷采用內(nèi)嵌匯編指令來實現(xiàn)。voidenable_IRQ(void)//使能中斷程序{inttmp;//定義臨時變量,后面使用__asm//內(nèi)嵌匯編程序的關(guān)鍵詞{MRStmp,CPSR//把狀態(tài)寄存器加載給tmpBICtmp,tmp,#80//將IRQ控制位清0MSRCPSR_c,tmp//加載程序狀態(tài)寄存器}}voiddisable_IRQ(void)//禁止中斷程序{inttmp;//定義臨時變量,后面使用__asm//內(nèi)嵌匯編程序的關(guān)
6、鍵詞{MRStmp,CPSR//把狀態(tài)寄存器加載給tmpORRtmp,tmp,#80//將IRQ控制位置1MSRCPSR_c,tmp//加載程序狀態(tài)寄存器}}?4.3.1.3內(nèi)嵌匯編注意事項(1)后綴.S文件中的匯編指令是用armasm匯編器進行匯編的,而C語言程序中的內(nèi)嵌匯編指令則是用內(nèi)嵌匯編器進行匯編的。這兩種匯編器存在一定的差異,所以在內(nèi)嵌匯編時要注意以下幾點:(1)必須小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V標志位。因為計算匯編代碼中的C表達式時,可能使用這些物理寄存器,并會修改N、Z、C、V
7、標志位。例35實現(xiàn)y=x+x/y。__asm{MOVR0,x//把x的值給R0ADDy,R0,x/y//計算x/y時R0的值會被修改}?4.3.1.3內(nèi)嵌匯編注意事項(2)在計算x/y時R0會被修改,從而影響R0+x/y的結(jié)果。內(nèi)嵌匯編程序中允許使用變量,用變量來代替寄存器R0可以解決上述問題。__asm{MOVvar,x//把x的值給R0ADDy,var,x/y//計算x/y時R0的值會被修改}這時內(nèi)嵌匯編器將會為變量var分配合適的存儲單元,從而避免沖突的發(fā)生。如果內(nèi)嵌匯編器不能分配合適的存儲單元,它將會報告錯誤。?4.3.1.3內(nèi)嵌匯編注意事項(
8、3)(2)不要使用寄存器代替變量。盡管有時寄存器明顯對應(yīng)某個變量,但也不能直接使用寄存器代替變