ARM處理器共有37個寄存器。其中包括:spa
ARM處理器共有7種不一樣的處理器模式,在每一種處理模式中有一組相應的寄存器組。任意時刻,可見的寄存器包括15個通用寄存器(R0~R14),一個或兩個狀態寄存器及程序計數器。在全部寄存器中,有些是各模式共用的同一個物理寄存器;有一些是各模式本身擁有的獨立的物理寄存器。下表列出了各類處理器模式下可見的寄存器狀況。設計
各類處理器模式下的寄存器指針
用戶模式 | 系統模式 | 特權模式 | 停止模式 | 未定義指令模式 | 外部中斷模式 | 快速中斷模式 |
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 |
通用寄存器介紹:內存
通用寄存器能夠分爲下面3類:ci
未備份寄存器:it
未備份寄存器包括R0~R7。對於每個未備份寄存器來講,在全部的處理器模式下指的都是同一個物理寄存器。在異常中斷形成處理器模式切換時,因爲不一樣的處理器模式使用相同的物理寄存器,可能形成寄存器中數據被破壞。未備份寄存器沒有被系統用於特別的用途,任何採用通用寄存器的應用場合均可以使用未備份寄存器。table
備份寄存器:擴展
對於備份寄存器R8~R12來講,每一個寄存器對應兩個不一樣的物理寄存器。例如,當使用快速中斷模式下的寄存器時,寄存器R8和寄存器R9分別記做爲R8_FIQ、R9_FIQ;當使用用戶模式下的寄存器時,寄存器R8和R9分別記做R8_USR、R9_USR等。在這兩種狀況下,使用的是不一樣的物理寄存器。系統沒有將這幾個寄存器用於特殊的用途,可是當中斷處理很是簡單,僅僅使用R8~R14寄存器時,FIQ處理程序能夠沒必要執行保存和恢復中斷現場的指令,從而可使中斷處理過程很是迅速。軟件
對於備份寄存器R13和R14來講,每一個寄存器對應6種不一樣的物理寄存器,其中的一個是用戶模式和系統模式共用的,另外5個對應於其餘的5種處理器模式。採用下面的記號來區分各個物理寄存器。二進制
R13_<mode>
其中,<mode>能夠是下面幾種狀況之一:usr、svc、abt、und、irq和fiq。
寄存器R13在ARM中經常使用做棧指針(sp)。在ARM指令集中,這只是一種習慣的用法,並無任何指令強制性地使用R13做爲棧指針,用戶也可使用其餘的寄存器做爲棧指針;而在Thumb指令集中,有一些指令強制使用R13做爲棧指針。
每一種異常模式擁有本身的物理的R13。應用程序初始化該R13,使其指向該異常模式專用的棧地址。當進入異常模式時,能夠將須要使用的寄存器保存在R13所指的棧中;當退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運行現場。
寄存器R14又被稱爲鏈接寄存器(LR),在ARM體系中具備下面兩種特殊的做用:
每一種處理器模式本身的物理R14中存放着當前子程序的返回地址。當經過BL跳轉指令調用子程序是,R14被設置成該子程序的返回地址。在子程序中,當把R14的值複製到程序計數器PC中時,子程序即返回。能夠經過下面的兩種方式實現這種子程序的返回操做。
執行下面的任何一條指令:
MOV PC, LR
BX LR
在子程序入口使用下面的指令將PC保存到棧中:
STMFD SP!, {<registers>, LR}
相應的,下面的指令能夠實現子程序的返回:
LDMFD SP!, {<register>, PC}
當異常中斷髮生時,該異常模式特定的物理寄存器R14被設置成該異常模式將要返回的地址,對於有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
R14寄存器也能夠做爲通用寄存器來使用。
程序計數器R15(PC):
程序計數器R15又被記做PC。它雖然能夠做爲通常的通用寄存器使用,可是有一些指令在使用R15時有一些特殊限制。當違反了這些限制時,該指令執行的結果將是不可預料的。
因爲ARM採用流水線機制,當正確讀取了PC的值時,該值爲當前指令的地址加8個字節。也就是說,對於ARM指令集來講,PC指向當前指令的下兩條指令的地址。因爲ARM指令是字節對齊的,PC值的第0位和第1位老是0。
須要注意的是,當使用指令STR/STM保存R15時,保存的多是當前指令地址值加8字節,也可能保存的是當前指令地址加12字節。究竟是哪一種方式,取決於芯片的具體設計方式。不管如何,在同一芯片中,要麼採用當前指令地址加8,要麼採用當前指令地址加12字節,不能有些指令採用當前指令地址加8,另外一些指令採用當前指令地址加12。所以對於用戶來講,儘可能避免使用STM/STR指令來保存R15的值。當不可避免這種使用方式時,能夠先經過一些代碼來肯定所用的芯片使用的是哪一種方式。假設R0指向可用的一個內存字,下面的代碼能夠在R0指向的內存字中返回該芯片所採用的地址偏移量。
SUB R1, PC ,#4 @R1中存放下面STR指令的地址
STR PC, [R0] @PC=STR地址加offset保存到R0中
LDR R0, [R0]
SUB R0, R0, R1 @offset=PC-STR地址
在上面的討論中,都是針對指令返回的值。該值並不是在指令讀取期間出如今數據總線上的值。在指令讀取期間出如今數據總線上的值取決於芯片的具體實現方式。
當成功的向R15中寫入一個地址值時,程序將跳轉到該地址執行。因爲ARM指令是字對齊的,寫入R15的地址值應該知足bits[1:0]=0b00,至於具體的要求,ARM各版本有所不一樣。
對於Thumb指令集來講,指令是半字節對齊的。處理器將忽略bit[0],即寫入R15的地址值首先與0xFFFFFFFE作與操做,再寫入R15中。
還有一些指令對R15的用法有一些特殊的要求。好比,指令BX利用bit[0]來肯定是ARM指令,仍是Thumb指令。
這種讀取PC值和寫入PC值的不對稱的操做須要特別注意。這一點在之後的章節還有介紹。如指令"MOV PC, PC"將程序跳轉到當前指令下面第2條指令處執行。由於指令中,第2個PC寄存器讀出的值爲當前指令的地址值加8,這樣對ARM指令而言,寫入PC寄存器的是當前指令下面第2條指令的地址。相似的指令還有"ADD PC, PC, #0"。
程序狀態寄存器:
CPSR(當前程序狀態寄存器)能夠在任何處理器模式下被訪問。它包含了條件標誌位、中斷禁止位、當前處理器模式標誌以及其餘的一些控制和狀態位。每一種處理器模式下都有一個專用的物理狀態寄存器,稱爲SPSR(備份程序狀態寄存器)。當特定的異常中斷髮生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷程序退出時,能夠用SPSR中保存的值來恢復CPSR。
因爲用戶模式和系統模式不是異常中斷模式,因此它們沒有SPSR。當在用戶模式或系統模式中訪問SPSR時,將會產生不可預知的結果。
CPSR的格式以下所示。SPSR格式與CPSR的格式相同。
31 | 30 | 29 | 28 | 27 | 26 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | Z | C | V | Q | DNM | I | F | T | M4 | M3 | M2 | M1 | M0 |
條件標誌位:
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統稱爲條件標誌位。大部分的ARM指令能夠根據CPSR中的這些條件標誌位來選擇性地執行。各條件標誌位的具體含義以下表所示。
CPSR中的條件標誌位
標誌位 | 含義 |
N | 本位設置成當前指令運算結果的bit[31]的;當兩個補碼錶示的有符號整數運算時,N=1表示運算的結果的爲負數,N=0表示結果爲正數或零。 |
Z | Z=1表示運算結果爲零;Z=0表示運算的結果不爲零,對於CMP指令,Z=1表示進行比較的兩個數大小相等 |
C | 下面分4種狀況討論C的設置方法: 在加法指令中,當結果產生了進位,則C=1,表示無符號數運算髮生了上溢;其餘狀況下爲0; 在減法指令中,當運算髮生了借位,則C=0,表示無符號數運算髮生下溢出,其餘狀況下爲0; 對於其餘非加/減運算指令,C位的值一般不受影響。 |
V | 對於加/減法指令,當操做數和運算結果爲二進制的補碼錶示的帶符號數時,V=1表示符號位溢出。 |
如下指令會影響CPSR中的條件標誌位:
Q標誌位:在ARMv5的E系列處理器中,CPSR的bit[27]稱爲Q標誌位,主要用於指示加強的DSP指令是否發生了溢出。一樣的SPSR中的bit[27]也稱爲Q標誌位,用於在異常中斷髮生時保存和恢復CPSR中的Q標誌位。
CPSR中的控制位:
CPSR的低8位I、F、T及M[4:0]統稱爲控制位。當異常中斷髮生時,這些位發生變化。在特權級的處理器模式下,軟件能夠修改這些控制位。
(1)中斷禁止位:
當I=1時禁止IRQ中斷;
當F=1時禁止FIQ中斷;
(2)T控制位:
T控制位用於控制指令執行的狀態,即說明指令是ARM指令,仍是Thumb指令。對於不一樣版本的ARM處理器,T控制位的含義不一樣。
對於ARMv4以及更高的版本的T系列的ARM處理器,T控制位的含義以下:
T=0表示執行的ARM指令;
T=1表示執行的Thumb指令;
(3)M控制位:
控制位M[4:0]控制處理器模式,具體含義以下表所示:
M[4:0] | 處理器模式 | 可訪問的寄存器 |
0b10000 | User | PC,R0~R14,CPSR |
0b10001 | FIQ | PC,R0~R7,R8_fiq~R14_fiq,CPSR,SPSR_fiq |
0b10010 | IRQ | PC,R0~R7,R8_irq~R14_irq,CPSR,SPSR_irq |
0b10011 | Supervisor | PC,R0~R7,R8_svc~R14_svc,CPSR,SPSR_svc |
0b10111 | Abort | PC,R0~R7,R8_abt~R14_abt,CPSR,SPSR_abt |
0b11011 | Undefined | PC,R0~R7,R8_und~R14_und,CPSR,SPSR_und |
0b11111 | System | PC,R0~R14,CPSR |
CPSR中其餘位:CPSR中的其它位用於未來ARM版本的擴展,應用軟件不要操做這些位,以避免與ARM未來版本的擴展衝突。