ARM寄存器介紹

ARM處理器共有37個寄存器。其中包括:31個通用寄存器,包括程序計數器(PC)在內。這些寄存器都是32位寄存器。以及6個32位狀態寄存器。但目前只使用了其中12位。ARM處理器共有7種不同的處理器模式,在每一種處理器模式中有一組相應的寄存器組。任意時刻(也就是任意的處理器模式下),可見的寄存器包括15個通用寄存器(R0~R14)、一個或兩個狀態寄存器及程序計數器(PC)。在所有的寄存器中,有些是各模式共用的同一個物理寄存器;有一些寄存器是各模式自己擁有的獨立的物理寄存器。表1列出了各處理器模式下可見的寄存器情況。 

 

表1  各種處理器模式下的寄存器

用戶模式

系統模式

特權模式

中止模式

未定義指令模式

外部中斷模式

快速中斷模式

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。程序計數器PC,即R15。

未備份寄存器

未備份寄存器包括R0~R7。對於每一個未備份寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。在異常中斷造成處理器模式切換時,由於不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數據被破壞。未備份寄存器沒有被系統用於特別的用途,任何可採用通用寄存器的應用場合都可以使用未備份寄存器。

備份寄存器

對於備份寄存器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中常用作棧指針。在ARM指令集中,這只是一種習慣的用法,並沒有任何指令強制性的使用R13作爲棧指針,用戶也可以使用其他的寄存器作爲棧指

針;而在Thumb指令集中,有一些指令強制性地使用R13作爲棧指針。

每一種異常模式擁有自己的物理的R13。應用程序初始化該R13,使其指向該異常模式專用的棧地址。當進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運行現場。

寄存器R14又被稱爲連接寄存器(Link Register,LR),在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的物理R14中存放在當前子程序的返回地址。當通過BL或BLX指令調用子程序時,R14被設置成該子程序的返回地址。在子程序中,當把R14的值複製到程序計數器PC中時,子程序即返回。

當異常中斷髮生時,該異常模式特定的物理R14被設置成該異常模式將要返回的地址,對於有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與上面的子程序返回方式基本相同。

R14寄存器也可以作爲通用寄存器使用。   

程序計數器R15

程序計數器R15又被記作PC。它雖然可以作爲一般的通用寄存器使用,但是有一些指令在使用R15時有一些特殊限制。當違反了這些限制時,該指令執行的結果將是不可預料的。

由於ARM採用了流水線機制,當正確讀取了PC的值時,該值爲當前指令地址值加8個字節。也就是說,對於ARM指令集來說,PC指向當前指令的下兩條指令的地址。

由於ARM指令是字對齊的,PC值的第0位和第1位總爲0。需要注意的是,當使用指令STR/STM保存R15時,保存的可能是當前指令地址值加8字節,也可能保存的是當前指令地址加12字節。到底是哪種方式,取決於芯片具體設計方式。無論如何,在同一芯片中,要麼採用當前指令地址加8,要麼採用當前指令地址加12,不能有些指令採用當前指令地址加8,另一些指令採用當前指令地址加12。因此對於用戶來說,儘量避免使用STR/STM指令來保存R15的值。當不可避免這種使用方式時,可以先通過一些代碼來確定所用的芯片使用的是哪種實現方式。

對於ARM版本4以及更高的版本,程序必須保證寫入R15寄存器的地址值的bits[1:0]爲0b00;否則將會產生不可預知的結果。

對於Thumb指令集來說,指令是半字對齊的。處理器將忽略bit[0],即寫入R15的地址值首先與0XFFFFFFFC做與操作,再寫入R15中。

還有—些指令對於R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來確定是ARM指令,還是Thumb指令。這種讀取PC值和寫入PC值的不對稱的操作需要特別注意。

程序狀態寄存器

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(RAZ)

I

F

T

M4

M3

M2

M1

M0

 

