版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 ARM C程序開發(fā),在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均用匯編語言來完成,其工作量是可想而知的,同時(shí),不利于系統(tǒng)升級(jí)或應(yīng)用軟件移植。 事實(shí)上,ARM體系結(jié)構(gòu)支持C/C+以及與匯編語言的混合編程,在一個(gè)完整的程序設(shè)計(jì)中,除了初始化部分用匯編語言完成以外,其主要的編程任務(wù)一般都用C/C+完成。,匯編語言與C/C+的混合編程通常有以下幾種方式: 在C/C+代碼中嵌入?yún)R編指令; 在匯編程序和C/C+的程序之間進(jìn)行變量的互訪; 匯編程序、C/C+程序間的相互調(diào)用。,Semihosting 在ADS的C語言函數(shù)庫中,某些ANSI C的功能是由主機(jī)的調(diào)試環(huán)境來提供的,這套機(jī)制有一個(gè)專門術(shù)語叫S
2、emihosting。Semihosting通過一組軟件中斷(SWI)指令來實(shí)現(xiàn)。 當(dāng)一個(gè)Semihosting軟中斷被執(zhí)行時(shí),調(diào)試系統(tǒng)先識(shí)別這個(gè)SWI請(qǐng)求,然后掛起正在運(yùn)行的程序,調(diào)用Semihosting的服務(wù),完成后再恢復(fù)原來的程序執(zhí)行。因此,主機(jī)執(zhí)行的任務(wù)對(duì)于程序來說是透明的。,4.1 C語言內(nèi)嵌匯編語言程序開發(fā),在C程序中嵌入?yún)R編程序,可以實(shí)現(xiàn)一些高級(jí)語言所沒有的功能,提高程序執(zhí)行效率。 armcc編譯器的內(nèi)嵌匯編器支持ARM指令集,tcc編譯器的內(nèi)嵌匯編器支持Thumb指令集。 1. 內(nèi)嵌匯編的語法 _asm 指令;指令 *注釋* 指令 ,4.1.1 內(nèi)嵌匯編的指令用法,(1) 操
3、作數(shù) 內(nèi)嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C表達(dá)式。 這些表達(dá)式可以是char、short或int類型,而且這些表達(dá)式都是作為無符號(hào)數(shù)進(jìn)行操作。 若需要有符號(hào)數(shù),用戶需要自己處理與符號(hào)有關(guān)的操作。 編譯器將會(huì)計(jì)算這些表達(dá)式的值,并為其分配寄存器。,(2) 物理寄存器 內(nèi)嵌匯編中使用物理寄存器有以下限制: 不能直接向PC寄存器賦值,程序跳轉(zhuǎn)只能使用B或BL指令實(shí)現(xiàn)。 使用物理寄存器的指令中,不要使用過于復(fù)雜的C表達(dá)式。因?yàn)楸磉_(dá)式過于復(fù)雜時(shí),將會(huì)需要較多的物理寄存器。這些寄存器可能與指令中的物理寄存器在使用時(shí)發(fā)生沖突。 編譯器可能會(huì)使用R12或R13存放編譯的中間結(jié)果。在計(jì)算表達(dá)式的值時(shí)
4、可能會(huì)將寄存器R0R3、R12和R14用于子程序調(diào)用。因此,在內(nèi)嵌的匯編指令中,不要將這些寄存器同時(shí)指定為指令中的物理存儲(chǔ)器。 通常內(nèi)嵌的匯編指令中不要指定物理寄存器,因?yàn)檫@可能會(huì)影響編譯器分配寄存器,進(jìn)而影響代碼的效率。,(3) 常量。在內(nèi)嵌匯編指令中,常量前面的“#”可以省略。 (4) 指令展開。內(nèi)嵌的匯編指令中,如果包含常量操作數(shù),則該指令有可能被內(nèi)嵌匯編器展開成幾條指令。 (5) 標(biāo)號(hào)。C程序中的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用。但是只有指令B可以使用C程序中的標(biāo)號(hào),而指令BL則不能使用。 (6) 內(nèi)存單元的分配。所有的內(nèi)存分配均由C編譯器完成,分配的內(nèi)存單元通過變量供內(nèi)嵌匯編器使用。內(nèi)嵌
5、匯編器不支持內(nèi)嵌匯編程序中用于內(nèi)存分配的偽指令。,內(nèi)嵌匯編器不支持通過“.”指示符或PC獲取當(dāng)前指令地址; 不支持“LDR Rn,expr”偽指令,而使用“MOV Rn,expr”指令向寄存器賦值; 不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令; 不支持BX指令; 不能向PC賦值。 當(dāng)使用8位移位常數(shù)導(dǎo)致CPSR的ALU標(biāo)志更新時(shí),N、Z、C和V標(biāo)志中的C不具有真實(shí)意義。,4.1.2 內(nèi)嵌匯編器與armasm匯編器的差異,4.1.3 內(nèi)嵌匯編注意事項(xiàng),(1)必須小心使用物理寄存器. 如R0R3、PC、LR和CPSR中的N、Z、C和V標(biāo)志位,因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時(shí),可能會(huì)使用這些物理寄
6、存器,并會(huì)修改N、Z、C和V 標(biāo)志位。 例如: _asm MOVS var,x ADDNE y,var,x/y 計(jì)算x/y時(shí)CPSR會(huì)被修改。內(nèi)嵌匯編器探測(cè)到隱含的寄存器沖突就會(huì)報(bào)錯(cuò)。,(2)不要使用寄存器代替變量。 盡管有時(shí)寄存器明顯對(duì)應(yīng)某個(gè)變量,但也不能直接使用寄存器代替變量。 例如: int bad_f(int x) / x存放在R0中 _asm ADD R0,R0,#1 /發(fā)生寄存器沖 突,實(shí)際上x的值并沒有變化 return(x); ,盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對(duì)應(yīng)x,但這樣的代碼會(huì)使內(nèi)嵌匯編器認(rèn)為發(fā)生了寄存器沖突。 用其它寄存器代替R0存放參數(shù)x,使得該函數(shù)將x原封不
7、動(dòng)地返回。 這段代碼的正確寫法如下: int bad_f(int x) _asm ADD x,x,#1 return(x); ,(3) 使用內(nèi)嵌式匯編無需保存和恢復(fù)寄存器。 事實(shí)上,除了CPSR和SPSR寄存器,對(duì)物理寄存器先讀后寫都會(huì)引起匯編器報(bào)錯(cuò)。 例如: int f(int x) _asm STMFD SP!,R0 /保存R0。先讀后寫,匯 編出錯(cuò) ADD R0,x,1 EOR x,R0,x LDMFD SP!,R0 return(x); ,(4)LDM和STM指令的寄存器列表中只允許使用物理寄存器。 內(nèi)嵌匯編可以修改處理器模式、協(xié)處理器模式以及FP、SL、SB等APCS寄存器。但是編譯
8、器在編譯時(shí)并不了解這些變化,因此必須保證在執(zhí)行C代碼前恢復(fù)相應(yīng)被修改的處理器模式。,(5) 匯編語言中的“,”號(hào)作為操作數(shù)分隔符。 如果有C表達(dá)式作為操作數(shù),若表達(dá)式中包含有“,”,則必須使用符號(hào)“(”和“)”將其歸約為一個(gè)匯編操作數(shù)。 例如: _asm ADD x,y,(f(),z) /“f(),z”為一個(gè)帶有“,” 的C表達(dá)式 ,4.1.4 例子,例4-1 #include int main() printf(Hello,ARM C world!n); return 0; ,例4-2 #include int main() int i,j; printf(please input i,j:
9、n); scanf(%d,%d, ,例4-3 字符串到數(shù)組的復(fù)制 #include void my_strcpy(const char * src, char * dst) int ch; _asm LOOP: LDRBch,src,#1 STRBch,dst,#1 CMPch,#0 BNELOOP ,int main() const char *a = Hello,World!; char b20; my_strcpy(a,b); printf(Original String: %sn,a); printf(Copied String: %sn,b); return 0; ,例4-4 使能禁能IRQ中斷 _inline void enable_IRQ(void) int tmp; _asm /嵌入?yún)R編代碼 MRS tmp,CPSR /讀取CPSR的值 BIC tmp,tmp,#0 x80 MSR CPSR_c,tmp ,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生行政部門各項(xiàng)制度
- 早教衛(wèi)生檢查制度
- 校園教學(xué)衛(wèi)生制度
- 小學(xué)清潔衛(wèi)生曝光制度
- 舞蹈學(xué)校衛(wèi)生清潔制度
- 藥店衛(wèi)生規(guī)章制度
- 鎮(zhèn)區(qū)衛(wèi)生檢查制度
- 衛(wèi)生健康工作責(zé)任制度
- 醫(yī)院愛國(guó)衛(wèi)生各種制度
- 食堂衛(wèi)生賠償制度
- 2025ACCP實(shí)踐指南:危重患者血漿與血小板輸注指南解讀
- 【語文】遼寧省沈陽市沈河區(qū)文化路小學(xué)小學(xué)一年級(jí)下冊(cè)期末試卷(含答案)
- 新生兒紅臀PDCA課件
- 企業(yè)風(fēng)險(xiǎn)預(yù)警指標(biāo)體系設(shè)計(jì)與應(yīng)用
- 2025-2026學(xué)年江蘇省連云港市部分學(xué)校高三上學(xué)期10月月考?xì)v史試題(解析版)
- 道路交通安全警示教育培訓(xùn)
- 獸藥使用法律法規(guī)學(xué)習(xí)材料
- 記賬實(shí)操-村會(huì)計(jì)賬務(wù)處理分錄SOP
- 市政工程述職報(bào)告
- 公文寫作實(shí)例培訓(xùn)
- 2026年中考語文一輪復(fù)習(xí):統(tǒng)編教材古詩詞曲鑒賞85篇 常考必背知識(shí)點(diǎn)匯編
評(píng)論
0/150
提交評(píng)論