第7章 ARM程序和Thumb程序混合使用_第1頁
第7章 ARM程序和Thumb程序混合使用_第2頁
第7章 ARM程序和Thumb程序混合使用_第3頁
第7章 ARM程序和Thumb程序混合使用_第4頁
第7章 ARM程序和Thumb程序混合使用_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第7章章 ARM程序和程序和Thumb程序程序 交互使用交互使用 Assemble Language of ARM2 交互需求 oThumb的代碼密度和在窄存儲器上性能 ,使得它用在很多有大 量C代碼的系統(tǒng)上比較理想. 然而在很多應用中還是需要在 ARM/Thumb 兩種狀態(tài)之間切換: n在寬的存儲器上 ARM 代碼能提供很好的性能 o 在一個應用中,速度關(guān)鍵的部分用ARM代碼實現(xiàn)是不錯的 n一些函數(shù)只能用 ARM 指令實現(xiàn), e.g. o 存取 CPSR (使能/禁止中斷和狀態(tài)的改變) o 操作協(xié)處理器 n異常處理 o 異常處理時自動進入 ARM 狀態(tài),但系統(tǒng)要求主程序用 Thumb 代碼

2、實現(xiàn) n獨立的 Thumb 程序也需要一個ARM 的匯編程序頭來切換,并 調(diào)用Thumb 程序 Assemble Language of ARM3 o 可以實現(xiàn)程序狀態(tài)切換的指令 n BLX, BX n LDR, LDM, POP Assemble Language of ARM4 交互指令 o 交互的實現(xiàn)采用跳轉(zhuǎn)交換指令(BX) n在Thumb狀態(tài) BX Rn n在ARM狀態(tài) (支持Thumb的內(nèi)核) BX Rn 其中Rn可以是 (r0r15)中的任何一個. o 這將通過拷貝 Rn 到 PC 來實現(xiàn)在 4GB 空間內(nèi) 的一個絕對跳轉(zhuǎn). o 其中Rn 的 Bit-0 表明切換到何種狀態(tài). As

3、semble Language of ARM5 狀態(tài)切換 Rn 31 01 0/1 ARM / Thumb 選擇位選擇位 0 - ARM state 1 - Thumb state 目的地址目的地址 BX 3101 PC Assemble Language of ARM6 o 與程序狀態(tài)切換相關(guān)的偽操作 n CODE16偽操作 n CODE32偽操作 Assemble Language of ARM7 分支交換示例 CODE32; Start off in ARM state ADR r0,Into_Thumb+1 ; Generate branch target address and se

4、t ; 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 branch target to word aligned ; address - hence bit 0 is clear. BX r5; Branch exchange back to ARM state. : CODE32; Assemble subsequ

5、ent code as ARM. Back_to_ARM : Assemble Language of ARM8 無交互子程序 o實現(xiàn)一個通常的子程序調(diào)用需要如下兩步: n保存返回地址到寄存器(LR) n跳轉(zhuǎn)到對應的子程序地址 o調(diào)用實現(xiàn)通常只需要一個指令: BL func2 o返回實現(xiàn)通常只需從 LR 恢復 PC: MOV pc,lr . . BL func2 . . : MOV pc,lr func1func2 void func1 (void) : func2(); : Assemble Language of ARM9 混合的ARM/Thumb子程序 o在使用 C / C+ 寫程序時,

6、可以自由的編譯為 ARM ( 使用 armcc/armcpp) 或 Thumb ( 使用tcc/tcpp). n需要一些編譯方法來解決在一種狀態(tài)下的函數(shù)調(diào)用另一種狀態(tài)下的 函數(shù)的問題. o涉及到的問題: n BL 不能完成狀態(tài)切換 o需要使用 BX 切換 n BX 不能自動保存返回地址到 LR o需要其它方法來解決這個問題, BLX指令的引入 (ARM7不支持) n 從子程序返回,要使用 BX LR 以便返回先前的狀態(tài) oBL 在 Thumb 狀態(tài)下可能設置了 LR 的 lsb (bit-0) o不能使用 MOV PC,LR 返回,因為不能實現(xiàn)狀態(tài)切換 Assemble Language of

