資源描述:
《C及匯編語言的混合編程.ppt》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、7.1ARMC/C++編譯器7.2在C/C++程序中內(nèi)嵌匯編指令7.3從匯編程序中訪問C程序變量7.4匯編程序、C程序及C++程序相互調(diào)用7.5嵌入式C編程第七講C/C++及匯編語言的混合編程17.1ARMC/C++編譯器ARM集成開發(fā)環(huán)境中包含的C/C++編譯器:編譯器名稱編譯器種類源文件類型源文件后綴輸出目標(biāo)文件類型armccCC*.C32位ARM代碼tccCC*.C16位Thumb代碼armcppC++C/C++*.C/*.C++32位ARM代碼tcppC++C/C++*.C/*.C++16位Thumb代碼27.2在C/C++程序中內(nèi)嵌匯編指令在C
2、C++程序中使用內(nèi)嵌的匯編指令的語法格式:在ARMC語言程序中,使用關(guān)鍵字__asm來標(biāo)識一段匯編指令程序。__asm{匯編語言程序~~~~~~~~匯編語言程序}其中:如果一行中有多個匯編指令,指令之間使用分號(;)分開。在一條指令占多行,要使用續(xù)行符號().37.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項:必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標(biāo)志位.因為計算匯編代碼中的C表達(dá)式時,可能會使用這些物理寄存器,并會修改N,Z,C,V標(biāo)志位。__asm{MOVR0,xADDy,R0,x/
3、y//計算x/y時R0會被修改}在計算x/y時R0會被修改,從而影響R0+x/y的結(jié)果.47.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項:用一個C程序的變量代替R0就可以解決這個問題:__asm{MOVvar,xADDy,var,x/y}注意:內(nèi)嵌匯編器探測到隱含的寄存器沖突就會報錯.57.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項:不要使用寄存器代替變量.盡管有時寄存器明顯對應(yīng)某個變量,但也不能直接使用寄存器代替變量.intbad_f(intx)//x存放在R0中{__asm{ADDR0,R0,#
4、1//發(fā)生寄存器沖突,實際上x的值沒有變化}return(x);}盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對應(yīng)x,但這樣的代碼會使內(nèi)嵌匯編器認(rèn)為發(fā)生了寄存器沖突.67.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項:這段代碼的正確寫法如下:intbad_f(intx){__asm{ADDx,x,#1}return(x);}77.3從匯編程序中訪問C程序變量在C程序中聲明的全局變量可以被匯編程序通過地址間接訪問。具體訪問方法如下:使用IMPORT偽指令聲明這個全局變量。使用LDR指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址
5、存放在程序的數(shù)據(jù)緩沖池中。根據(jù)該數(shù)據(jù)類型,使用相應(yīng)的LDR指令讀取該全局變量的值;使用相應(yīng)的STR指令修改該全局變量的值。87.3從匯編程序中訪問C程序變量例如:C語言源程序str.c如下:#includeintglobvar=3;//定義一個整型全局變量intmain(){return0;}97.3從匯編程序中訪問C程序變量例如:匯編源文件hello.s:AREAglobals,CODE,READONLYEXPORTasmsubIMPORTglobvar;聲明外部變量globvarasmsubLDRR1,=globvar;裝載變量地址
6、LDRR0,[R1];讀出數(shù)據(jù)ADDR0,R0,#2;修改R0的值STRR0,[R1];保存變量值MOVPC,LREND10C程序與匯編程序互相調(diào)用規(guī)則寄存器的使用規(guī)則子程序間通過寄存器R0~R3來傳遞參數(shù)。在子程序中,使用寄存器R4~R11來保存局部變量。寄存器R12用于子程序間scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出桟),記作IP。寄存器R13用于數(shù)據(jù)棧指針,記作SP。寄存器SP在進(jìn)入子程序時的值和退出子程序時的值必須相等。寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。寄存器R15是程序計數(shù)器,記作PC11A
7、TPCS中各寄存器的使用規(guī)則及其名稱12ATPCS中各寄存器的使用規(guī)則及其名稱參數(shù)傳遞規(guī)則參數(shù)不超過4個時,可以使用寄存器R0~R3來傳遞參數(shù),當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)。結(jié)果為一個32位整數(shù)時,可以通過寄存器R0返回結(jié)果為一個64位整數(shù)時,可以通過寄存器R0和R1返回,依次類推。137.4匯編程序、C程序及C++程序相互調(diào)用C程序調(diào)用匯編程序:匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時參數(shù)的正確傳遞。在匯編程序中使用EXPORT偽指令聲明本子程序,使其它程序可以調(diào)用此子程序。在C語言程序中使用extern關(guān)鍵字聲明外部函數(shù)(聲
8、明要調(diào)用的匯編子程序),即可調(diào)用此匯編子程序。14C程序調(diào)用匯編程序(調(diào)用匯編的