



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ARM 中 C 語(yǔ)言和匯編語(yǔ)言混合編程在嵌入式系統(tǒng)開(kāi)發(fā)中,目前使用的主要編程語(yǔ)言是 C 和匯編,雖然 C+ 已經(jīng)有相應(yīng)的編譯器,但是現(xiàn)在使 用還是比較少的。在稍大規(guī)模的嵌入式程序設(shè)計(jì)中,大部分的代碼都是用 C 來(lái)編寫的,主要是因?yàn)?C 語(yǔ)言具有較強(qiáng)的結(jié)構(gòu) 性,便于人的理解,并且具有大量的庫(kù)支持。但對(duì)于一寫硬件上的操作,很多地方還是要用到匯編語(yǔ)言,例如 硬件系統(tǒng)的初始化中的 CPU 狀態(tài)的設(shè)定,中斷的使能,主頻的設(shè)定, RAM 控制參數(shù)等。另外在一些對(duì)性能 非常敏感的代碼塊,基于匯編與機(jī)器碼一一對(duì)應(yīng)的關(guān)系,這時(shí)不能依靠 C 編譯器的生成代碼,而要手工編寫 匯編,從而達(dá)到優(yōu)化的目的。匯編語(yǔ)言是和
2、CPU 的指令集緊密相連的,作為涉及底層的嵌入式系統(tǒng)開(kāi)發(fā),熟 練對(duì)應(yīng)匯編語(yǔ)言的使用也是必須的。單純的 C 或者匯編編程請(qǐng)參考相關(guān)的書籍或者手冊(cè),這里主要討論 C 和匯編的混合編程,包括相互之間 的函數(shù)調(diào)用。下面分四種情況來(lái)進(jìn)行討論,不涉及 C+ 語(yǔ)言。一、在 C 語(yǔ)言中內(nèi)嵌匯編在 C 中內(nèi)嵌的匯編指令包含大部分的 ARM 和 Thumb 指令,不過(guò)使用與單純的匯編程序使用的指令略有 不同,存在一些限制,主要有下面幾個(gè)方面:a 不能直接向 PC 寄存器賦值,程序跳轉(zhuǎn)要使用 B或者 BL指令;b 在使用物理寄存器時(shí),不要使用過(guò)于復(fù)雜的 C 表達(dá)式,避免物理寄存器沖突;c R12 和 R13 可能被
3、編譯器用來(lái)存放中間編譯結(jié)果,計(jì)算表達(dá)式值時(shí)可能把R0-R3 、 R12 及 R14 用于子程序調(diào)用,因此避免直接使用這些物理寄存器;d 一般不要直接指定物理寄存器;e 讓編譯器進(jìn)行分配內(nèi)嵌匯編使用的標(biāo)記是 _asm 或asm 關(guān)鍵字,用法如下: _asminstruction ; instruction 或 asm(instruction; instruction 。下面是一個(gè)例子來(lái)說(shuō)明如何在 C 中內(nèi)嵌匯編語(yǔ)言 :/C 語(yǔ)言文件 *.c #includevoid my strcpy(const char *src, char *destchar ch;asmloop:ldrb ch, src
4、, #1strb ch, dest, #1cmp ch, #0bne loopint main(char *a=forget it and move on!;char b64;my strcpy(a, b;printf(original: %s, a;printf(copyed: %s, b;return 0;在此例子中 C 語(yǔ)言和匯編之間的值傳遞是用 C 語(yǔ)言的指針來(lái)實(shí)現(xiàn)的,因?yàn)橹羔槍?duì)應(yīng)的是地址,所以匯編 中也可以訪問(wèn)。二、在匯編中使用 C 定義的全局變量?jī)?nèi)嵌匯編不用單獨(dú)編輯匯編語(yǔ)言文件,比較簡(jiǎn)潔,但是有很多的限制。當(dāng)匯編的代碼較多時(shí)一 般放在單獨(dú)的匯編文件中,這時(shí)就需要在匯編文件和 C 文
5、件之間進(jìn)行一些數(shù)據(jù)的傳遞,最簡(jiǎn)便的辦法就是使用全局變量。下面是一個(gè) C 語(yǔ)言和匯編語(yǔ)言共享全局變量的例子:/C 語(yǔ)言文件 *.c #includeint gVar=12;extern asmDouble(void;int main(printf(original value of gVar is: %d, gVar_1;asmDouble(;printf( modified value of gVar is: %d, gVar_1;return 0; 匯編語(yǔ)言文件 *.S /AREA asmfile, CODE, READONLY EXPORT asmDoubleIMPORT gVarasmD
6、oubleldr r0, =gVarldr r1, r0mov r2, #2mul r3, r1, r2str r3, r0mov pc, lrEND在此例中,匯編文件與 C 文件之間相互傳遞了全局變量 gVar 和函數(shù) asmDouble ,留意聲明 的關(guān)鍵字 extern 和 IMPORT三、在 C 中調(diào)用匯編的函數(shù)有一些對(duì)機(jī)器要求高的敏感函數(shù),通過(guò) C 語(yǔ)言編寫再通過(guò) C 編譯器翻譯有時(shí)會(huì)出現(xiàn)誤差,因此 這樣的函數(shù)一般采用匯編語(yǔ)言來(lái)編寫,然后供 C語(yǔ)言調(diào)用。在 C 文件中調(diào)用匯編文件中的函數(shù),要注意的有兩點(diǎn),一是要在 C 文件中聲明所調(diào)用 的匯編函數(shù)原型,并加入 extern 關(guān)鍵字作為
7、引入函數(shù)的聲明;二是在匯編文件中對(duì)對(duì)應(yīng)的匯編代碼段標(biāo)識(shí)用 EXPORT 關(guān)鍵字作為導(dǎo)出函數(shù)的聲 明,函數(shù)通過(guò) mov pc, lr 指令返回。這樣,就可以在 C 文件中使用該函數(shù)了。從 C 語(yǔ)言的角度的角度,并不知道調(diào)用的函數(shù)的實(shí)現(xiàn)是用 C 語(yǔ)言還是 匯編匯編語(yǔ)言,原因 C 語(yǔ)言的函數(shù)名起到表明函數(shù)代碼起始地址的作用,而這個(gè)作用和匯編語(yǔ)言的代碼段標(biāo)識(shí)符是一致的。下面是一個(gè) C 語(yǔ)言調(diào)用匯編函數(shù)例子:/C 語(yǔ)言文件 *.c /#include extern void asm_strcpy(const char *src, char *dest;int main(const char *s=sea
8、sons in the sun; char d32;asm_strcpy(s, d;printf(source: %s, s;printf( destination: %s,d;return 0; 匯編語(yǔ)言文件 *.S /AREA asmfile, CODE, READONLYEXPORT asm_strcpyasm_strcpyloopldrb r4, r0, #1cmp r4, #0beq overstrb r4, r1, #1b loopovermov pc, lrEND在此例中, C 語(yǔ)言和匯編語(yǔ)言之間的參數(shù)傳遞是通過(guò)對(duì)應(yīng)的用 R0-R3 來(lái)進(jìn)行傳遞,即 R0 傳遞 第一個(gè)參數(shù), R1
9、 傳遞第二個(gè)參數(shù),多于 4 個(gè)時(shí)借助棧完成,函數(shù)的返回值通過(guò) R0 來(lái)傳遞。這個(gè) 規(guī)定叫作 ATPCS (ARM Thumb Procedure Call Standard),具體見(jiàn) ATPCS 規(guī)范。四、在匯編中調(diào)用 C 的函數(shù)在匯編語(yǔ)言中調(diào)用 C 語(yǔ)言的函數(shù),需要在匯編中 IMPORT 對(duì)應(yīng)的 C 函數(shù)名,然后將 C 的代碼 放在一個(gè)獨(dú)立的 C 文件中進(jìn)行編譯,剩下的工作由連接器來(lái)處理。面是一個(gè)匯編語(yǔ)言調(diào)用 C 語(yǔ)言函數(shù)例子:/C 語(yǔ)言文件 *.c /int cFun(int a, int b, int creturn a+b+c; 匯編語(yǔ)言文件 *.S /AREA asmfile, CO
10、DE, READONLYEXPORT cFunstartmov r0, #0x1mov r1, #0x2mov r2, #0x3bl cFunnopnopb startEND在匯編語(yǔ)言中調(diào)用 C 語(yǔ)言的函數(shù),參數(shù)的傳遞也是按照 ATPCS 規(guī)范來(lái)實(shí)現(xiàn)的。在這里簡(jiǎn)單介紹一下部分 ATPCS 規(guī)范:子程序間通過(guò)寄存器 R0 R3 來(lái)傳遞參數(shù)。A. 在子程序中,使用寄存器 R4 R11 來(lái)保存局部變量。B. 寄存器 R12 用于子程序間 scratch 寄存器 ( 用于保存 SP ,在函數(shù)返回時(shí)使用該寄存器出 桟),記作 IP 。C. 寄存器 R13 用于數(shù)據(jù)棧指針,記作 SP 。寄存器 SP 在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的 值必須相等。D. 寄存器 R14 稱為鏈接寄存器,記作 LR 。它用于保存子程序的返回地址。E. 寄存器 R15 是程序計(jì)數(shù)器,記作 PCF. 參數(shù)不超過(guò) 4 個(gè)時(shí),可以使用寄存器 R0 R3 來(lái)傳遞參數(shù),當(dāng)參數(shù)超過(guò) 4 個(gè)時(shí),還可以使用 數(shù)據(jù)棧來(lái)傳遞參數(shù)。G. 結(jié)果為一個(gè) 32 位整數(shù)時(shí),可以通過(guò)寄存器 R0 返回H.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度互聯(lián)網(wǎng)數(shù)據(jù)中心委托經(jīng)營(yíng)管理協(xié)議
- 二零二五年度醫(yī)院?jiǎn)T工招聘與管理服務(wù)合同
- 二零二五年度人工智能聯(lián)營(yíng)投資合同模板
- 二零二五年度果園承包與農(nóng)業(yè)金融服務(wù)合作協(xié)議
- 2025年度沿街房屋租賃合同(含房屋維護(hù)及保養(yǎng)責(zé)任)
- 二零二五年度金融行業(yè)競(jìng)業(yè)禁止協(xié)議補(bǔ)償金計(jì)算細(xì)則
- 二零二五年度精裝修房屋租賃協(xié)議書
- 二零二五年度主合同與從合同在新能源汽車產(chǎn)業(yè)鏈中的協(xié)同發(fā)展及風(fēng)險(xiǎn)共擔(dān)協(xié)議
- 二零二五年度文化產(chǎn)業(yè)股權(quán)投資合同協(xié)議
- 2025年度苗木種植與生態(tài)農(nóng)業(yè)開(kāi)發(fā)協(xié)議
- 產(chǎn)品品質(zhì)檢驗(yàn)流程標(biāo)準(zhǔn)規(guī)范模板()
- DB12-595-2015醫(yī)院安全防范系統(tǒng)技術(shù)規(guī)范
- 五年級(jí)下冊(cè)英語(yǔ)課件-Unit 2 My favourite season B Let's learn 人教PEP版(共15張PPT)
- GB∕T 7260.40-2020 不間斷電源系統(tǒng) UPS 第4部分:環(huán)境 要求及報(bào)告
- 高邊坡施工危險(xiǎn)源辨識(shí)及分析
- 水廠項(xiàng)目基于BIM技術(shù)全生命周期解決方案-城市智慧水務(wù)講座課件
- 幼兒園繪本:《閃閃的紅星》 紅色故事
- 三年級(jí)學(xué)而思奧數(shù)講義.doc
- 劉姥姥進(jìn)大觀園課本劇劇本3篇
- 產(chǎn)品承認(rèn)書客(精)
- 投標(biāo)人基本情況一覽表格
評(píng)論
0/150
提交評(píng)論