天天看點

ARM處理器模式及寄存器

一、ARM處理器模式:

  • ARM微處理器支援7種運作模式,分别為:
使用者模式(usr):       ARM處理器正常的程式執行狀态。 快速中斷模式(fiq):用于高速資料傳輸或通道處理。 外部中斷模式(irq):用于通用的中斷處理。 管理模式(svc):       作業系統使用的保護模式。軟中斷和複位 資料通路中止模式(abt):     當資料或指令預取終止時進入該模式,可用于虛拟存儲及存儲保護。 系統模式(sys):                     運作具有特權的作業系統任務。 未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用于支援硬體協處理器的軟體仿真
  • 除使用者模式外的其餘6種模式都稱為特權模式,這些模式下,程式可以通路所有的系統資源,也可以任一進行處理器模式切換。其中,除系統模式外,其他5種模式又稱為異常模式

二、ARM寄存器

(一)ARM工作狀态下的寄存器組織

ARM處理器共有37個寄存器。其中包括:

  • 31個通用寄存器,包括程式計數器(PC)在内。這些寄存器都是32位寄存器
  • 6個32位狀态寄存器。

表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
  • 當發生異常中斷時,處理器進入相應的異常模式。在每一種異常模式下都有相應的一組寄存器,供相應的異常處理程式使用,這樣就可以保證在進入異常模式時,使用者模式下的寄存器(儲存了程式運作狀态)不被破壞。
  • 系統模式不是通過異常進入的,他和使用者模式具有完全一樣的寄存器

1、通用寄存器 通用寄存器通常分為以下三類: 未備份寄存器:R0——R7 備份寄存器:R8——R14 程式計數器PC,即R15 未備份寄存器 R0——R7 : R0~R7。在所有的處理器模式下指的都是同一個實體寄存器。在異常中斷造成處理器模式切換時,由于不同的處理器模式使用相同的實體寄存器,可能造成寄存器中資料被破壞。 備份寄存器R8~R14:

(1)寄存器R8~R12

每個寄存器對應兩個不同的實體寄存器。例如,當使用快速中斷模式下的寄存器時,寄存器R8和寄存器R9分别記作R8_fiq、R9_fiq;當使用使用者模式下的寄存器時,寄存器R8和寄存器R9分别記作R8_usr、R9_usr等。在這兩種情況下使用的是不同的實體寄存器。系統沒有将這幾個寄存器用于任何的特殊用途,但是當中斷處理非常簡單,僅僅使用R8~R14寄存器時,FIQ處理程式可以不必執行儲存和恢複中斷現場的指令,進而可以使中斷處理過程非常迅速。對于備份寄存器R13和R14來說,每個寄存器對應6個不同的實體寄存器,其中的一個是使用者模式和系統模式共用的;另外的5個對應于其他5種處理器模式。 (2)寄存器R13在ARM中常用作棧指針(Stack Point,SP)

  • 在ARM指令集中,這隻是一種習慣的用法,并沒有任何指令強制性的使用R13作為棧指針,使用者也可以使用其他的寄存器作為棧指針;而在Thumb指令集中,有一些指令強制性地使用R13作為棧指針。
  • 每一種異常模式擁有自己的實體的R13。應用程式初始化該R13,使其指向該異常模式專用的棧位址。當進入異常模式時,可以将需要使用的寄存器儲存在R13所指的棧中;當退出異常處理程式時,将儲存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程式不會破壞被其中斷程式的運作現場。

(3)寄存器R14又被稱為連接配接寄存器(Link Register,LR)

  • 在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的實體R14中存放在目前子程式的傳回位址。當通過BL或BLX指令調用子程式時,R14被設定成該子程式的傳回位址。在子程式中,當把R14的值複制到程式計數器PC中時,子程式即傳回。
  • 當異常中斷發生時,該異常模式特定的實體R14被設定成該異常模式将要傳回的位址,對于有些異常模式,R14的值可能與将傳回的位址有一個常數的偏移量。具體的傳回方式與上面的子程式傳回方式基本相同。
  • R14寄存器也可以作為通用寄存器使用。

程式計數器R15(PC)

  • 程式計數器R15又被記作PC。它雖然可以作為一般的通用寄存器使用,但是有一些指令在使用R15時有一些特殊限制。當違反了這些限制時,該指令執行的結果将是不可預料的。
  • 由于ARM采用了流水線機制,當正确讀取了PC的值時,該值為目前指令位址值加8個位元組。也就是說,對于ARM指令集來說,PC指向目前指令的下兩條指令的位址。(因為ARM使用RISC精簡指令集,ARM的一條指令所占記憶體為32位,4個位元組。是以當一條指令正确讀取時,該寄存器指向目前指令位址加8,即指向下兩條指令的位址)
  • 當成功地向R15中寫入一個位址數值時,程式将跳到該位址執行。 由于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的位址值首先與0XFFFFFFFE做與操作,再寫入R15中。
  • 還有—些指令對于 R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來确定是ARM指令,還是Thumb指令。這種讀取PC值和寫入PC值的不對稱的操作需要特别注意。

