所有的 Thumb 指令都是16 位的。它們都是ARM 指令重新編碼得到的,所以繼承了ARM 指令集的許多
特點:
① 有數據處理、數據傳送和流控制的指令結構。
② 支持8 位字節、16 位半字和32 位字數據類型,半字以兩字節邊界對齊,字以4 字節邊界對齊。
③ 32 位的無分段存儲器(unsegmented memory)。
Thumb 指令集除了繼承了ARM 指令集的一些特點外,與ARM 指令集存在以下一些差異。
① 大多數Thumb 指令為無條件執行指令(所有ARM 指令都是條件執行的)。
② 許多Thumb 數據處理指令采用了2 地址格式(目的寄存器與源寄存器相同)。而ARM 指令中除64 位 乘法指令外,其余指令均采用3 地址模式。
③ Thumb 指令格式減少了很多ARM 指令格式的限制,使Thumb 指令編寫的代碼密度大大提高。
無論處理器處于什么狀態,所有的異常都使處理器返回到ARM 狀態,并完成異常處理。但異常發生時, CPSR 狀態寄存器在進入異常時被保存到相應的SPSR 中,當異常處理結束后,處理器將恢復到異常發生 前的狀態,并按照發生異常時處理器的狀態繼續執行ARM 或Thumb 指令。
應該注意的是,ARM 異常返回指令需要根據ARM 流水線的行為對返回地址進行調整。由于Thumb 指令 是2 字節長,而ARM 指令是4 字節長,所以由Thumb 執行狀態進入異常時其自然偏移量應與ARM 不同 (ARM 狀態下,拷貝到鏈接寄存器的值PC-4)。為了減少編程的復雜性,ARM 體系結構中設置了硬件 邏輯,以實現Thumb 狀態的自動地址偏移調整,使ARM 和Thumb 狀態編程一致。
表中列出了Thumb 狀態下發生異常時LR 的值。