ARM處理器共有37個寄存器。其中包括:31個通用寄存器,包括程序計數(shù)器(PC)在內(nèi)。這些寄存器都是32位寄存器。以及6個32位狀態(tài)寄存器。但目前只使用了其中12位。ARM處理器共有7種不同的處理器模式,在每一種處理器模式中有一組相應(yīng)的寄存器組。任意時刻(也就是任意的處理器模式下),可見的寄存器包括15個通用寄存器(R0~R14)、一個或兩個狀態(tài)寄存器及程序計數(shù)器(PC)。在所有的寄存器中,有些是各模式共用的同一個物理寄存器;有一些寄存器是各模式自己擁有的獨(dú)立的物理寄存器。表1列出了各處理器模式下可見的寄存器情況。
表1 各種處理器模式下的寄存器
用戶模式
|
系統(tǒng)模式
|
特權(quán)模式
|
中止模式
|
未定義指令模式
|
外部中斷模式
|
快速中斷模式
|
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
|
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_inq
|
R13_fiq
|
R14
|
R14
|
R14_svc
|
R14_abt
|
R14_und
|
R14_inq
|
R14_fiq
|
PC
|
PC
|
PC
|
PC
|
PC
|
PC
|
PC
|
CPSR
|
CPSR
|
CPSR
SPSR_svc
|
CPSR
SPSR_abt
|
CPSR
SPSR_und
|
CPSR
SPSR_inq
|
CPSR
SPSR_fiq
|
通用寄存器可以分為下面3類:未備份寄存器(The unbanked registers),包括R0~R7。備份寄存器(The banked registers),包括R8~R14。程序計數(shù)器PC,即R15。
未備份寄存器包括R0~R7。對于每一個未備份寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。在異常中斷造成處理器模式切換時,由于不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數(shù)據(jù)被破壞。未備份寄存器沒有被系統(tǒng)用于特別的用途,任何可采用通用寄存器的應(yīng)用場合都可以使用未備份寄存器。
對于備份寄存器R8~R12來說,每個寄存器對應(yīng)兩個不同的物理寄存器。例如,當(dāng)使用快速中斷模式下的寄存器時,寄存器R8和寄存器R9分別記作R8_fiq、R9_fiq;當(dāng)使用用戶模式下的寄存器時,寄存器R8和寄存器R9分別記作R8_usr、R9_usr等。在這兩種情況下使用的是不同的物理寄存器。系統(tǒng)沒有將這幾個寄存器用于任何的特殊用途,但是當(dāng)中斷處理非常簡單,僅僅使用R8~R14寄存器時,F(xiàn)IQ處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場的指令,從而可以使中斷處理過程非常迅速。對于備份寄存器R13和R14來說,每個寄存器對應(yīng)6個不同的物理寄存器,其中的一個是用戶模式和系統(tǒng)模式共用的;另外的5個對應(yīng)于其他5種處理器模式。采用記號R13_<mode>來區(qū)分各個物理寄存器:
其中,<mode>可以是下面幾種模式之一:usr、svc、abt、und、irq及fiq。
寄存器R13在ARM中常用作棧指針。在ARM指令集中,這只是一種習(xí)慣的用法,并沒有任何指令強(qiáng)制性的使用R13作為棧指針,用戶也可以使用其他的寄存器作為棧指
針;而在Thumb指令集中,有一些指令強(qiáng)制性地使用R13作為棧指針。
每一種異常模式擁有自己的物理的R13。應(yīng)用程序初始化該R13,使其指向該異常模式專用的棧地址。當(dāng)進(jìn)入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當(dāng)退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運(yùn)行現(xiàn)場。
寄存器R14又被稱為連接寄存器(Link Register,LR),在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的物理R14中存放在當(dāng)前子程序的返回地址。當(dāng)通過BL或BLX指令調(diào)用子程序時,R14被設(shè)置成該子程序的返回地址。在子程序中,當(dāng)把R14的值復(fù)制到程序計數(shù)器PC中時,子程序即返回。
當(dāng)異常中斷發(fā)生時,該異常模式特定的物理R14被設(shè)置成該異常模式將要返回的地址,對于有些異常模式,R14的值可能與將返回的地址有一個常數(shù)的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
R14寄存器也可以作為通用寄存器使用。
程序計數(shù)器R15又被記作PC。它雖然可以作為一般的通用寄存器使用,但是有一些指令在使用R15時有一些特殊限制。當(dāng)違反了這些限制時,該指令執(zhí)行的結(jié)果將是不可預(yù)料的。
由于ARM采用了流水線機(jī)制,當(dāng)正確讀取了PC的值時,該值為當(dāng)前指令地址值加8個字節(jié)。也就是說,對于ARM指令集來說,PC指向當(dāng)前指令的下兩條指令的地址。
由于ARM指令是字對齊的,PC值的第0位和第1位總為0。需要注意的是,當(dāng)使用指令STR/STM保存R15時,保存的可能是當(dāng)前指令地址值加8字節(jié),也可能保存的是當(dāng)前指令地址加12字節(jié)。到底是哪種方式,取決于芯片具體設(shè)計方式。無論如何,在同一芯片中,要么采用當(dāng)前指令地址加8,要么采用當(dāng)前指令地址加12,不能有些指令采用當(dāng)前指令地址加8,另一些指令采用當(dāng)前指令地址加12。因此對于用戶來說,盡量避免使用STR/STM指令來保存R15的值。當(dāng)不可避免這種使用方式時,可以先通過一些代碼來確定所用的芯片使用的是哪種實現(xiàn)方式。
對于ARM版本4以及更高的版本,程序必須保證寫入R15寄存器的地址值的bits[1:0]為0b00;否則將會產(chǎn)生不可預(yù)知的結(jié)果。
對于Thumb指令集來說,指令是半字對齊的。處理器將忽略bit[0],即寫入R15的地址值首先與0XFFFFFFFC做與操作,再寫入R15中。
還有—些指令對于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來確定是ARM指令,還是Thumb指令。這種讀取PC值和寫入PC值的不對稱的操作需要特別注意。
CPSR(當(dāng)前程序狀態(tài)寄存器)可以在任何處理器模式下被訪問。它包含了條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志以及其他的一些控制和狀態(tài)位。每一種處理器模式下都有一個專用的物理狀態(tài)寄存器,稱為SPSR(備份程序狀態(tài)寄存器)。當(dāng)特定的異常中斷發(fā)生時,這個寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。在異常中斷程序退出時,可以用SPSR中保存的值來恢復(fù)CPSR。
由于用戶模式和系統(tǒng)模式不是異常中斷模式,所以它們沒有SPSR。當(dāng)在用戶模式或系統(tǒng)模式中訪問SPSR,將會產(chǎn)生不可預(yù)知的結(jié)果。
CPSR的格式如下所示。SPSR格式與CPSR格式相同。
31
|
30
|
29
|
28
|
27
|
26
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
N
|
Z
|
C
|
V
|
Q
|
DNM(RAZ)
|
I
|
F
|
T
|
M4
|
M3
|
M2
|
M1
|
M0
|
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統(tǒng)稱為條件標(biāo)志位。大部分的ARM指令可以根據(jù)CPSR中的這些條件標(biāo)志位來選擇性地執(zhí)行。各條件標(biāo)志位的具體含義如表2所示。
表2 CPSR中的條件標(biāo)志位
標(biāo)志位
|
含 義
|
N
|
本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit[31)的值
當(dāng)兩個補(bǔ)碼表示的有符號整數(shù)運(yùn)算時,N=I表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示結(jié)果為正數(shù)或零
|
Z
|
Z=1表示運(yùn)算的結(jié)果為零;Z=0表示運(yùn)算的結(jié)果不為零。
對于CMP指令,Z=1表示進(jìn)行比較的兩個數(shù)大小相等。
下面分4種情況討論C的設(shè)置方法:
在加法指令中(包括比較指令CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無符號數(shù)運(yùn)算發(fā)生上溢出;其他情況下C=0。
在減法指令中(包括比較指令CMP),當(dāng)運(yùn)算中發(fā)生借位則C=0表示無符號數(shù)運(yùn)算發(fā)生下溢出;其他情況下C=1。
對于包含移位操作的非加/減法運(yùn)算指令,C中包含最后一次溢出的位數(shù)數(shù)值。
對于其他非加/減法運(yùn)算指令,C位的值通常不受影響。
|
V
|
對于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號數(shù)時V=1表示符號位溢出。
通常其他的指令不影響V位,具體可參考各指令的說明。
|
在ARMv5的E系列處理器中,CPSR的bit[27]稱為Q標(biāo)志位,主要用于指示增強(qiáng)的
DSP指令是否發(fā)生了溢出。同樣的SPSR中的bit[27]也稱為Q標(biāo)志位,用于在異常中斷發(fā)生時保存和恢復(fù)CPSR中的Q標(biāo)志位。
在ARM v5以前的版本及ARM v5的非E系列的處理器中,Q標(biāo)志位沒有被定義。CPSR的bit[27]屬于DNM(RAZ)。
CPSR的低8位I、F、T及M[4:0]統(tǒng)稱為控制位。當(dāng)異常中斷發(fā)生時這些位發(fā)生變化。在特權(quán)級的處理器模式下,軟件可以修改這些控制位。
1) 中斷禁止位
當(dāng)I=1時禁止IRQ中斷。
當(dāng)F=1時禁止FIQ中斷。
2) T控制位
T控制位用于控制指令執(zhí)行的狀態(tài),即說明本指令是ARM指令,還是Thumb指令。對與不同版本的ARM處理器,T控制位的含義不同。對于ARMv4以及更高版本的T系列的ARM處理器,
T=0表示執(zhí)行ARM指令。
T=1表示執(zhí)行Thumb指令。
對于ARMv5以及更高的版本的非T系列的ARM處理器,T控制位含義如下:
T=0表示執(zhí)行ARM指令。
T=1表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生未定義指令中斷。
3) M控制位
控制位M[4:0]控制處理器模式,具體含義如表3所示。
表3控制位M[4:0] 的含義
M[4:0]
|
處理器模式
|
可訪問的寄存器
|
0b10000
|
User
|
PC,R14一R0,CPSR
|
0b10001
|
FIQ
|
PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq
|
0b10010
|
1RQ
|
PC,R14 _irq-R13 _irq,R12一R0,CPSR,SPSR_ irq
|
0b10011
|
Supervisor
|
PC,R14_ svc-R13 _svc,R12~R0,CPSR,SPSR_svc
|
0b10111
|
Abort
|
PC,R14_abt-R13_abt,R12~R0,CPSR,SPSR_abt
|
0b11011
|
Undefined
|
PC,R14_und-R13_und,R12~R0,CPSR,SPSR_ und
|
|
|
|
CPSR中的其他位用于將來ARM版本的擴(kuò)展。應(yīng)用軟件不要操作這些位,以免與ARM將來版本的擴(kuò)展沖突。
ARM體系使用單—的平板地址空間。該地址空間的大小為232個8位字節(jié)。這些字節(jié)單元的地址是一個無符號的32位數(shù)值,其取值范圍為0到232—1。ARM的地址空間也可以看作是232個32位的字單元。這些字單元的地址可以被4整除,也就是說該地址的低兩位為0b00。地址為A的字?jǐn)?shù)據(jù)包括地址為A、A+I、A+2、A+34個字節(jié)單元的內(nèi)容。
在ARM版本4及以上的版本中,ARM的地址空間也可以看作是231個16位的半字單元。這些半字單元的地址可以被2整除,也就是說該地址的最低位為0b0。地址為A的半字?jǐn)?shù)據(jù)包括地址為A、A+1兩個字節(jié)單元的內(nèi)容。
各存儲單元的地址作為32位的無符號數(shù),可以進(jìn)行常規(guī)的整數(shù)運(yùn)算。這些運(yùn)算的結(jié)果進(jìn)行232取模。也就是說,運(yùn)算結(jié)果發(fā)生上溢出和下溢出時,地址將會發(fā)生卷繞。
在ARM體系中,每個字單元中包含4個字節(jié)單元或者兩個半字單元:1個半字單元中包含兩個字節(jié)單元。但是在字單元中,4個字節(jié)哪一個是高位字節(jié),哪一個是低位字節(jié)則有兩種不同的格式:big-endian格式和little-endian格式。在big-endian格式中,對于地址為A的字單元包括字節(jié)單元A、A+1、A+2及A+3,其中字節(jié)單元由高位到低位字節(jié)順序為A、A+1、A+2、A+3;地址為A的字單元包括半字單元A、A+2,其中半字單元由高位到低位字節(jié)順序為A、A+2:地址為A的半字單元包括字節(jié)單元A、A+1,其中字節(jié)單元由高位到低位字節(jié)順序為A、A+1。
在little-endian格式中,地址為A的字單元包括字節(jié)單元A、A+1、A+2及A+3,其中字節(jié)單元由高位到低位字節(jié)順序為A+3、A+2、A+1、A;地址為A的字單元包括半字節(jié)單元A、A+2,其中半字單元由高位到低位字節(jié)順序為A+2、A;地址為A的半字單元包括字節(jié)單元A、A+1,其中字節(jié)單元由高位到低位字節(jié)順序為A+1、A
ARM處理器包含多少寄存器?每種模式下又有那些寄存器?這些寄存器的作用又是什么?帶著這些問題我們來學(xué)習(xí)ARM寄存器吧!相信看完這篇文章后你會有所收獲。
ARM處理器共有37個寄存器。
它包含31個通用寄存器和6個狀態(tài)寄存器。
=======================================================================================
Usr System Supervisor Abort Undefined 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
=======================================================================================
1.通用寄存器的分類:
a.未備份寄存器,包括R0-R7
對每個未備份寄存器來說,在所有的模式下都是指同一個物理寄存器(例如:Usr下的R0與FIQ下的R0是同一個寄存器)。在異常程序中斷造成模式切換時,由于不同模式使用的是相同的物理寄存器。這可能導(dǎo)致數(shù)據(jù)遭到破壞。未備份寄存器沒有被系統(tǒng)作為別的用途,任何場合均可采用未備份寄存器。
b.備份寄存器,包括R8-R14
對于備份寄存器R8-R12來說,除FIQ模式下其它模式均使用相同的物理寄存器。在FIQ模式下R8_fiq,R9_fiq,
R10_fiq,R11_fiq,R12_fiq。它有自己的物理寄存器。
對于R13和R14寄存器每種模式都有自己的物理寄存器(System與Usr的寄存器相同)當(dāng)異常中斷發(fā)生時,系統(tǒng)使用相應(yīng)模式下的物理寄存器,從而可以避免數(shù)據(jù)遭到破壞。
R13也稱為SP堆棧指針。
R14也稱為LR寄存器
c.程序計數(shù)器,PC
PC寄存器存儲指令地址,由于ARM采用流水機(jī)制執(zhí)行指令,故PC寄存器總是存儲下一條指令的地址。
由于ARM是按照字對齊故PC被讀取后的值的bit[1:0]總是0b00(thumb的bit[0]是0b0)。
2.程序狀態(tài)寄存器
程序狀態(tài)寄存器包含當(dāng)前程序狀態(tài)寄存器和備份狀態(tài)寄存器。
a.CPSR(程序狀態(tài)寄存器)
CPSR在任何處理器模式下都可以被訪問。其結(jié)構(gòu)如下:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
N(Negative)、Z(Zero)、C(Carry)以及V(oVerflow)稱為條件標(biāo)志位。ARM指令根據(jù)CPSR的條件標(biāo)志位來選擇地執(zhí)行。
CPSR條件標(biāo)志位
=======================================================================================
條件標(biāo)志位 含義
----------------------------------------------------------------------------------------------------------------
N N=1 表示運(yùn)算結(jié)果為負(fù)數(shù),N=0 表示運(yùn)算結(jié)果為正數(shù)。
Z Z=1 表示運(yùn)算結(jié)果為0, Z=0 表示運(yùn)算結(jié)果為非零。
C C=1 表示運(yùn)算結(jié)果產(chǎn)生了進(jìn)位。
V V=1 運(yùn)算結(jié)果的符號位發(fā)生了溢出。
Q 在ARMv5 E系列版本中Q=1 表示DSP指令溢出。
在ARMv5以前的版本中沒有Q標(biāo)志位。
=======================================================================================
以下指令會影響CPSR的條件標(biāo)志位
(1)比較指令,如: CMP、CMN、TEQ、TST等。
(2)當(dāng)一些算術(shù)邏輯運(yùn)算的目標(biāo)寄存器不是PC時,這些指令會影響CPSR的條件標(biāo)志位。
(3)MSR與MRS指令可以對CPSR/SPSR進(jìn)行操作。
(4)LDM指令可以將SPSR復(fù)制到CPSR中。
CPSR的控制位
=======================================================================================
控制位 含義
----------------------------------------------------------------------------------------------------------------
I I=1 禁用IRO中斷
F F=1 禁用FIQ中斷
T ARMv4以上T版本T=0 執(zhí)行ARM指令,T=1執(zhí)行Thumb指令。
ARMv5以上非T版本T=0 執(zhí)行ARM指令,T=1表示下一條指令產(chǎn)生未定義指令中斷。M[4:0] 控制處理器模式
0b10000 User
0b10001 FIQ
0b10010 IRQ
0b10011 Supervisor
0b10111 Abort
0b11011 Undefined
0b11111 System
=======================================================================================
b.SPSR(備份狀態(tài)寄存器)
SPSR的結(jié)構(gòu)與CPSR的結(jié)構(gòu)相同,SPSR是用來備份CPSR的。
現(xiàn)在你對ARM處理器的寄存器有一些了解了吧?