由于Thumb指令在某些特殊情況下可能比ARM指令更有效,所以它在很多方面得到了廣泛的應(yīng)用。但是Thumb知識ARM指令集的一個子集,它不能獨(dú)立組成一個應(yīng)用系統(tǒng),所以在很多情況下應(yīng)用程序需要二者的混合編程,這就必然存在ARM與Thumb狀態(tài)之間函數(shù)調(diào)用的問題。下面將分別詳細(xì)介紹。
1) 狀態(tài)切換的實現(xiàn)
ARM/Thumb之間的狀態(tài)切換是通過一條專用的轉(zhuǎn)移**指令BX來實現(xiàn)的。BX指令以通用寄存器位操作數(shù),通過拷貝Rn到PC來實現(xiàn)4GB空間范圍內(nèi)的一個絕對跳轉(zhuǎn)。BX利用Rn寄存器中目的地址值的最后一位來判斷跳轉(zhuǎn)后的狀態(tài)。當(dāng)最后一位為0時,表示轉(zhuǎn)移到ARM狀態(tài);當(dāng)最后一位為1時,表示轉(zhuǎn)移到Thumb狀態(tài)。
無論是ARM還是Thumb,其指令在存儲器中都是邊界對齊的。因此,在執(zhí)行跳轉(zhuǎn)過程中,PC寄存器中的最低位被舍棄,不起作用。在BX指令的執(zhí)行過程中,最低位正好被用作狀態(tài)判斷的標(biāo)志,不會造成存儲器訪問不對齊的錯誤。
下面是一段直接進(jìn)入狀態(tài)切換的例程:
;從ARM狀態(tài)開始
CODE32 ;表明一下是ARM指令
ADR R0,Into_Thumb+1 ;得到目標(biāo)地址,末位置1,表示轉(zhuǎn)移到Thumb
BX R0 ;轉(zhuǎn)向Thumb
…
CODE16 ;表明以下是Thumb指令I(lǐng)nto_Thumb
…
ADR R5,Back_to_ARM ;得到目標(biāo)地址,末位缺省為0 ,轉(zhuǎn)移到ARM
BX R5 ;轉(zhuǎn)向ARM
…
CODE32
Back_to_ARM ;ARM代碼段起始地址