Thumb指令集之: Thumb編程模型
11.2Thumb編程模型
所有的Thumb指令都是16位的。它們都是ARM指令重新編碼得到的,所以繼承了ARM指令集的許多特點。
①有數(shù)據(jù)處理、數(shù)據(jù)傳送和流控制的指令結(jié)構(gòu)。
②支持8位字節(jié)、16位半字和32位字?jǐn)?shù)據(jù)類型,半字以兩字節(jié)邊界對齊,字以4字節(jié)邊界對齊。
③32位的無分段存儲器(unsegmentedmemory)。
Thumb指令集除了繼承了ARM指令集的一些特點外,與ARM指令集存在以下一些差異。
①大多數(shù)Thumb指令為無條件執(zhí)行指令(所有ARM指令都是條件執(zhí)行的)。
②許多Thumb數(shù)據(jù)處理指令采用了2地址格式(目的寄存器與源寄存器相同)。而ARM指令中除64位乘法指令外,其余指令均采用3地址模式。
③Thumb指令格式減少了很多ARM指令格式的限制,使Thumb指令編寫的代碼密度大大提高。
無論處理器處于什么狀態(tài),所有的異常都使處理器返回到ARM狀態(tài),并完成異常處理。但異常發(fā)生時,CPSR狀態(tài)寄存器在進(jìn)入異常時被保存到相應(yīng)的SPSR中,當(dāng)異常處理結(jié)束后,處理器將恢復(fù)到異常發(fā)生前的狀態(tài),并按照發(fā)生異常時處理器的狀態(tài)繼續(xù)執(zhí)行ARM或Thumb指令。
應(yīng)該注意的是,ARM異常返回指令需要根據(jù)ARM流水線的行為對返回地址進(jìn)行調(diào)整。由于Thumb指令是2字節(jié)長,而ARM指令是4字節(jié)長,所以由Thumb執(zhí)行狀態(tài)進(jìn)入異常時其自然偏移量應(yīng)與ARM不同(ARM狀態(tài)下,拷貝到鏈接寄存器的值PC-4)。為了減少編程的復(fù)雜性,ARM體系結(jié)構(gòu)中設(shè)置了硬件邏輯,以實現(xiàn)Thumb狀態(tài)的自動地址偏移調(diào)整,使ARM和Thumb狀態(tài)編程一致。
表11.2列出了Thumb狀態(tài)下發(fā)生異常時LR的值。
表11.2 Thumb狀態(tài)異常返回指令
異常
異常鏈接寄存器值
返回指令
Reset
不可預(yù)知的值
-
未定義指令
未定義指令地址+2
MOVPC,r14
SWI
Swi指令地址+2
MOVPC,r14
預(yù)取異常
預(yù)取異常指令+4
MOVPC,r14,#4
數(shù)據(jù)異常
產(chǎn)生預(yù)取異常指令地址+8
MOVPC,r14,#8
IRQ
下一條將被執(zhí)行的指令地址+4
MOVPC,r14,#4
FIQ
下一條將被執(zhí)行的指令地址+4
MOVPC,r14,#4