條件標誌位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統稱爲條件標誌位。大部分的ARM指令可以根據CPSR中的這些條件標誌位來選擇性地執行。各條件標誌位的具體含義如表2所示。

 

表2 CPSR中的條件標誌位

標誌位  

含  義

N

本位設置成當前指令運算結果的bit[31)的值

當兩個補碼錶示的有符號整數運算時,N=I表示運算的結果爲負數;N=0表示結果爲正數或零

Z

Z=1表示運算的結果爲零;Z=0表示運算的結果不爲零。

對於CMP指令,Z=1表示進行比較的兩個數大小相等。

下面分4種情況討論C的設置方法:

在加法指令中(包括比較指令CMN),當結果產生了進位,則C=1,表示無符號數運算髮生上溢出;其他情況下C=0。

在減法指令中(包括比較指令CMP),當運算中發生借位則C=0表示無符號數運算髮生下溢出;其他情況下C=1。

對於包含移位操作的非加/減法運算指令,C中包含最後一次溢出的位數數值。

對於其他非加/減法運算指令,C位的值通常不受影響。

V  

對於加/減法運算指令,當操作數和運算結果爲二進制的補碼錶示的帶符號數時V=1表示符號位溢出。

通常其他的指令不影響V位,具體可參考各指令的說明。

 

Q標誌位

在ARMv5的E系列處理器中,CPSR的bit[27]稱爲Q標誌位,主要用於指示增強的

DSP指令是否發生了溢出。同樣的SPSR中的bit[27]也稱爲Q標誌位,用於在異常中斷髮生時保存和恢復CPSR中的Q標誌位。

在ARM v5以前的版本及ARM v5的非E系列的處理器中,Q標誌位沒有被定義。CPSR的bit[27]屬於DNM(RAZ)。

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=0表示執行ARM指令。

T=1表示執行Thumb指令。

對於ARMv5以及更高的版本的非T系列的ARM處理器,T控制位含義如下:

T=0表示執行ARM指令。

T=1表示強制下一條執行的指令產生未定義指令中斷。

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中的其他位

CPSR中的其他位用於將來ARM版本的擴展。應用軟件不要操作這些位,以免與ARM將來版本的擴展衝突。

ARM體系中的存儲空間

ARM體系使用單—的平板地址空間。該地址空間的大小爲232個8位字節。這些字節單元的地址是一個無符號的32位數值,其取值範圍爲0到232—1。ARM的地址空間也可以看作是232個32位的字單元。這些字單元的地址可以被4整除,也就是說該地址的低兩位爲0b00。地址爲A的字數據包括地址爲A、A+I、A+2、A+34個字節單元的內容。

在ARM版本4及以上的版本中,ARM的地址空間也可以看作是231個16位的半字單元。這些半字單元的地址可以被2整除,也就是說該地址的最低位爲0b0。地址爲A的半字數據包括地址爲A、A+1兩個字節單元的內容。

各存儲單元的地址作爲32位的無符號數,可以進行常規的整數運算。這些運算的結果進行232取模。也就是說,運算結果發生上溢出和下溢出時,地址將會發生卷繞。

ARM存儲器格式

在ARM體系中,每個字單元中包含4個字節單元或者兩個半字單元:1個半字單元中包含兩個字節單元。但是在字單元中,4個字節哪一個是高位字節,哪一個是低位字節則有兩種不同的格式:big-endian格式和little-endian格式。在big-endian格式中,對於地址爲A的字單元包括字節單元A、A+1、A+2及A+3,其中字節單元由高位到低位字節順序爲A、A+1、A+2、A+3;地址爲A的字單元包括半字單元A、A+2,其中半字單元由高位到低位字節順序爲A、A+2:地址爲A的半字單元包括字節單元A、A+1,其中字節單元由高位到低位字節順序爲A、A+1。  

