1. 程式人生 > >ARM的編程模式及寄存器

ARM的編程模式及寄存器

blog flow 專用 ron -- super 其他 普通 高版本

根據朱老師的課程及下面博客整理

http://blog.chinaunix.net/uid-20443992-id-5700979.html

ARM 采用的是32位架構

ARM 約定:

  Byte 8 bits

  Halfword 16 bits (2 byte)

  Word : 32 bits (4 byte)

大部分ARM core 提供:

  ARM 指令集(32-bit

  Thumb 指令集(16-bit

  Thumb2指令集(16 & 32bit

ARM 7個基本工作模式

  User :非特權模式,大部分任務執行在這種模式。

  FIQ :當一個高優先級(fast)

中斷產生時將會進入這種模式,如高速數據傳輸或通道處理。

  IRQ :當一個低優先級(normal) 中斷產生時將會進入這種模式,通常在硬件中斷信號後進入該模式。

  Supervisor :當復位或軟中斷指令執行時將會進入這種模式,主要用於系統的初始化。

  Abort :當存取異常時將會進入這種模式,當訪問非法地址或讀取無權限內存地址時進入該模式。

  Undef :當執行未定義指令時會進入這種模式,用於支持硬件協處理器的軟件仿真。

  System :使用和User模式相同寄存器集的特權模式

  註意:

  (1)除User(用戶模式)是Normal(普通模式)外,其他

6種都是Privilege(特權模式)。

  (2Privilege中除Sys模式外,其余5種為異常模式。

  (3)各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。

  (4)各種模式下權限和可以訪問的寄存器不同。

ARM7種模式下的寄存器

  ARM共有37寄存器,都是32長度

  37個寄存器中30個為“通用”型,1個固定用作PC,一個固定用作CPSR5個固定用作5種異常模式下的SPSR

技術分享

  圖中有名字相同的寄存器,但是不是同一個寄存器。如r13在不同的模式下都有,但是不同模式下的r13都是不一樣的,這種寄存器叫影子寄存器。

技術分享

  (1)黑色部分的代表共用的寄存器,其他顏色的代表對應工作模式下才有的寄存器。

  (2)為什麽7種模式下的r13是不一樣的?

    r13(sp)是堆棧指針,如果7種模式都是采用同一個堆棧指針的話,在某一個模式中,堆棧出現了問題,則會導致7中模式都奔潰,故7種模式的棧都是不同的。

  (3)r14(lr)是用來存儲返回地址的,每種模式的r14都是不同的寄存器。

  (4)spsr是用於切換模式前,將當前模式的cpsr的內容保存起來,在返回時,再將spsr的值給cpsr。

  (5)PC(Program control register)為程序指針,PC指向哪裏,CPU就會執行哪條指令(所以程序跳轉時就是把目標地址代碼放到PC中)。

  (6)整個CPU中只有一個PC(CPSR也只有一個,但SPSR有5個)。

程序狀態寄存器CPSR

技術分享

  N(Negative)---設置成當前指令運算結果的bit[31]的值。當兩個有符號整數運算時,N=1運算結果為負數,N=0運算結果為正。

Z(Zero)---Z=1運算結果為零;Z=0表示運算的結果不為零。對於CMP指令,Z=1表示進行比較的兩個數大小相等。

C(Carried out)---分四種情況討論

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

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

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

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

V(oVerflow)---對於加減運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1符號為溢出;通常其他指令不影響V位。

I和F---當I=1時禁止IRQ中斷,當F=1時禁止FIQ中斷

T---對於ARM V4以更高版本的T系列ARM處理器,T=0表示執行ARM指令;T=1表示執行Thumb指令

  M[4:0]---定義了的ARM工作模式,具體下中表CSPR[4:0]定義的ARM工作模式。

CPSR[4:0]

處理器模式

可訪問的寄存器

0b10000

USER

R0~R14;PC;CPSR

0b10001

FIQ

R0~R7;R8_FIQ-R14_fiq;PC;CPSR;SPSR_fiq

0b10010

IRQ

R0~R12;R13_irq-R14_irq;PC;CPSR;SPSR_irq

0b10011

SUPERVISOR

R0~R12;R13_svc-R14_svc;PC;CPSR;SPSR_svc

0b10111

ABORT

R0~R12;R13_abt-R14_abt;PC;CPSR;SPSR_abt

0b11011

UNDEFINED

R0~R12;R13_und-R14_und;PC;CPSR;SPSR_und

0b11111

SYSTEM

R0~R14;PC;CPSR

R0~R7

所有工作模式下,R0-R7都分別指向同一個物理寄存器(共8個物理寄存器),它們未被系統用作特殊的用途。在中斷或異常處理進行工作模式轉換時,由於不同工作模式均使用相同的物理寄存器,可能造成寄存器中數據的破壞。

R8~R12

User&System、IRQ、Svc、Abt和Und模式下訪問的R8~R12都是同一個物理寄存器(共5個物理寄存器);在FIQ模式下,訪問的R8_fiq~R12_fiq是另外獨立的物理寄存器(共5個物理寄存器)。

R13R14

在User&System、IRQ、FIQ、Svc、Abt和Und訪問的R13_~R14都是各自模式下獨立的物理寄存器(共12個物理寄存器)。

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

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

R14稱為鏈接寄存器(Link Register),當執行子程序調用指令(BL)時,R14可得到R15(程序計數器PC)的備份。在每一種工作模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值復制給R14,執行完子程序後,又將R14的值復制回PC,即可完成子程序的調用返回。以上的描述可用指令完成。

  執行以下任意一條指令:

MOV PC, LR

BX LR

  在子程序入口處使用以下指令將R14存入堆棧:

STMFD SP!,{,LR}

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

LDMFD SP!,{,PC}

程序計數器PC(R15)

所有工作模式下訪問的R15都是同一個物理寄存器,由於ARM體系結構采用了多級流水線技術,對於ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字節(每個ARM指令四個字節)

CPSRSPSR

R16用作CPSR(Current Program Status Register,當前程序狀態寄存器),CPSR可在任何工作模式下被訪問,它包括條件標誌位、中斷禁止位、當前處理器模式標誌位,以及其他一些相關的控制和狀態位。

每一種工作模式下又都有一個專用的物理狀態寄存器,稱為SPSR(Specified Program Status Register,備份的程序狀態寄存器),當異常發生時,SPSR用於保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。

User模式和System模式不屬於異常模式,它們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的。

ARM的編程模式及寄存器