1.ARM的7種工作模式
ARMv4和ARMv5的指令集規(guī)定了ARM的7種工作模式,由寄存器CPSR[4:0]決定(見下表),分別是
用戶(User)模式:ARM處理器正常的程序執(zhí)行狀態(tài)
系統(tǒng)(System)模式:運行具有特權(quán)的操作系統(tǒng)任務(wù)
快速中斷(FIQ)模式:用于處理緊急的中斷,如高速數(shù)據(jù)傳輸或通道處理
普通中斷(IRQ)模式:用于處理通用的中斷,通常在硬件中斷信號后進入該模式
管理(Supervisor)模式:操作系統(tǒng)使用的保護模式,是CPU上電后的默認模式,主要用于系統(tǒng)的初始化
數(shù)據(jù)訪問終止(Abort)模式:用于虛擬存儲及存儲保護,當訪問非法地址或讀取無權(quán)限內(nèi)存地址時進入該模式
未定義指令中止(Undifined)模式:當執(zhí)行未定義的指令時進入該模式,用于支持硬件協(xié)處理器的軟件仿真
現(xiàn)在ARMv6和ARMv7指令集做出了改變,由MSP(主堆棧指針)和PSP(進程堆棧指針),用戶模式和特權(quán)模式組合成4種工作模式,將其他模式整合到異常向量表中,干凈簡潔舒服啦。
2.ARM寄存器
ARM共有37個32位物理寄存器,7種工作模式下可訪問的寄存器見下表,User和System使用完全相同的物理寄存器。
2.1 R0~R7
所有工作模式下,R0-R7都分別指向同一個物理寄存器(共8個物理寄存器),它們未被系統(tǒng)用作特殊的用途。在中斷或異常處理進行工作模式轉(zhuǎn)換時,由于不同工作模式均使用相同的物理寄存器,可能造成寄存器中數(shù)據(jù)的破壞。
2.2 R8~R12
在User&System、IRQ、Svc、Abt和Und模式下訪問的R8~R12都是同一個物理寄存器(共5個物理寄存器);在FIQ模式下,訪問的R8_fiq~R12_fiq是另外獨立的物理寄存器(共5個物理寄存器)。
2.3 R13和R14
在User&System、IRQ、FIQ、Svc、Abt和Und訪問的R13_
R13在ARM指令中常用作堆棧指針(SP),但這只是一種習(xí)慣用法,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強制性的要求使用R13作為堆棧指針。
由于處理器的每種工作模式均有自己獨立的物理寄存器R13,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該工作模式的??臻g。這樣,當程序進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行。
R14稱為鏈接寄存器(Link Register),當執(zhí)行子程序調(diào)用指令(BL)時,R14可得到R15(程序計數(shù)器PC)的備份。在每一種工作模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調(diào)用子程序時,將PC的當前值復(fù)制給R14,執(zhí)行完子程序后,又將R14的值復(fù)制回PC,即可完成子程序的調(diào)用返回。以上的描述可用指令完成。
執(zhí)行以下任意一條指令:
MOV PC, LR
BX LR
在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!,{,LR}
對應(yīng)的,使用以下指令可以完成子程序返回:
LDMFD SP!,{,PC}
R14也可作為通用寄存器。
2.4 程序計數(shù)器PC(R15)
所有工作模式下訪問的R15都是同一個物理寄存器,由于ARM體系結(jié)構(gòu)采用了多級流水線技術(shù),對于ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字節(jié)。
在ARM狀態(tài)下,R15[1:0]為0,R15[31:2]用于保存PC;在Thumb狀態(tài)下,R15[0]為0,R15[31:1]用于保存PC。
2.5 CPSR和SPSR
R16用作CPSR(CurrentProgram Status Register,當前程序狀態(tài)寄存器),CPSR可在任何工作模式下被訪問,它包括條件標志位、中斷禁止位、當前處理器模式標志位,以及其他一些相關(guān)的控制和狀態(tài)位。
每一種工作模式下又都有一個專用的物理狀態(tài)寄存器,稱為SPSR(Specified Program Status Register,備份的程序狀態(tài)寄存器),當異常發(fā)生時,SPSR用于保存CPSR的當前值,從異常退出時則可由SPSR來恢復(fù)CPSR。
User模式和System模式不屬于異常模式,它們沒有SPSR,當在這兩種模式下訪問SPSR,結(jié)果是未知的。
2.6 CPSR各標志位含義
31302928272676543210NZCVQDNM(RAZ)IFTM4M3M2M1M0N(Negative)---設(shè)置成當前指令運算結(jié)果的bit[31]的值。當兩個有符號整數(shù)運算時,N=1運算結(jié)果為負數(shù),N=0運算結(jié)果為正。
Z(Zero)---Z=1運算結(jié)果為零;Z=0表示運算的結(jié)果不為零。對于CMP指令,Z=1表示進行比較的兩個數(shù)大小相等。
C(Carried out)---分四種情況討論
1)在加法指令中(包括比較指令CMP),當結(jié)果產(chǎn)生進位,則C=1,表示無符號運算發(fā)生上溢出;其他情況C=0。
2)在減法指令中(包括減法指令CMP),當運算發(fā)生借位,則C=0,表示無符號運算發(fā)生下溢出;其他情況下C=1。
3)對于包含移位操作的非加減運算指令,C中包含最后一次溢出的位的數(shù)值
4)對于其他非加減運算指令,C位的值通常不受影響
V(oVerflow)---對于加減運算指令,當操作數(shù)和運算結(jié)果為二進制的補碼表示的帶符號數(shù)時,V=1符號為溢出;通常其他指令不影響V位。
Q---在ARM V5的E系列處理器中,CPSR的bit[27]稱為Q標識位,主要用于指示增強的DSP指令是否發(fā)生了溢出。同樣的spsr的bit[27]位也稱為Q標識位,用于在異常中斷發(fā)生時保存和恢復(fù)CPSR中的Q標識位。在ARM V5以前的版本及ARM V5的非E系列的處理器中,Q標識位沒有被定義。
I和F---當I=1時禁止IRQ中斷,當F=1時禁止FIQ中斷
T---對于ARM V4以更高版本的T系列ARM處理器,T=0表示執(zhí)行ARM指令;T=1表示執(zhí)行Thumb指令
對于ARM V5以及更高版本的非T系列處理器,T=0表示執(zhí)行ARM指令;T=1表示強制下一條執(zhí)行的指令產(chǎn)生未定指令中斷
M[4:0]---定義了的ARM工作模式,具體見1中表CSPR[4:0]定義的ARM工作模式
3 控制程序的執(zhí)行流程的3種方式
1)在正常執(zhí)行過程中,每執(zhí)行一條ARM指令,程序計數(shù)器(PC)的值加4個字節(jié);每執(zhí)行一條Thumb指令,程序計數(shù)器寄存器(PC)加2個字節(jié)。整個過程是按順序執(zhí)行。
2)跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。其中,B指令用于執(zhí)行跳轉(zhuǎn)操作;BL指令在執(zhí)行跳轉(zhuǎn)操作同時,保存子程序的返回地址;BX指令在執(zhí)行跳轉(zhuǎn)操作同時,根據(jù)目標地址為可以將程序切換到Thumb狀態(tài);BLX指令執(zhí)行3個操作,跳轉(zhuǎn)到目標地址處執(zhí)行,保存子程序的返回地址,根據(jù)目標地址為可以將程序切換到Thumb狀態(tài)。
3)當異常中斷發(fā)生時,系統(tǒng)執(zhí)行完當前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當異常中斷處理程序執(zhí)行完成后,程序返回到發(fā)生中斷指令的下條指令處執(zhí)行。在進入異常中斷處理程序時,要保存被中斷程序的執(zhí)行現(xiàn)場,從異常中斷處理程序退出時,要恢復(fù)被中斷程序的執(zhí)行現(xiàn)場。