Cortex --暫存器組
前言
還是和ARM7做對比進行學習
暫存器的總體區別
由於arm7有七種工作模式,而cortex只有兩種,所以在暫存器方面有很大的區別。
使用者模式 | 系統模式 | 管理模式 | 中止模式 | 為定義模式 | IRQ模式 | FIQ模式 | cortex |
---|---|---|---|---|---|---|---|
R0 | R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 | R2 |
… | … | … | … | … | … | … | |
R7 | R7 | R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_FIQ | R8 |
… | … | … | … | … | … | …_FIQ | … |
R12 | R12 | R12 | R12 | R12 | R12 | R12_FIQ | R12 |
R13(SP) | R13 | R13_SVC | R13_ABT | R13_UND | R13_IRQ | R13_FIQ | R13 |
R14 (LR) | R14 | R14_SVC | R14_ABT | R14_UND | R14_IRQ | R14_FIQ | R14 |
R15(PC) | PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | xPSR |
SPSR_SVC | SPSR_ABT | SPSR_UND | SPSR_IRQ | SPSR_FIQ | |||
PRIMASK | |||||||
FAULTMASK | |||||||
BASEPRI | |||||||
CONTROL |
在arm7中,R0–R7的通用暫存器所有模式共用,而R8–R12暫存器中,快中斷模式有自己獨立的暫存器,可以快速處理中斷,而其他模式還是共用暫存器。SP和LR中使用者模式和系統模式共用暫存器,其他模式有獨立暫存器,每個異常模式有自己的SPSR用於儲存之前的cpsr,中斷處理後進行返回。
M3就沒有這麼繁瑣的暫存器,它有R0–R15的通用暫存器,也有CPSR,不過換了個名字xPSR。同時新增了用於控制異常的使能和失能暫存器PRIMASK, FAULTMASK 和 BASEPRI。以及用於定義特權級別,還用於選擇當前使用哪個堆疊指標的控制暫存器CONTROL
程式狀態暫存器
在arm7時代的程式狀態暫存器是這樣的。將整個暫存器劃分為4個域,[31-24]是標誌域,用於判斷計算是否溢位進位為0等。[23-16]是狀態域沒有使用,[15-8]是擴充套件域沒有使用,[7-0]是控制域用於控制中斷的模式。
31 | 30 | 29 | 28 | 27 | 26-25 | 24 | 23 16 | 15-8 | 7 | 6 | 5 | 4-0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
N | Z | C | V | Q | unused | J | unused | unused | I | F | T | MODE |
cortex的程式狀態暫存器xpsr,將整個暫存器分為三個子狀態暫存器(部分位沒有使用):
應用程式 PSR(APSR)—對應cpsr標誌域[31-27],(由8位減到5位)
執行 PSR(EPSR)—對應cpsr沒有使用的狀態域和擴充套件域
中斷號 PSR(IPSR)—對應cpsr的控制域[8-0](增加了1位)
31 | 30 | 29 | 28 | 27 | 26-25 | 24 | 23 -16 | 15-10 | 9 | 8-0 |
---|---|---|---|---|---|---|---|---|---|---|
N | Z | C | V | Q | ICI/IT | T | unused | ICI/IT | 中斷號 |
APSR
N:表示兩個有符號整數運算時,N==1表示運算結果為負數,N=0表示運算結果為正數或者零。
Z:Z=1表示運算結果為0,Z=0表示運算結果不為0
C:無符號加法運算產生進位,則C=1,無符號減法運算產生溢位,則C=0;
V:有符號加減運算產生溢位,則V=1;
Q:飽和條件碼標誌位
IPSR
在arm7中,是通過一個特定的數來表示某個模式,而cortex中,只有兩個模式,所以當IPSR等於0時候,處於執行緒模式時,在手柄模式下,為當前異常的異常號。
EPSR
用來說明是arm指令還是thumb指令,其實也就是控制域的[5]位
T:Thumb狀態, T=1,ARM狀態,T=0;
通用狀態暫存器
由R0到R12暫存器構成,其中R0到R7是低組暫存器。所有指令都能訪問它們,復位後的初始值是不可預料的。R8-R12 被稱為高組暫存器。這是因為只有很少的 16 位 Thumb 指令能訪問它們, thumb-2 指令則不受限制。復位後的初始值也是不可預料的。
中間結果儲存暫存器R12
R12一般用在子程式連線程式碼中使用,作為子程式的中間結果暫存器
堆疊指標暫存器R13(sp)
在 CM3 中有兩個堆疊指標,當引用 R13(時,引用到的是當前正在使用的那一個,另一個必須用特殊的指令來訪問( MRS,MSR指令)。
主堆疊指標(MSP),或寫作 SP_main。這是預設的堆疊指標,它由 OS 核心、異常服務例程以及所有需要特權訪問的應用程式程式碼來使用。
程序堆疊指標(PSP),或寫作 SP_process。用於常規的應用程式程式碼(不處於異常服用例程中時)。
連線暫存器R14(LR)
當通過BL跳轉到子程式時,R14就被設定成子程式的返回地址,在子程式中把LR的值賦值給pc就可以實現子程式的返回。如 MOV PC,LR 或者 BX LR;
程式計數器R15(PC)
CM3 內部使用了指令流水線,讀 PC 時返回的值是當前指令的地址+4。
異常/中斷遮蔽暫存器組
該暫存器組總共有3個暫存器,只有在特權級下,才允許訪問這 3 個暫存器。
使用MRS/MSR指令訪問這三個暫存器,比如:
MRS R0, BASEPRI ;讀取BASEPRI到R0中
MSR BASEPRI, R0 ;將R0資料寫入到BASEPRI中
PRIMASK暫存器
只有單一位元的暫存器。置為1後,就關掉所有可遮蔽異常,只剩下NMI和硬Fault的異常可以響應。預設值是0,表示沒有關閉中斷。
FAULTMASK暫存器
只有單一位元的暫存器。置為1後,只有NMI異常可以響應。預設值為0,表示沒有關異常。
BASEPRI暫存器
該暫存器最多有9位(由表達優先順序的位數決定)。定義了被遮蔽優先順序的閾值。當它被設定為某個值後,所有優先順序號大於等於此值的中斷都被關。若設定成0,則不關斷任何中斷,0為預設值。
控制暫存器(Control)
CONTROL[1]:
為0表示選擇MSP(主堆疊指標,預設情況),為1表示選擇PSP(程序堆疊指標);
當為Handle模式下不允許向該位寫1,也就是在Handle模式下。改為一直為0;僅當處於特權級的執行緒模式下,此位才可寫,其它場合下禁止寫此位。
CONTROL[0]:
為0表示特權級的執行緒模式,為1表示使用者級的執行緒模式,Handler 模式永遠都是特權級的;