




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第7章章 ARM程序和程序和Thumb程序交互使程序交互使用用第1頁/共23頁2交互需求 Thumb的代碼密度和在窄存儲器上性能 ,使得它用在很多有大量C代碼的系統(tǒng)上比較理想. 然而在很多應(yīng)用中還是需要在 ARM/Thumb 兩種狀態(tài)之間切換: 在寬的存儲器上 ARM 代碼能提供很好的性能 在一個(gè)應(yīng)用中,速度關(guān)鍵的部分用ARM代碼實(shí)現(xiàn)是不錯(cuò)的 一些函數(shù)只能用 ARM 指令實(shí)現(xiàn), e.g. 存取 CPSR (使能/禁止中斷和狀態(tài)的改變) 操作協(xié)處理器 異常處理 異常處理時(shí)自動(dòng)進(jìn)入 ARM 狀態(tài),但系統(tǒng)要求主程序用 Thumb 代碼實(shí)現(xiàn) 獨(dú)立的 Thumb 程序也需要一個(gè)ARM 的匯編程序頭來切
2、換,并調(diào)用Thumb 程序第2頁/共23頁3 可以實(shí)現(xiàn)程序狀態(tài)切換的指令 BLX, BX LDR, LDM, POP第3頁/共23頁4交互指令 交互的實(shí)現(xiàn)采用跳轉(zhuǎn)交換指令(BX) 在Thumb狀態(tài)BX Rn 在ARM狀態(tài) (支持Thumb的內(nèi)核)BX Rn 其中Rn可以是 (r0r15)中的任何一個(gè). 這將通過拷貝 Rn 到 PC 來實(shí)現(xiàn)在 4GB 空間內(nèi)的一個(gè)絕對跳轉(zhuǎn). 其中Rn 的 Bit-0 表明切換到何種狀態(tài). 第4頁/共23頁5狀態(tài)切換Rn31010/1ARM / Thumb 選擇位0 - ARM state1 - Thumb state目的地址BX3101PC第5頁/共23頁6 與
3、程序狀態(tài)切換相關(guān)的偽操作 CODE16偽操作 CODE32偽操作第6頁/共23頁7分支交換示例CODE32; Start off in ARM state ADR r0,Into_Thumb+1 ; Generate branch target address and set; bit 0, hence arrive in Thumb state.BX r0; Branch exchange to Thumb state. :CODE16; Assemble subsequent code as Thumb.Into_Thumb :ADR r5, Back_to_ARM ; Generate
4、branch target to word aligned ; address - hence bit 0 is clear.BX r5; Branch exchange back to ARM state. :CODE32; Assemble subsequent code as ARM.Back_to_ARM :第7頁/共23頁8無交互子程序 實(shí)現(xiàn)一個(gè)通常的子程序調(diào)用需要如下兩步: 保存返回地址到寄存器(LR) 跳轉(zhuǎn)到對應(yīng)的子程序地址 調(diào)用實(shí)現(xiàn)通常只需要一個(gè)指令: BL func2 返回實(shí)現(xiàn)通常只需從 LR 恢復(fù) PC: MOV pc,lr.BL func2.:MOV pc,lrfunc1
5、func2void func1 (void):func2();:第8頁/共23頁9混合的ARM/Thumb子程序 在使用 C / C+ 寫程序時(shí),可以自由的編譯為 ARM ( 使用armcc/armcpp) 或 Thumb ( 使用tcc/tcpp). 需要一些編譯方法來解決在一種狀態(tài)下的函數(shù)調(diào)用另一種狀態(tài)下的函數(shù)的問題. 涉及到的問題: BL 不能完成狀態(tài)切換 需要使用 BX 切換 BX 不能自動(dòng)保存返回地址到 LR 需要其它方法來解決這個(gè)問題, BLX指令的引入 (ARM7不支持) 從子程序返回,要使用 BX LR 以便返回先前的狀態(tài) BL 在 Thumb 狀態(tài)下可能設(shè)置了 LR 的 ls
6、b (bit-0) 不能使用 MOV PC,LR 返回,因?yàn)椴荒軐?shí)現(xiàn)狀態(tài)切換第9頁/共23頁10交互子程序 任何包含使用交互調(diào)用函數(shù)的 C 模塊的編譯必須使用 -apcs /interwork 命令行選項(xiàng). 編譯器將使用 BX 實(shí)現(xiàn)函數(shù)返回來替代 MOV PC,LR. 連接器生成一小段代碼(veneers)來改變狀態(tài) 當(dāng)發(fā)現(xiàn)交互調(diào)用時(shí)自動(dòng)加入目標(biāo)文件 使用 armlink -info veneers 可以看到加入的“ veneers”的大小。:BL:BX:BXfunc1func2連接程序生成 veneer(compiled for interworking)第10頁/共23頁11ARM 4T架
7、構(gòu)對交互編譯的影響 leaf function使用 BX 返回. Non_leaf function將被交互編譯: 在入口處( 調(diào)用 BL 之前)壓棧保護(hù)返回地址 在入口處保護(hù)所有函數(shù)使用的寄存器 使用 BX 實(shí)現(xiàn)返回操作 (替代彈出 PC).C 源代碼 armcc -apcs /interwork tcc -apcs /interworkvoid func(void) func func STMFD sp!,r4-r11,lr PUSH r4-r7,lr : : : sub(); BL sub BL sub : : : : LDMFD sp!,r4-r11,lr POP r4-r7 BX l
8、r POP r3 BX r3第11頁/共23頁12匯編程序交互工作和Veneers 連接程序?qū)詣?dòng)加入ARM / Thumb交互 veneers到匯編源代碼. 主調(diào)程序需要: 使用 armasm -apcs /interwork 匯編 導(dǎo)出自己的符號, e.g. EXPORT ThumbSub 使用 BX 實(shí)現(xiàn)返回 主調(diào)程序使用 BL 指令調(diào)用子程序. Note: AREA 將包含:AREA Thumb,CODE,READONLY,INTERWORK如果如此, armasm 將警告:INTERWORK area directive is obsolete.Continuing as if -
9、apcs /inter selected.第12頁/共23頁13; armasm arm.sAREA ARM,CODE,READONLYIMPORT ThumbSubENTRYCODE32ARMProgMOVr0, #1BLThumbSub;call Thumb subroutineMOVr0, #0 x18LDRr1, =0 x20026SWI 0 x123456;ARM semihosting SWIEND; armasm thumb.s -apcs /interworkAREA Thumb,CODE,READONLYEXPORT ThumbSubCODE16ThumbSubMOVr1,
10、#2BXlr;return to callerEND匯編程序交互工作 (1)第13頁/共23頁14匯編程序交互工作 (2) 使用Debugger反匯編代碼:ARMProg0 x00008080: 0 xe3a00001 : mov r0,#10 x00008084: 0 xeb000004 : bl 0 x809c ; ThumbSub+0 x40 x00008088: 0 xe3a00018 : mov r0,#0 x180 x0000808c: 0 xe59f1000 : ldr r1,0 x8094 ; =#0 x000200260 x00008090: 0 xef123456 : sw
11、i 0 x1234560 x00008094: 0 x00020026 : Literal Pool ValueThumbSub0 x00008098: 0 x2102 : mov r1,#20 x0000809a: 0 x4770 : bx lr 交互veeners在下一個(gè)字的邊界0 x0000809c: 0 xe59fc000 : ldr r12,0 x80a4 ; =#ThumbSub+0 x10 x000080a0: 0 xe12fff1c : bx r120 x000080a4: 0 x00008099 : Literal Pool Value第14頁/共23頁15C / 匯編使用
12、Veneers交互工作 運(yùn)行在一種狀態(tài)下的 C 代碼可能調(diào)用運(yùn)行在另一種狀態(tài)下的匯編程序,反之亦然。 這時(shí)的 veneers 由連接程序自動(dòng)生成。 如果主調(diào)函數(shù)是 C 函數(shù), 編譯時(shí)使用 -apcs /interwork 如果主調(diào)函數(shù)是匯編函數(shù), 匯編時(shí)使用 -apcs /interwork 且返回使用 BX LR 任何使用這些的匯編程序必須符合 ATPCS 標(biāo)準(zhǔn) ,( e.g. 函數(shù)參數(shù)傳遞使用 r0-r3 & r12 不受保護(hù)的)第15頁/共23頁16非交互的 Thumb 代碼允許Thumb-Thumb調(diào)用交互的Thumb 代碼非交互的 ARM 代碼允許ARM-ARM調(diào)用交互的AR
13、M 代碼允許非交互的調(diào)用交互的不可調(diào)用 允許ARM/Thumb 調(diào)用交互調(diào)用 最好使用交互選項(xiàng)build所有的程序第16頁/共23頁17連接交互工作的目標(biāo)代碼 為了順利連接: 必須使用統(tǒng)一的 APCS 標(biāo)準(zhǔn)“built”所有的 C/C+/Asm 文件. 要使用相應(yīng)的交互工作庫 連接程序發(fā)現(xiàn)任何的不協(xié)調(diào)就會給出一個(gè)錯(cuò)誤:Invalid call from THUMB code in thumbmain.o(.text)to ARM symbol arm_function. 修正編譯器/ 匯編器的配置 (e.g. 加上-apcs/interwork),然后重新連編。 連接時(shí)使用-info vene
14、ers來得到增加的veneers的概況, e.g.:Adding AT veneer (12 bytes) for call to _printffrom Thumb_to_ARM.o(.text)Adding TA veneer (12 bytes) for call to arm_functionfrom thumbmain.o(.text) 小心非法的間接調(diào)用 (e.g. 函數(shù)指針, 動(dòng)態(tài)跳轉(zhuǎn)表) 連接器對這種情況在連接時(shí)是不會給出警告的。第17頁/共23頁18使用 CodeWarrior 交互工作 使用 Thumb /ARM 交互工作工程模板向 ARMDebugRel 目標(biāo)加入ARM
15、C, C+ & Asm 模塊 編譯 C 模塊使用 armcc -apcs /interwork 編譯 C+ 模塊使用armcpp -apcs /interwork 編譯 ASM 模塊使用armasm -32 -apcs /interwork 向 ThumbDebugRel 目標(biāo)加入Thumb C, C+ & Asm 模塊 編譯 C 模塊使用 tcc -apcs /interwork 編譯 C+ 模塊使用tcpp -apcs /interwork 編譯 ASM 模塊使用armasm -16 -apcs /interwork ARMDebugRel 將會被編譯連接 (部分連接)成
16、ThumbDebugRel的一個(gè)子目標(biāo)第18頁/共23頁19Architecture 5T Interworking ARM 5T 架構(gòu)增加了對交互工作的支持 消除了對veneers的需求 兼容ARM 4T 架構(gòu)的代碼 改良內(nèi)容包括 新的 BLX 指令 修正了加載 PC 的動(dòng)作第19頁/共23頁20 ARM 調(diào)用Thumb子程序 通常切換到 Thumb 狀態(tài) 32 MB 分支范圍 返回地址保存在 LR 中 使用 BX LR 從子程序返回 無條件指令 Thumb 調(diào)用ARM子程序 轉(zhuǎn)化為兩個(gè)16-bit 指令 偏移范圍同 Thumb 的 BL 指令 i.e. +/- 4MB 范圍 返回地址保存在
17、LR (同時(shí)設(shè)置LSB)BLX :BLX offset:BX lrARMThumbCPSR T bit = 1第20頁/共23頁21BLX Rm 和標(biāo)準(zhǔn)的 BX指令相同,除了保存返回地址到LR中 ARM 版本下可條件執(zhí)行 Thumb 版本下 單一的 16-bit 指令 LR 的 LSB 將被設(shè)置 使用 BX LR 從子程序返回ARM / Thumb選擇位0 - ARM state1 - Thumb stateRm目的地址310131010/10BLX RmPC第21頁/共23頁22 LDM cond Rn, ,PC 增加了對交互的支持表 v4T behaviour with extra support for interworking 如果 PC 是一個(gè)加載寄存器那么 加載值的bit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于精細(xì)電極模型的腦電正問題高精度建模方法研究
- 劇團(tuán)戲服贈(zèng)與合同范例
- 減糖魚脯甜味感知影響因素與調(diào)控機(jī)制研究
- 共同債務(wù)轉(zhuǎn)讓合同范例
- 出口營銷合同范例
- 買賣兜底合同范例
- 激光超聲高效率光聲轉(zhuǎn)換機(jī)理及應(yīng)用研究
- 公費(fèi)師范生履約合同范例
- 會展廣告合同范例
- 保安開除員工合同范例
- 2024年中鐵十一局集團(tuán)限公司招聘公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 2024年廣東深圳市龍崗坂田街道招考綜合網(wǎng)格員招聘筆試沖刺題(帶答案解析)
- 人力資源外包投標(biāo)方案
- 利那洛肽治療便秘病例
- 2024年上海市楊浦區(qū)高三二模英語試卷及答案
- MOOC 高等數(shù)學(xué)(上)-西北工業(yè)大學(xué) 中國大學(xué)慕課答案
- 部編版小學(xué)語文四年級下冊第二單元教材分析
- 等差數(shù)列公開課課件
- 2024年OTC焊接機(jī)器人基本操作培訓(xùn)
- 合肥通用職業(yè)技術(shù)學(xué)院單招《職業(yè)技能測試》參考試題庫(含答案)
- 小學(xué)五年級《美術(shù)》上冊知識點(diǎn)匯總
評論
0/150
提交評論