注:PC指向的位址是取指單元要取指令的位址,而不是目前執行的指令。 2、程式狀态寄存器 CPSR(目前程式狀态寄存器)可以在任何處理器模式下被通路。它包含了條件标志位、中斷禁止位、目前處理器模式标志以及其他的一些控制和狀态位。每一種處理器模式下都有一個專用的實體狀态寄存器,稱為SPSR(備份程式狀态寄存器)。當特定的異常中斷發生時,這個寄存器用于存放目前程式狀态寄存器(CPSR)的内容。在異常中斷程式退出時,可以用SPSR中儲存的值來恢複CPSR。 由于使用者模式和系統模式不是異常中斷模式,是以它們沒有SPSR。當在使用者模式或系統模式中通路SPSR,将會産生不可預知的結果。 CPSR的格式如下所示。SPSR格式與CPSR格式相同。

31 30 29 28 27 26 7 6 5 4 3 2 1
N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0

1.條件标志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統稱為條件标志位。大部分的ARM指令可以根據CPSR中的這些條件标志位來選擇性地執行。

在ARM狀态下,絕大多數的指令都是有條件執行的。

在Thumb狀态下,僅有分支指令是有條件執行的。

N  Negative        對于有符号運算,如果結果是負數則置位
  Z  Zero            如果結果是零則置位
  C  Carry           對于無符号運算,如果發生進位則置位
  V  Overflow        對于有符号運算,如果發生溢出則置位
  I  IRQ             中斷禁用
  F  FIQ             快速中斷禁用      
标志位  含  義
N 本位設定成目前指令運算結果的bit[31]的值 當兩個補碼表示的有符号整數運算時,N=1表示運算的結果為負數;N=0表示結果為正數或零
Z Z=1表示運算的結果為零;Z=0表示運算的結果不為零。 對于CMP指令,Z=1表示進行比較的兩個數大小相等。
C 下面分4種情況讨論C的設定方法: 在加法指令中(包括比較指令CMN),當結果産生了進位,則C=1,表示無符号數運算發生上溢出;其他情況下C=0。 在減法指令中(包括比較指令CMP),當運算中發生借位則C=0表示無符号數運算發生下溢出;其他情況下C=1。 對于包含移位操作的非加/減法運算指令,C中包含最後一次溢出的位數數值。 對于其他非加/減法運算指令,C位的值通常不受影響。
對于加/減法運算指令,當操作數和運算結果為二進制的補碼表示的帶符号數時V=1表示符号位溢出。 通常其他的指令不影響V位,具體可參考各指令的說明。

2.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)。

3.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

4.CPSR中的其他位

     CPSR中的其他位用于将來ARM版本的擴充。應用軟體不要操作這些位,以免與ARM将來版本的擴充沖突。

(二)Thumb工作狀态下的寄存器組織

Thumb狀态下的寄存器集是ARM狀态下寄存器集的一個子集,程式可以直接通路8個通用寄存器(R7~R0)、程式計數器(PC)、堆棧指針(SP)、 連接配接寄存器(LR)和CPSR。同時,在每一種特權模式下都有一組SP、LR和SPSR。圖2.4表明Thumb狀态下的寄存器組織。

ARM處理器模式及寄存器

Thumb狀态下的寄存器組織與ARM狀态下的寄存器組織的關系:

       ─ Thumb狀态下和ARM狀态下的R0~R7是相同的。

       ─ Thumb狀态下和ARM狀态下的CPSR和所有的SPSR是相同的。

       ─ Thumb狀态下的SP對應于ARM狀态下的R13。

       ─ Thumb狀态下的LR對應于ARM狀态下的R14。

       ─ Thumb狀态下的程式計數器對應于ARM狀态下R15

以上的對應關系如圖2.5所示:

ARM處理器模式及寄存器

通路THUMB狀态下的高位寄存器(Hi-registers):

       在Thumb狀态下,高位寄存器R8~R15并不是标準寄存器集的一部分,但可使用彙編語言程式受限制的通路這些寄存器,将其用作快速的暫存器。使用帶特殊變量的MOV指令,資料可以在低位寄存器和高位寄存器之間進行傳送;高位寄存器的值可以使用CMP和ADD指令進行比較或加上低位寄存器中的值。