ARM的37個寄存器(二)
參考網址:https://blog.csdn.net/weixin_42445727/article/details/81037804
一、ARM微處理器共有37個32位寄存器,其中30個爲通用寄存器,1個固定用作PC,6個位狀態寄存器(1個固定用作CPSR,5個固固定用作5種模式下的SPSR)。但是這些寄存器不能被同時訪問,具體哪些寄存器是可以訪問的,取決ARM處理器的工作狀態及具體的運行模式。37個寄存器具體分佈如下圖:
需要注意的是:System模式與User模式共用寄存器集。
二、對於R13,R14來說,每個寄存器對應6個不同的物理寄存器,其中一個是用戶模式與系統模式共用,另外5個物理寄存器對應其他5種不同的運行模式。其中mode可爲:usr,fiq,irq,svc,abt,und.
三、寄存器R13在ARM指令中常用作堆棧指針SP,但這只是一種習慣用法,用戶也可使用其他的寄存器作爲堆棧指針,而在Thumb指令集中,某些指令強制性的要求使用R13作爲堆棧指針.
由於處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間。這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,採用這種方式可以保證異常發生後程序的正常執行。
四、R14稱爲子程序鏈接寄存器LR(Link Register),當執行子程序調用指令(BL)時,R14可得到R15(程序計數器PC)的備份.
在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值複製給R14,執行完子程序後,又將R14的值複製回PC,即可完成子程序的調用返回。以上的描述可用指令完成。
執行以下任意一條指令:
MOV PC, LR
BX LR
在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!,{,LR}
對應的,使用以下指令可以完成子程序返回:
LDMFD SP!,{,PC}
R14也可作爲通用寄存器。
五、程序計數器PC(R15)
寄存器R15用作程序計數器(PC),在ARM狀態下,位[1:0]爲0,位[31:2]用於保存PC,在Thumb狀態下,位[0]爲0,位[31:1]用於保存PC.
由於ARM體系結構採用了多級流水線技術,對於ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值爲當前指令的地址值加8個字節程序狀態寄存器
PC爲程序指針,PC指向哪裏,CPU就會執行那條指令。整個CPU只有一個PC(CPOSR也只有一個,但SPSR有5個)
六、寄存器R16
寄存器R16用作CPSR(CurrentProgram Status Register,當前程序狀態寄存器),CPSR可在任何運行模式下被訪問,它包括條件標誌位、中斷禁止位、當前處理器模式標誌位,以及其他一些相關的控制和狀態位。
每一種運行模式下又都有一個專用的物理狀態寄存器,稱爲SPSR(Saved Program Status Register,備份的程序狀態寄存器),當異常發生時,SPSR用於保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。
由於用戶模式和系統模式不屬於異常模式,它們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的
七、CPSR+SPSR詳解
1. CPSR格式
SPSR和CPSR格式相同。 CPSR格式如下圖所示:
2. 條件碼標誌
N、Z、C、V均爲條件碼標誌位。它們的內容可被算術或邏輯運算的結果所改變,並且可以決定某條指令是否被執行。條件碼標誌各位的具體含義如下表所示:
標誌位 |
含義 |
N |
當兩個有符號整數運算時: N=1:表示運算的結果爲負數; N=0:表示運算的結果爲正數或零。 |
Z |
Z=1表示運算的結果爲零,Z=0表示運算的結果非零。 對於CMP指令,Z=1表進行比較的兩個數相等 |
C |
可以有4種方法設置C的值: 在加法指令中(包括比較指令CMP),當結果產生了進位,則C=1,表示無符號運算髮生上溢出;其他情況C=0。 在減法指令中(包括減法指令CMP),當運算中發生借位,則C=0,表示無符號運算數發生下溢出;其他情況下C=1。 對於包含移位操作的非加鹼運算指令,C中包含最後一次溢出的的位的數值 對於其他非加減運算指令,C位的值通常不受影響 |
V |
對於加減運算指令,當操作數和運算結果爲二進制的補碼錶示的帶符號數時,V=1表示符號爲溢出;通常其他指令不影響V位。 |
3. 控制位
CPSR的低八位I、F、T、M[4:0]統稱爲控制位。當異常中斷髮生時這些位發生變化。在特權級的處理器模式下,軟件可以修改這些控制位。
1) I: IRQ中斷禁止位:當I=1時禁止IRQ中斷,
2) F: FIQ中斷禁止位:當F=1時禁止FIQ中斷
3) T: T控制位該位反映處理器的運行狀態。當該位爲1時,程序運行於THUMB狀態,否則運行於ARM狀態。該信號反映在外部引腳TBIT上。在程序中不得修改CPSR中的TBIT位,否則處理器工作狀態不能確定。
4) 保留位:CPSR中的其餘位爲保留位,當改變CPSR中的條件碼標誌位或者控制位時,保留位不要改變,在程序中也不要用保留位存儲數據。保留位將用於ARM版本的擴展。
5) 運行模式位M[4:0]:這幾位是模式位,這些位決定了處理器的運行模式。具體含義如下表所示:
M[4:0] |
處理器模式 |
ARM模式可訪問的寄存器 |
THUMB模式可訪問的寄存器 |
|
0b10000 |
用戶模式 |
PC,CPSR,R0~R14 |
PC,CPSR,R0~R7,LR,SP |
|
0b10001 |
FIQ模式 |
PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R0~R7 |
PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0~R7 |
|
0b10010 |
IRQ模式 |
PC,CPSR,SPSR_irq,R14_irq~R13_irq,R0~R12 |
PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0~R7 |
|
0b10011 |
管理模式 |
PC,CPSR,SPSR_svc,R14_svc~R13_svc,R0~R12 |
PC,CPSR,SPSR_svc,LR_svc,SP_svc,R0~R7 |
|
0b10111 |
中止模式 |
PC,CPSR,SPSR_abt,R14_abt~R13_abt,R0~R12 |
PC,CPSR,SPSR_abt,LR_abt,SP_abt,R0~R7 |
|
0b11011 |
未定義模式 |
PC,CPSR,SPSR_und,R14_und~R13_und,R0~R12 |
PC,CPSR,SPSR_und,LR_und,SP_und,R0~R |
|
0b11111 |
系統模式 |
PC,CPSR,R0~R14 |
PC,CPSR,LR,SP,R0~R74 |