天天看點

Arm處理器模式與寄存器配置設定

ARM處理器狀态

ARM微處理器的工作狀态一般有兩種,并可在兩種狀态之間切換:

第一種為ARM狀态,此時處理器執行32位的字對齊的ARM指令;

第二種為Thumb狀态,此時處理器執行16位的、半字對齊的Thumb指令。

在程式的執行過程中,微處理器可以随時在兩種工作狀态之間切換,并且,處理器工作狀态的轉變并不影響處理器的工作模式和相應寄存器中的内容。但ARM微處理器在開始執行代碼時,應該處于ARM狀态。

ARM處理器狀态

進入Thumb狀态:當操作數寄存器的狀态位(位0)為1時,可以采用執行BX指令的方法, 使微處理器從ARM狀态切換到Thumb狀态。此外,當處理器處于Thumb狀态時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則 異常處理傳回時,自動切換到Thumb狀态。

進入ARM狀态:當操作數寄存器的狀态位為0時,執行BX指令時可以使微處理器從Thumb狀态切換到ARM狀态。此外,在處理器進行異常處理時,把PC指針放入異常模式連結寄存器中,并從異常向量位址開始執行程式,也可以使處理器切換到ARM狀态。

ARM處理器模式

ARM微處理器支援7種運作模式,分别為:

使用者模式(usr):ARM處理器正常的程式執行狀态。

快速中斷模式(fiq):用于高速資料傳輸或通道處理。

外部中斷模式(irq):用于通用的中斷處理。

管理模式(svc):作業系統使用的保護模式。

資料通路終止模式(abt):當資料或指令預取終止時進入該模式,可用于虛拟存儲及存儲保護。

系統模式(sys):運作具有特權的作業系統任務。

定義指令中止模式(und):當未定義的指令執行時進入該模式,可用于支援硬體協處理器的軟體仿真。

ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,6個為狀态寄存器。但是這些寄存器不能被同時通路,具體哪些寄存器是可程式設計通路的,取決 微處理器的工作狀态及具體的運作模式。但在任何時候,通用寄存器R14~R0、程式計數器PC、一個或兩個狀态寄存器都是可通路的。

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

通用寄存器:

通用寄存器包括R0~R15,可以分為三類:

        ─ 未分組寄存器R0~R7;

        ─ 分組寄存器R8~R14

        ─ 程式計數器PC(R15)

未分組寄存器R0~R7:

       在所有的運作模式下,未分組寄存器都指向同一個實體寄存器,他們未被系統用作特殊的用途,是以,在中斷或異常處理進行運作模式轉換時,由于不同的處理器運作模式均使用相同的實體寄存器,可能會造成寄存器中資料的破壞,這一點在進行程式設計時應引起注意。

分組寄存器R8~R14

       對于分組寄存器,他們每一次所通路的實體寄存器與處理器目前的運作模式有關。

       對于R8~R12來說,每個寄存器對應兩個不同的實體寄存器,當使用fiq模式時,通路寄存器R8_fiq~R12_fiq;當使用除fiq模式以外的其他模式時,通路寄存器R8_usr~R12_usr。

       對于R13、R14來說,每個寄存器對應6個不同的實體寄存器,其中的一個是使用者模式與系統模式共用,另外5個實體寄存器對應于其他5種不同的運作模式。

采用以下的記号來區分不同的實體寄存器:

R13_<mode>

R14_<mode>

其中,mode為以下幾種模式之一:usr、fiq、irq、svc、abt、und。

       寄存器R13在ARM指令中常用作堆棧指針,但這隻是一種習慣用法,使用者也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強制性的要求使用R13作為堆棧指針。

       由于處理器的每種運作模式均有自己獨立的實體寄存器R13,在使用者應用程式的初始化部分,一般都要初始化每種模式下的R13,使其指向該運作模式的棧空 間,這樣,當程式的運作進入異常模式時,可以将需要保護的寄存器放入R13所指向的堆棧,而當程式從異常模式傳回時,則從對應的堆棧中恢複,采用這種方式 可以保證異常發生後程式的正常執行。

       R14也稱作子程式連接配接寄存器(Subroutine Link Register)或連接配接寄存器LR。當執行BL子程式調用指令時,R14中得到R15(程式計數器PC)的備份。其他情況下,R14用作通用寄存器。與 之類似,當發生中斷或異常時,對應的分組寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用來儲存R15的傳回 值。

寄存器R14常用在如下的情況:

       在每一種運作模式下,都可用R14儲存子程式的傳回位址,當用BL或BLX指令調用子程式時,将PC的目前值拷貝給R14,執行完子程式後,又将R14的值拷貝回PC,即可完成子程式的調用傳回。以上的描述可用指令完成:

1、執行以下任意一條指令:

MOV PC,LR

BX LR

2、在子程式入口處使用以下指令将R14存入堆棧:

STMFD SP!,{<Regs>,LR}

對應的,使用以下指令可以完成子程式傳回:

LDMFD SP!,{<Regs>,PC}

R14也可作為通用寄存器。

程式計數器PC(R15)

       寄存器R15用作程式計數器(PC)。在ARM狀态下,位[1:0]為0,位[31:2]用于儲存PC;在Thumb狀态下,位[0]為0,位 [31:1]用于儲存PC;雖然可以用作通用寄存器,但是有一些指令在使用R15時有一些特殊限制,若不注意,執行的結果将是不可預料的。在ARM狀态 下,PC的0和1位是0,在Thumb狀态下,PC的0位是0。

       R15雖然也可用作通用寄存器,但一般不這麼使用,因為對R15的使用有一些特殊的限制,當違反了這些限制時,程式的執行結果是未知的。

       由于ARM體系結構采用了多級流水線技術,對于ARM指令集而言,PC總是指向目前指令的下兩條指令的位址,即PC的值為目前指令的位址值加8個位元組。

Arm處理器模式與寄存器配置設定

       在ARM狀态下,任一時刻可以通路以上所讨論的16個通用寄存器和一到兩個狀态寄存器。在非使用者模式(特權模式)下,則可通路到特定模式分組寄存器,圖2.3說明在每一種運作模式下,哪一些寄存器是可以通路的。

寄存器R16:

       寄存器R16用作CPSR(Current Program Status Register,目前程式狀态寄存器),CPSR可在任何運作模式下被通路,它包括條件标志位、中斷禁止位、目前處理器模式标志位,以及其他一些相關的控制和狀态位。

       每一種運作模式下又都有一個專用的實體狀态寄存器,稱為SPSR(Saved Program Status Register,備份的程式狀态寄存器),當異常發生時,SPSR用于儲存CPSR的目前值,從異常退出時則可由SPSR來恢複CPSR。

       由于使用者模式和系統模式不屬于異常模式,他們沒有SPSR,當在這兩種模式下通路SPSR,結果是未知的。

二、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指令進行比較或加上低位寄存器中的值。

程式狀态寄存器

       ARM體系結構包含一個目前程式狀态寄存器(CPSR)和五個備份的程式狀态寄存器(SPSRs)。備份的程式狀态寄存器用來進行異常處理,其功能包括:

      ─ 儲存ALU中的目前操作資訊

      ─ 控制允許和禁止中斷

      ─ 設定處理器的運作模式

程式狀态寄存器的每一位的安排如圖2.6所示:

Arm處理器模式與寄存器配置設定

條件碼标志(Condition Code Flags)

       N、Z、C、V均為條件碼标志位。它們的内容可被算術或邏輯運算的結果所改變,并且可以決定某條指令是否被執行。

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

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

繼續閱讀