ARM的編程模式及寄存器
根據朱老師的課程及下面博客整理
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(普通模式)外,其他
(2)Privilege中除Sys模式外,其余5種為異常模式。
(3)各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。
(4)各種模式下權限和可以訪問的寄存器不同。
ARM中7種模式下的寄存器
ARM共有37個寄存器,都是32位長度
37個寄存器中30個為“通用”型,1個固定用作PC,一個固定用作CPSR,5個固定用作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個物理寄存器)。
R13和R14
在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指令四個字節)。
CPSR和SPSR
R16用作CPSR(Current Program Status Register,當前程序狀態寄存器),CPSR可在任何工作模式下被訪問,它包括條件標誌位、中斷禁止位、當前處理器模式標誌位,以及其他一些相關的控制和狀態位。
每一種工作模式下又都有一個專用的物理狀態寄存器,稱為SPSR(Specified Program Status Register,備份的程序狀態寄存器),當異常發生時,SPSR用於保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。
User模式和System模式不屬於異常模式,它們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的。
ARM的編程模式及寄存器