Thumb指令集之: ARM和Thumb的混合編程
11.10ARM和Thumb的混合編程
11.10.1互交工作基礎
Thumb以其較高的代碼密度和在窄存儲器上的性能,使得它在很多系統中得到廣泛應用。但在很多情況下,還是不得不使用ARM指令,這是因為:
①ARM代碼比Thumb代碼有更快的執行速度;
②ARM處理器的一些特定功能必須由ARM指令實現,其中包括PSR指令、協處理器指令;
③異常發生時,處理器自動進入ARM狀態,如果異常處理程序需要使用Thumb指令也必須通用一個ARM程序頭(ARMassemblerheader)。
基于以上原因,即使程序需要由Thumb代碼實現,也必須通過ARM-Thumb互交(ARM-Thumbinterworking)進入Thumb狀態。
ARM-Thumb互交是指對匯編語言和C/C++語言的ARM和Thumb代碼進行連接的方法,它進行兩種狀態(ARM和Thumb狀態)間的切換。在進行這種切換時,有時需使用額外的代碼,這些代碼被稱為Veneer。AAPCS定義了ARM和Thumb過程調用的標準。
從一個ARM例程調用一個Thumb例程,內核必須進行狀態切換。狀態的變化由CPSR的T位來顯示。在跳轉到一個例程時BX指令可用于ARM和Thumb狀態切換,具體用法如下。
在Thumb狀態調用ARM例程時,采用:
BXRn;
在ARM狀態調用Thumb例程時,采用:
BX{cond}Rn;
其中,Rn可以是r0~r15中的任意寄存器。
這種帶狀態切換的跳轉指令BX,將寄存器Rn的內容拷貝到程序計數器寄存器PC,因此可以實現4G空間的跳轉。指令根據寄存器Rn的bit[0]來決定處理器是否進行狀態切換,詳細內容參見ARM指令一節。
下面是一段ARM程序,該程序調用虛擬的SWI_writeC子程序從存儲器的固定地址取出字符串“helloworld”并輸出。
AREAHello,CODE,READONLY
SWI_WriteCEQU0 ;軟中斷調用參數
SWI_ExitEQU11 ;程序退出軟中斷調用參數
ENTRY
STARTADRr1,TEXT ;取字符串地址
LOOPLDRBr0,[r1],#1 ;取下一字節內容
CMPr0,#0 ;判斷是否為字符串尾
SWINESWI_WriteC ;軟中斷調用打印字符
BENLOOP ;循環
SWISWI_Exit ;軟中斷調用退出程序執行
TEXT=“HelloWorld”,0a,0d,0
END
下面的代碼將上面的ARM代碼轉換成等價的Thumb代碼。
AREAHelloW_Thumb,CODE,READONLY
SWI_WriteCEQU0 ;軟中斷調用參數
SWI_ExitEQU11 ;程序退出軟中斷調用參數
ENTRY ;程序入口點
CODE32進入ARM狀態
ADRr0,START+1 ;取得Thumb代碼入口地址
BXr0 ;進入Thumb代碼
CODE16 ;Thumb代碼入口點
STARTADRr1,TEXT ;r1->HelloWorld
LOOPLDRBr0,[r1] ;取下一字節內容
ADDr1,r1,#1 ;地址指針加1**T
CMPr0,#0 ;判斷是否為字符串尾
BEQDONE ;完成?**T
SWISWI_WriteC ;如果不是字符串尾
BLOOP ;繼續循環
DONESWISWI_Exit ;程序退出
ALIGN ;字對齊
TEXTDATA
HelloWorld,0a,0d,00
END
上例中,ARM代碼到Thumb代碼轉換過程中新增加的指令用“**T”標注。
c++相關文章:c++教程
評論