ARM寄存器介紹

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

  • 31個通用寄存器,包括程序計數器(PC)在內。這些寄存器都是32位寄存器。
  • 6個狀態寄存器,這些寄存器都是32位寄存器,可是目前只是用其中的12位。

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

  • 未備份寄存器,包括R0~R7;
  • 備份寄存器,包括R8~R14;
  • 程序計數器,即R15。

未備份寄存器: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中的條件標誌位:

  • 比較指令,如CMP、CMN、TEQ和TST等;
  • 當一些算數運算指令和邏輯指令的目標寄存器不是R15時,這些指令會影響CPSR中的條件標誌位;
  • MSR指令能夠向CPSR/SPSR中寫入新值;
  • MSC指令將R15做爲目標寄存器時,能夠把協處理器產生的條件標誌位的值傳送到ARM處理器;
  • 一些LDM指令的變種指令能夠將SPSR的值複製到CPSR中,這種操做注意用於從異常中斷程序中返回;
  • 一些帶「位設置」的算術和邏輯指令的變種指令,也能夠將SPSR的值複製到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未來版本的擴展衝突。

相關文章
相關標籤/搜索