ARM體系結構--寄存器
1.寄存器
通用寄存器可保存數據和地址,是arm架構工作的基本存儲單元。
ARM處理器共有37個寄存器:
- 31個通用寄存器,包括程序計數器PC。這些寄存器是32位。
- 6個狀態寄存器。這些寄存器是32位的,但只使用了其中的12位。
這些寄存器不能被同時訪問,具體哪些寄存器是可編程訪問的,取決於微處理器的工作狀態及具體的運行模式,寄存器安排成部分重疊的組,每種處理器模式使用不同的寄存器組。
2.工作模式與寄存器組織
2.1通用寄存器
通用寄存器(R0—R15)可以分為三類:未分組寄存器R0—R7,分組寄存器R8—R14,程序計數器PC(R15)。 1)未分組寄存器R0—R7。對於每一個未分組寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。在異常中斷造成處理器模式切換,由於不同的處理器模式使用相同的物理寄存器,可能造成為分組寄存器中數據被破壞。未分組寄存器沒有被系統用於特別的用途,任何可採用通用寄存器的場合都可以使用未分組寄存器。 2)分組寄存器R8—R14。指同一個寄存器名,在ARM微處理器內部存在多個獨立的物理寄存器,每一個物理寄存器分別與不同的處理器模式對應,如表2.1所示。
表2.1 ARM狀態下的寄存器組織
用戶模式 | 系統模式 | 管理模式 | 數據訪問終止模式 | 未定義指令終止模式 | 外部中斷模式 | 快速中斷模式 |
---|---|---|---|---|---|---|
(usr) | (sys) | (svc) | (abt) | (und) | (irq) | (fiq) |
R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
R13 | R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
對於分組寄存器R8—R12,每個寄存器對應兩個不同的物理寄存器,當使用fiq模式時,可以訪問R8fiq—R12_fiq;當使用除fiq以外的其他模式時,可以訪問R8_usr—R12_usr。
對於R13,R14,每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式和系統模式共用的,另外5個物理寄存器對應於其他5種不同的運行模式。採用下面的記號來區分不同的物理寄存器:
R13
寄存器R13在ARM指令中常用作堆棧指針SP,但這只是一種習慣用法,用戶也可以使用其他的寄存器作為堆棧指針。 由於處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間,這樣,當程序運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,採用這種方式可以保證異常發生後程序的正常執行。 寄存器R14又稱做子程序鏈接寄存器或鏈接寄存器LR,在ARM體系中具有兩種作用: 第一種作用,每一種處理器模式自己的物理R14都存放當前子程序的返回地址。當通過BL和BLX指令調用子程序時,R14自動被設置成該子程序的返回地址。在子程序返回時,R14的值複製回程序計數器R15中,完成子程序返回。具體實現可以使用下列兩種方法之一: 執行如下其中一條指令:
MOV PC , LR
BX LR
在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!, {<register>, LR}
相應的,下面的指令可以實現子程序返回:
LDMFD SP!, {<register>, PC}
第二種作用,當異常中斷髮生時,該異常模式特定的物理R14被設置成異常模式將要返回的地址,對於有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量,對於不同的異常模式,這個偏移量會有所不同。具體的返回方式與上面的子程序返回方式基本相同。 另外,R14寄存器也可以作為通用寄存器使用。
3)程序計數器PC(R15) 寄存器R15用於程序計數器(PC)。在ARM狀態下,由於ARM指令是字對齊的,所以PC的第0位和第1位總為0;在Thumb狀態下,PC的第0位是0。PC雖然可以作為一般的通用寄存器使用,但是有一些指令在使用R15時有一些特殊規則。當違反了這些限制時,該指令執行的結果將是不可預料的。 由於ARM體系結構採用了流水線制(以三級流水線為例),對於ARM指令集來說,PC指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址加8個字節。
2.2程序狀態寄存器
ARM體系結構包含1個當前程序狀態寄存器(CPSR)和5個備份的程序狀態寄存器(SPSR)。 CPSR(Current Program Status Register)可在任何運行模式下被訪問,它包括條件標誌位、中斷禁止位、當前處理器模式標誌位,以及其他一些相關的控制和狀態位,如圖2.7所示。
每種異常模式下都有一個對應的物理寄存器一備份的程序狀態寄存器SPSR(Saved Program Status Register)。當異常發生時,SPSR用於保存CPSR當前值,從異常退出時,則可由SPSR來恢復CPSR。用戶模式和系統模式不屬於異常模式,他們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的。
條件碼標誌(28-31位) N、Z、C及V統稱為條件碼標誌位。其內容可被算術和邏輯運算的結果所改變,由此可以決定某些指令是否被執行。具體含義如表2.3所示。
Q標誌位(第27位) 在ARM V5及以上版本的E系列處理器中,用Q標誌位指示增強的DSP運算指令是否發生了溢出。在其他版本的處理器中,Q標誌位無定義。
CPSR的控制位(第7-0位) CPSR的低8位(包括I、F、T和M[4:0])稱為控制位,當發生異常時這些位可以被改變。如果處理器運行特權模式,這些位也可以由程序修改。
中斷禁止位I,F: I=1禁止IRQ中斷 F=1禁止FIQ中斷
T標誌位:該位反映處理器的運行狀態 對於ARM體系結構V4及以上的版本的T系列處理器,當該位為1時,程序運行與Thumb狀態,否則運行於ARM狀態。 對於ARM體系結構V5及以上的版本的非T系列處理器,當該位為1時,執行下一條指令以引起未定義的指令異常;當該位為0時,表示運行於ARM狀態。
運行模式位M[4:0]:M0、M1、M2、M3、M4是模式位。這些位決定了處理器的運行模式。具體含義如表2.4所示。
4.其他的位為保留位,用作以後的擴展。