在little-endian格式中,地址爲A的字單元包括字節單元A、A+1、A+2及A+3,其中字節單元由高位到低位字節順序爲A+3、A+2、A+1、A;地址爲A的字單元包括半字節單元A、A+2,其中半字單元由高位到低位字節順序爲A+2、A;地址爲A的半字單元包括字節單元A、A+1,其中字節單元由高位到低位字節順序爲A+1、A

ARM處理器包含多少寄存器?每種模式下又有那些寄存器?這些寄存器的作用又是什麼?帶着這些問題我們來學習ARM寄存器吧!相信看完這篇文章後你會有所收穫。
ARM處理器共有37個寄存器。
它包含31個通用寄存器和6個狀態寄存器。

=======================================================================================
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下的R0FIQ下的R0是同一個寄存器)。在異常程序中斷造成模式切換時,由於不同模式使用的是相同的物理寄存器。這可能導致數據遭到破壞。未備份寄存器沒有被系統作爲別的用途,任何場合均可採用未備份寄存器。
b.備份寄存器,包括R8-R14
    對於備份寄存器R8-R12來說,FIQ模式下其它模式均使用相同的物理寄存器。在FIQ模式下R8_fiq,R9_fiq,
R10_fiq,R11_fiq,R12_fiq。它有自己的物理寄存器。
    對於R13R14寄存器每種模式都有自己的物理寄存器(SystemUsr的寄存器相同)當異常中斷髮生時,系統使用相應模式下的物理寄存器,從而可以避免數據遭到破壞。
   R13也稱爲SP堆棧指針。
   R14也稱爲LR寄存器
c.程序計數器,PC
   PC寄存器存儲指令地址,由於ARM採用流水機制執行指令,PC寄存器總是存儲下一條指令的地址。
   由於ARM是按照字對齊故PC被讀取後的值的bit[1:0]總是0b00(thumbbit[0]0b0)

2.程序狀態寄存器
程序狀態寄存器包含當前程序狀態寄存器和備份狀態寄存器。
a.CPSR(程序狀態寄存器)
CPSR在任何處理器模式下都可以被訪問。其結構如下:

  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)稱爲條件標誌位。ARM指令根據CPSR的條件標誌位來選擇地執行。

CPSR條件標誌位
=======================================================================================
條件標誌位                   含義
----------------------------------------------------------------------------------------------------------------
N                            N=1 表示運算結果爲負數,N=0 表示運算結果爲正數。               
Z                            Z=1 表示運算結果爲0, Z=0 表示運算結果爲非零。
C                            C=1 表示運算結果產生了進位。
V                            V=1 運算結果的符號位發生了溢出。
Q                            ARMv5 E系列版本中Q=1 表示DSP指令溢出。
                             ARMv5以前的版本中沒有Q標誌位。
=======================================================================================
以下指令會影響CPSR的條件標誌位
(1)比較指令,: CMPCMNTEQTST等。
(2)當一些算術邏輯運算的目標寄存器不是PC時,這些指令會影響CPSR的條件標誌位。
(3)MSRMRS指令可以對CPSR/SPSR進行操作。
(4)LDM指令可以將SPSR複製到CPSR中。

CPSR的控制位
=======================================================================================
控制位                        含義
----------------------------------------------------------------------------------------------------------------
I                             I=1 禁用IRO中斷
F                             F=1 禁用FIQ中斷
T                             ARMv4以上T版本T=0 執行ARM指令,T=1執行Thumb指令。
                              ARMv5以上非T版本T=0 執行ARM指令,T=1表示下一條指令產生未定義指令中斷。M[4:0]                        控制處理器模式
                              0b10000      User
                              0b10001      FIQ
                              0b10010      IRQ
                              0b10011      Supervisor
                              0b10111      Abort
                              0b11011      Undefined
                              0b11111      System      
=======================================================================================
b.SPSR(備份狀態寄存器)
SPSR的結構與CPSR的結構相同,SPSR是用來備份CPSR的。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章