c及匯編語言的混合編程

c及匯編語言的混合編程

ID:21735307

大?。?47.50 KB

頁數(shù):29頁

時間:2018-10-20

c及匯編語言的混合編程_第1頁
c及匯編語言的混合編程_第2頁
c及匯編語言的混合編程_第3頁
c及匯編語言的混合編程_第4頁
c及匯編語言的混合編程_第5頁
資源描述:

《c及匯編語言的混合編程》由會員上傳分享,免費在線閱讀,更多相關(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++編譯器:編譯器名稱編譯器種類源文件類型源文件后綴輸出目標文件類型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)嵌匯編指令在CC

2、++程序中使用內(nèi)嵌的匯編指令的語法格式:在ARMC語言程序中,使用關(guān)鍵字__asm來標識一段匯編指令程序。__asm{匯編語言程序~~~~~~~~匯編語言程序}其中:如果一行中有多個匯編指令,指令之間使用分號(;)分開。在一條指令占多行,要使用續(xù)行符號().37.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項:必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標志位.因為計算匯編代碼中的C表達式時,可能會使用這些物理寄存器,并會修改N,Z,C,V標志位。__asm{MOVR0,xADDy,R0,x/y//計

3、算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,#1//發(fā)生寄

4、存器沖突,實際上x的值沒有變化}return(x);}盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對應(yīng)x,但這樣的代碼會使內(nèi)嵌匯編器認為發(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)存地址存放在程序的數(shù)據(jù)

5、緩沖池中。根據(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;裝載變量地址LDRR0,[R1]

6、;讀出數(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在進入子程序時的值和退出子程序時的值必須相等。寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。寄存器R15是程序計數(shù)器,記作PC11ATPCS中各寄存器的使用

7、規(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ù)(聲明要調(diào)用的匯編子程序),即可

8、調(diào)用此匯編子程序。14C程序調(diào)用匯編程序(調(diào)用匯編的

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。