7、 ARM10 交互子程序 o任何包含使用交互調(diào)用函數(shù)的 C 模塊的編譯必須使用 -apcs /interwork 命令行選項. n編譯器將使用 BX 實現(xiàn)函數(shù)返回來替代 MOV PC,LR. o連接器生成一小段代碼(veneers)來改變狀態(tài) n當發(fā)現(xiàn)交互調(diào)用時自動加入目標文件 n使用 armlink -info veneers 可以看到加入的“ veneers” 的大小。 : BL : : BX : BX func1func2 連接程序生成連接程序生成 veneer (compiled for interworking) Assemble Language of ARM11 ARM 4T架構(gòu)

8、對交互編譯的影響 o leaf function使用 BX 返回. oNon_leaf function將被交互編譯: n在入口處( 調(diào)用 BL 之前)壓棧保護返回地址 n在入口處保護所有函數(shù)使用的寄存器 n使用 BX 實現(xiàn)返回操作 (替代彈出 PC). C 源代碼 armcc -apcs /interwork tcc -apcs /interwork void 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-

9、r7 BX lr POP r3 BX r3 Assemble Language of ARM12 匯編程序交互工作和Veneers o連接程序?qū)詣蛹尤階RM / Thumb交互 veneers到匯編源代碼. o主調(diào)程序需要: n使用 armasm -apcs /interwork 匯編匯編 n導出自己的符號, e.g. EXPORT ThumbSub n使用 BX 實現(xiàn)返回 o主調(diào)程序使用 BL 指令調(diào)用子程序. oNote: AREA 將包含: AREA Thumb,CODE,READONLY,INTERWORK 如果如此, armasm 將警告: INTERWORK area dire

10、ctive is obsolete. Continuing as if -apcs /inter selected. Assemble Language of ARM13 ; armasm arm.s AREA ARM,CODE,READONLY IMPORT ThumbSub ENTRY CODE32 ARMProg MOVr0, #1 BLThumbSub;call Thumb subroutine MOVr0, #0 x18 LDRr1, =0 x20026 SWI 0 x123456;ARM semihosting SWI END ; armasm thumb.s -apcs /int

11、erwork AREA Thumb,CODE,READONLY EXPORT ThumbSub CODE16 ThumbSub MOVr1, #2 BXlr;return to caller END 匯編程序交互工作 (1) Assemble Language of ARM14 匯編程序交互工作 (2) o使用Debugger反匯編代碼: ARMProg 0 x00008080: 0 xe3a00001 : mov r0,#1 0 x00008084: 0 xeb000004 : bl 0 x809c ; ThumbSub+0 x4 0 x00008088: 0 xe3a00018 : mov

12、 r0,#0 x18 0 x0000808c: 0 xe59f1000 : ldr r1,0 x8094 ; =#0 x00020026 0 x00008090: 0 xef123456 : swi 0 x123456 0 x00008094: 0 x00020026 : Literal Pool Value ThumbSub 0 x00008098: 0 x2102 : mov r1,#2 0 x0000809a: 0 x4770 : bx lr o交互veeners在下一個字的邊界 0 x0000809c: 0 xe59fc000 : ldr r12,0 x80a4 ; =#ThumbSub+0 x1 0 x000080a0: 0 xe12fff1c : bx r12 0 x000080a4: 0 x00008099 : Literal Pool Value Assemble Language of ARM15 C / 匯編使用 Veneers交互工作 o運行在一種狀態(tài)下的 C 代碼可能調(diào)用運行在另一種狀態(tài)下的匯編程序,反之 亦然。 o這時的 veneers 由連接程序自動生成。 o如果主調(diào)函數(shù)是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論