C及匯編語言的混合編程.ppt

C及匯編語言的混合編程.ppt

ID:56527481

大?。?15.00 KB

頁數(shù):29頁

時(shí)間:2020-06-27

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

《C及匯編語言的混合編程.ppt》由會(huì)員上傳分享,免費(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)識(shí)一段匯編指令程序。__asm{匯編語言程序~~~~~~~~匯編語言程序}其中:如果一行中有多個(gè)匯編指令,指令之間使用分號(hào)(;)分開。在一條指令占多行,要使用續(xù)行符號(hào)().37.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標(biāo)志位.因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時(shí),可能會(huì)使用這些物理寄存器,并會(huì)修改N,Z,C,V標(biāo)志位。__asm{MOVR0,xADDy,R0,x/

3、y//計(jì)算x/y時(shí)R0會(huì)被修改}在計(jì)算x/y時(shí)R0會(huì)被修改,從而影響R0+x/y的結(jié)果.47.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):用一個(gè)C程序的變量代替R0就可以解決這個(gè)問題:__asm{MOVvar,xADDy,var,x/y}注意:內(nèi)嵌匯編器探測到隱含的寄存器沖突就會(huì)報(bào)錯(cuò).57.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):不要使用寄存器代替變量.盡管有時(shí)寄存器明顯對應(yīng)某個(gè)變量,但也不能直接使用寄存器代替變量.intbad_f(intx)//x存放在R0中{__asm{ADDR0,R0,#

4、1//發(fā)生寄存器沖突,實(shí)際上x的值沒有變化}return(x);}盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對應(yīng)x,但這樣的代碼會(huì)使內(nèi)嵌匯編器認(rèn)為發(fā)生了寄存器沖突.67.2在C/C++程序中內(nèi)嵌匯編指令在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):這段代碼的正確寫法如下:intbad_f(intx){__asm{ADDx,x,#1}return(x);}77.3從匯編程序中訪問C程序變量在C程序中聲明的全局變量可以被匯編程序通過地址間接訪問。具體訪問方法如下:使用IMPORT偽指令聲明這個(gè)全局變量。使用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;//定義一個(gè)整型全局變量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ù)返回時(shí)使用該寄存器出桟),記作IP。寄存器R13用于數(shù)據(jù)棧指針,記作SP。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。寄存器R15是程序計(jì)數(shù)器,記作PC11A

7、TPCS中各寄存器的使用規(guī)則及其名稱12ATPCS中各寄存器的使用規(guī)則及其名稱參數(shù)傳遞規(guī)則參數(shù)不超過4個(gè)時(shí),可以使用寄存器R0~R3來傳遞參數(shù),當(dāng)參數(shù)超過4個(gè)時(shí),還可以使用數(shù)據(jù)棧來傳遞參數(shù)。結(jié)果為一個(gè)32位整數(shù)時(shí),可以通過寄存器R0返回結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過寄存器R0和R1返回,依次類推。137.4匯編程序、C程序及C++程序相互調(diào)用C程序調(diào)用匯編程序:匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時(shí)參數(shù)的正確傳遞。在匯編程序中使用EXPORT偽指令聲明本子程序,使其它程序可以調(diào)用此子程序。在C語言程序中使用extern關(guān)鍵字聲明外部函數(shù)(聲

8、明要調(diào)用的匯編子程序),即可調(diào)用此匯編子程序。14C程序調(diào)用匯編程序(調(diào)用匯編的

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

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

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