做網(wǎng)站建設(shè)公司crm在線的提升服務(wù)外貿(mào)網(wǎng)站推廣服務(wù)
Cortex A系列ARM處理器共有40個(gè)32位寄存器,其中33個(gè)為通用寄存器,7個(gè)為狀態(tài)寄存器。usr模式和sys模式共用同一組寄存器。
通用寄存器包括R0~R15,可以分為3類:
- 未分組寄存器R0~R7
- 分組寄存器R8~R14、R13(SP) 、R14(LR)
- 程序計(jì)數(shù)器PC(R15)、R8_fiq-R12_fir為快中斷獨(dú)有
在不同模式下,名稱相同的寄存器,實(shí)際物理上是不同的寄存器,雖然邏輯上有可能相同。
r0~r7 所有模式下都是相同的寄存器
1.ARM的寄存器組(Thumb state)
2. 不同狀態(tài)下的寄存器組對(duì)比
3.通用寄存器
通用寄存器包括R0~R15,可以分為3類:
- 未分組寄存器R0~R7
- 分組寄存器R8~R14、R13(SP) 、R14(LR)
- 程序計(jì)數(shù)器PC(R15)、R8_fiq-R12_fir為快中斷獨(dú)有
R0-R7:無影子寄存器,未分組寄存器
所有模式下,R0-R7所對(duì)應(yīng)的物理寄存器都是相同的。
真正意義上的通用寄存器,ARM體系結(jié)構(gòu)種對(duì)他們沒有任何特殊的假設(shè),它們的功能都是等同的。
在所有運(yùn)行模式下,未分組寄存器都指向同一個(gè)物理寄存器,它們未被系統(tǒng)用作特殊的用途.因此在中斷或異常處理進(jìn)行運(yùn)行模式轉(zhuǎn)換時(shí),由于不同的處理器運(yùn)行模式均使用相同的物理寄存器,所以可能造成寄存器中數(shù)據(jù)的破壞。
因此,在中斷或者異常處理程序中一般都需要對(duì)這幾個(gè)寄存器進(jìn)行保存。壓棧保存。
R8-R14:有影子寄存器,分組寄存器
影子寄存器是指該寄存器在不同模式下對(duì)應(yīng)的物理寄存器。
對(duì)于分組寄存器,它們每一次所訪問的物理寄存器都與當(dāng)前處理器的運(yùn)行模式有關(guān)。
訪問的物理寄存器取決于當(dāng)前的處理器模式,或使用規(guī)定的名字來訪問。
R8-R12各有2個(gè)物理寄存器:FIQ模式和非FIQ模式。除了FIQ模式下不用保存R8-R12,其他模式都需要保護(hù)。每個(gè)寄存器對(duì)應(yīng)2個(gè)不同的物理寄存器,當(dāng)使用FIQ(快速中斷模式)時(shí),訪問寄存器 R8_fiq ~ R12_fiq;當(dāng)使用除FIQ模式以外的其他模式時(shí),訪問寄存器R8_usr~R12_usr。。
R13-R14
各有6個(gè)物理寄存器,用戶模式和系統(tǒng)模式共用,其他5個(gè)用于各異常模式。
對(duì)于R13,R14來說,每個(gè)寄存器對(duì)應(yīng)7個(gè)不同的物理寄存器,其中一個(gè)是用戶模式與系統(tǒng)模式共用,另外6個(gè)物理寄存器對(duì)應(yīng)其他6種不同的運(yùn)行模式,并采用以下記號(hào)來區(qū)分不同的物理寄存器:
R13_mode R14_mode
其中mode可為:「usr,fiq,irq,svc,abt,und,mon」。
R13(SP)被用作棧指針
通常在系統(tǒng)初始化時(shí)需要對(duì)所有模式下的SP指針賦值,CPU會(huì)自動(dòng)切換成相應(yīng)模式下的值。
在ARM指令中常用作「堆棧指針」,用戶也可使用其他的寄存器作為堆棧指針,而在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。
寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習(xí)慣用法,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。
由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運(yùn)行模式的??臻g。這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入R13所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行。
R14(LR)鏈接寄存器(Link Register)
用于保存子程序返回地址或異常返回地址。
當(dāng)執(zhí)行子程序調(diào)用指令(BL)時(shí),R14可得到R15(程序計(jì)數(shù)器PC)的備份。
在每一種運(yùn)行模式下,都可用R14保存子程序的返回地址,當(dāng)用BL或BLX指令調(diào)用子程序時(shí),將PC的當(dāng)前值復(fù)制給R14,執(zhí)行完子程序后,又將R14的值復(fù)制回PC,即可完成子程序的調(diào)用返回。以上的描述可用指令完成。
從子程序返回:
MOV PC, LR
或者
BX LR
在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!,{,LR}
對(duì)應(yīng)的,使用以下指令可以完成子程序返回:
LDMFD SP!,{,PC}
R15(PC):程序計(jì)數(shù)器
可以被讀寫
ARM STATE:bits[1:0]為0,bits[31:2]即為PC有效值
THUMB state: bits[0]為0, bits[31:1]即為PC有效值
比如如果pc的值是0x40008001,那么在尋址的時(shí)候其實(shí)會(huì)查找地址0x40008000,低2位會(huì)自動(dòng)忽略掉
由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,PC總是指向當(dāng)前指令的下兩條指令的地址,即PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié)。
即:PC值=當(dāng)前程序執(zhí)行位置+8
4. 程序狀態(tài)寄存器(v4T)CPSR、SPSR
包括所有的CPSR和SPSR寄存器,其中CPSR(當(dāng)前狀態(tài)寄存器)在所有模式下都是可以讀寫的。SPSR是CPSR的備份。二者格式相同。
「CPSR」(Current Program Status Register,當(dāng)前程序狀態(tài)寄存器),CPSR可在任何運(yùn)行模式下被訪問,它包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志位,以及其他一些相關(guān)的控制和狀態(tài)位。
每一種運(yùn)行模式下又都有一個(gè)專用的物理狀態(tài)寄存器,稱為「SPSR」(Saved Program Status Register,備份的程序狀態(tài)寄存器),當(dāng)異常發(fā)生時(shí),SPSR用于保存CPSR的當(dāng)前值,從異常退出時(shí)則可由SPSR來恢復(fù)CPSR。
由于用戶模式和系統(tǒng)模式不屬于異常模式,它們沒有SPSR,當(dāng)在這兩種模式下訪問SPSR,結(jié)果是未知的。
條件標(biāo)準(zhǔn),中斷使能標(biāo)志,當(dāng)前處理器的模式,其它的一些狀態(tài)和控制標(biāo)志
a. 條件碼標(biāo)志(condition code flags)「N,Z,C,V」均為條件碼標(biāo)志位,它們的內(nèi)容可被算術(shù)或邏輯運(yùn)算的結(jié)果所改變,并且可以決定某條指令是否被執(zhí)行。在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的,在Thumb狀態(tài)下,僅有分支指令是有條件執(zhí)行的。
「N (Number)」: 當(dāng)用兩個(gè)補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示運(yùn)行結(jié)果為負(fù),N=0表示運(yùn)行結(jié)果為正或零
「Z :(Zero)」: Z=1表示運(yùn)算結(jié)果為零,Z=0表示運(yùn)行結(jié)果非零
「C」 : 可以有4種方法設(shè)置C的值:
o (Come)加法運(yùn)算(包括CMP):當(dāng)運(yùn)算結(jié)果產(chǎn)生了進(jìn)位時(shí)C=1,否則C=0
o 減法運(yùn)算(包括CMP):當(dāng)運(yùn)算產(chǎn)生了借位,C=0否則C=1
o 對(duì)于包含移位操作的非加/減運(yùn)算指令 ,C為移出值的最后一位
o 對(duì)于其他的非加/減運(yùn)算指令C的值通常不改變
「V」 :
(oVerflow)對(duì)于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)位溢出時(shí),V=1表示符號(hào)位溢出;對(duì)于其他的非加/減運(yùn)算指令V的值通常不改變
「Q」:在ARM V5及以上版本的E系列處理器中,用Q標(biāo)志位指示增強(qiáng)的DSP運(yùn)算指令是否發(fā)生了溢出。在其它版本的處理器中,Q標(biāo)志位無定義
「J:」
僅ARM v5TE-J架構(gòu)支持 , T=0;J = 1 處理器處于Jazelle狀態(tài),也可以和其他位組合.
「E位:」大小端控制位
「A位:」A=1 禁止不精確的數(shù)據(jù)異常
「T :」T = 0;J=0; 處理器處于 ARM 狀態(tài) T = 1;J=0 處理器處于 Thumb 狀態(tài) T = 1;J=1 處理器處于 ThumbEE 狀態(tài)
b. 控制位 CPSR的低8位(包括I,F,T和M[4:0])稱為控制位,當(dāng)發(fā)生異常時(shí)這些位可以被改變,如果處理器運(yùn)行特權(quán)模式,這些位也可以由程序修改。
「中斷禁止位I,F」【重要】 I=1 禁止IRQ中斷 F=1 禁止FIQ中斷
比如我們要想在程序中實(shí)現(xiàn)禁止中斷,那么就需要將CPSR[7]置1。
c.模式控制位的值和相關(guān)寄存器列表
注意觀察這5個(gè)bit的特點(diǎn),最高位都是1,低4位的值則各不相同,這個(gè)很重要,要想搞清楚uboot、linux的源碼,尤其是異常操作的代碼,必須要知道這幾個(gè)bit的值。
程序狀態(tài)寄存器(v5及v6新增標(biāo)志位)