筆者來(lái)聊聊ARM通用寄存器以及狀態(tài)寄存器的認(rèn)識(shí)與理解。
ARM通用寄存器
對(duì)于處理器來(lái)說(shuō),寄存器可以作為暫存器,存儲(chǔ)臨時(shí)結(jié)果,也可以作為輸入數(shù)據(jù),方便運(yùn)算,也可以作為一種索引,去訪問存儲(chǔ)器,其作用各種各樣。
CortexM3/M4
CortexM3/M4是比較常用的ARM架構(gòu),很多廠商都采用了這樣的架構(gòu),比如ST公司的stm32,廣受大家歡迎,還有NXP的MK60芯片,一直在飛思卡爾比賽中很受歡迎,還有國(guó)產(chǎn)兆易創(chuàng)新的GD32,亞特力的AT32,國(guó)民技術(shù)的N32系列。
其在嵌入式領(lǐng)域非常受歡迎,相對(duì)方便上手,功能齊全,滿足一般的對(duì)MCU的需求。
其寄存器模型如下:
通用目的寄存器R0-R7
,低組寄存器,32bit,16位thumb以及32位的thumb-2指令均可以訪問
可以看到R0、R1、R2三個(gè)作為參數(shù)傳遞進(jìn)入。
后面R0作為結(jié)果傳出進(jìn)行比較。
傳入?yún)?shù)是數(shù)組,為什么不直接傳地址(LDR),而是通過(guò)DCD指令來(lái)傳遞呢?
這是因?yàn)長(zhǎng)DR取地址的范圍有限,LDR Rn,#立即數(shù)地址,該地址只是是小范圍(4KB?),所以可以看到DCD的地址就在不遠(yuǎn)處(6A92 - 6D48相差不遠(yuǎn)),而存儲(chǔ)器的地址則在2000000范圍,與其地址相差較大,從圖二來(lái)看 DCD后的地址,其實(shí)是通過(guò)DCD的地址先尋址,尋址后再作為地址,繼續(xù)尋址。
R0-R3一般作為參數(shù)傳遞,如果參數(shù)再多,則通過(guò)壓棧的方式傳遞
R0、R1還會(huì)作為返回值進(jìn)行傳遞,如果是32位則是R0,64位則會(huì)用R0-R1
通用目的寄存器R8-R12
,高組寄存器,32bit,較少的16位thumb指令可以訪問,一般是 thumb-2指令訪問。
R11一般用作FP指針,保存棧幀(在加上編譯選項(xiàng)時(shí) ,見上篇文章,下文SP、LR同理ARM開發(fā)中幾個(gè)常見的寄存器詳解。
棧指針R13(SP) 指示當(dāng)前棧所指位置。
鏈接寄存器R14(LR) 保存程序返回地址。
程序計(jì)數(shù)器R15(PC)
程序運(yùn)行的當(dāng)前位置。
下圖一PC作為基址地址,然后去訪問存儲(chǔ)器,0x4079a1c+480 =0x4079c04
下圖二直接將0x4079c04 作為地址給r0
指令對(duì)齊半字或者字地址,最低位為0
特殊跳轉(zhuǎn)指令,需要將PC 最低位表示Thumb狀態(tài),否則會(huì)觸發(fā)異常。
PC有時(shí)候會(huì)作為基址寄存器,然后加地址偏移去訪問數(shù)據(jù)
CortexR5
Cortex R系列繼承了ARM7架構(gòu)下的系統(tǒng)模型,有多組工作模式,每個(gè)模式都有自己的地址空間(堆棧地址SP)
CortexR5 屬于ARMv7指令集。
與CortexM3/4一致,其R0-R7 以及R8-R12的作用
user模式和sys模式共用一套寄存器,即共享
user/sys、FIQ、SVC、ABT、IRQ以及UND模式 下,LR、SP、SPSR均是獨(dú)立,切換CPSR 模式之后,SP、LR及SPSR自動(dòng)切換成相應(yīng)模式下的寄存器值
FIQ 之所以被稱之快速中斷,是因?yàn)橛歇?dú)立的R8-R12寄存器,不需要壓棧 ,直接使用,
SPSR是保存上一個(gè)模式的CPSR。
ARMv7的一般AR系列的寄存器模型和上述的基本相同,有一些新的擴(kuò)展,
增加了Hyp模式以及Mon模式,分別用于虛擬擴(kuò)展以及安全擴(kuò)展,
Hyp模式下的LR為ELR,記錄異常時(shí)的返回地址,其他均一致。
CortexA53
r0-r7 用來(lái)做參數(shù)傳遞或者發(fā)返回結(jié)果。
r8 間接的結(jié)果位置寄存器
r9-r15 暫存器 保存臨時(shí)結(jié)果
r16-r17 動(dòng)態(tài)鏈接(系統(tǒng)并不是所有地址都可以跳轉(zhuǎn))(鏈接器內(nèi)部插入代碼)所需要的寄存器
r18 the Platform ABI專用的寄存器 來(lái)保存內(nèi)部程序狀態(tài)(為了平臺(tái)通用性 避免使用)
r19-r28 被調(diào)用者保存的寄存器(相對(duì)來(lái)說(shuō)還有調(diào)用者保存寄存器 在CortexM3/4就有很好體現(xiàn))
r29 FP寄存器,需要加編譯選項(xiàng)
r30 鏈接寄存器
SP 棧指針,
PC 程序寄存器,可以看到程序調(diào)用時(shí),函數(shù)類型為9個(gè)參數(shù),匯編代碼x0-x7作為參數(shù)傳遞進(jìn)去,最后一個(gè)參數(shù),壓棧進(jìn)行傳遞,str x9,[SP] 。還用到了 blr 通過(guò)寄存器去進(jìn)行鏈接跳轉(zhuǎn) 最后通過(guò)b 跳轉(zhuǎn)返回。
狀態(tài)寄存器
寄存器通常是CPSR(Current Program state register),用來(lái)表示當(dāng)前程序運(yùn)行的狀態(tài)、模式、運(yùn)算結(jié)果狀態(tài)、中斷狀態(tài)等。,比如下面這個(gè)CPSR寄存器模型。
標(biāo)志位域
說(shuō)明解釋:表示程序的運(yùn)行結(jié)果的狀態(tài),可以用來(lái)跳轉(zhuǎn),例如:結(jié)果是否為0,結(jié)果是否有進(jìn)位,結(jié)果是否溢出,結(jié)果是否為負(fù)數(shù)等等。
符號(hào)有NCVZ,分別是負(fù)數(shù)(Negative)、進(jìn)位(Carry)、溢出(Overflow)、為0(Zero)標(biāo)志。
衍生出許多跳轉(zhuǎn)指令,近范圍或者函數(shù)范圍內(nèi)跳轉(zhuǎn),比如以下這些指令
BEQ、BNE 通過(guò)判斷Z==1,BEQ為相等則跳轉(zhuǎn),比如CMP X0,X1 BEQ
BCS、BCC通過(guò)判斷C==1,BCS為大于等于則跳轉(zhuǎn),BCC為小于則跳轉(zhuǎn)
BMI、MBL 通過(guò)判斷N==1,BMI 為負(fù)數(shù)則跳轉(zhuǎn),BPL為整數(shù)則跳轉(zhuǎn)
BVS、BVC 通過(guò)判斷V==1,溢出則跳轉(zhuǎn),BVC為非溢出則跳轉(zhuǎn)
BHI、BLS通過(guò)判斷C == 1 and Z == 0 意思就是大于則跳轉(zhuǎn),
BGE、BLT 通過(guò)判斷N == 1 and V == 1,或者 N == 0 and V == 0 有符號(hào)數(shù)大于等于
BGT、BLE 通過(guò)判斷Z=0, N == 1 and V == 1 或者 Z=0 N == 0 and V == 0 有符號(hào)數(shù)大于
相關(guān)數(shù)字運(yùn)算對(duì)標(biāo)志位的影響。
異常中斷控制域
比如常見的DAIF 中斷屏蔽位,分別為:
處理器狀態(tài)debug中斷 屏蔽位:查看點(diǎn)、斷點(diǎn)以及系統(tǒng)單步運(yùn)行
系統(tǒng)錯(cuò)誤中斷屏蔽位(通常是異步的錯(cuò)誤)
普通中斷屏蔽位
快速中斷屏蔽位常見的中斷控制域如上圖所示,
CortexM3/4 單獨(dú)存在一個(gè)寄存器primask,可以屏蔽中斷,只有普通中斷,沒有快速中斷(支持嵌套,所以快速與否感覺關(guān)系不大,同時(shí)進(jìn)入中斷后,硬件自動(dòng)壓棧相關(guān)寄存器,也提高了中斷速度),在cpsr中沒有中斷屏蔽相關(guān),
CortexR5以及A53系列中均有這樣的中斷控制域,可以訪問臨界資源時(shí)屏蔽中斷,
模式控制域
CPSR的低五位為模式控制位,控制當(dāng)前CPU為何種模式,設(shè)置各種模式則是為了處理異常以及分層管理,低級(jí)無(wú)法訪問特定資源,而特權(quán)模式則可以進(jìn)行資源上的操作。
通過(guò)寫CPSR的低五位,可以控制系統(tǒng)處于何種模式。
通過(guò)讀CPSR的第五位 也可以知道當(dāng)前處于何種模式,判斷程序發(fā)生了什么故障。
mode | description | restriction |
---|---|---|
User Mode | 運(yùn)行用戶程序,非特權(quán)模式 ,無(wú)法處理異常,除非異常,否則無(wú)法改變當(dāng)前模式 | 對(duì)系統(tǒng)資源的訪問進(jìn)行限制(外設(shè)以及memory) |
SVC Mode | 用于系統(tǒng)管理,比如系統(tǒng)下的資源訪問,以及OS的調(diào)度管理,可以通過(guò)軟件觸發(fā),特權(quán)模式 ,執(zhí)行SVC指令可以進(jìn)入到本異常,復(fù)位之后進(jìn)入該模式 ,(正常行為,軟件觸發(fā)到) | |
system Mode | 與用戶模式共享所有寄存器,特權(quán)模式,不能通過(guò)異常進(jìn)入,(正常行為,軟件觸發(fā)) | |
Abort Mode | Data Abort或者Prefetch Abort,前者是數(shù)據(jù)訪問出錯(cuò),后面是取指令錯(cuò)誤,特權(quán)模式,(異常行為,硬件檢測(cè)到) | |
Undefined Mode | 指令相關(guān)的異常處理,例如執(zhí)行到未定義的指令,特權(quán)模式,(異常行為,硬件檢測(cè)到) | |
FIQ Mode | 特權(quán)模式,處理快速中斷,(正常行為,硬件觸發(fā)到) | |
IRQ Mode | 特權(quán)模式,處理普通終端,(正常行為,硬件觸發(fā)到) |
指令選擇域
T Value | 指令集 | 描述 |
---|---|---|
0 | ARM指令集 | 32位DWORD對(duì)齊的指令 |
1 | Thumb指令集 | 部分為16位半字(half word)對(duì)齊的指令,增加代碼密度,減少Image size |
X | 關(guān)聯(lián) | 兩種指令集可以混合使用,通過(guò)狀態(tài)來(lái)表征,比如通過(guò)bx 、blx可以切換指令集 |
大小端控制域
endian state value | 模式 | 描述 | 設(shè)置指令 |
---|---|---|---|
0 | 小端模式 | memory 低字節(jié)在低位 | SETEND LE |
1 | 大端模式 | memory 低字節(jié)在高位 | SETEND BE |
執(zhí)行狀態(tài)控制域
一些控制系統(tǒng)狀態(tài)的標(biāo)志位,比如ARMv8-A系列
標(biāo)志屬性 | 描述 | HTML |
---|---|---|
SP_ELx | Stack pointer register selected,' | 比如SP_EL0 或者SP_EL3 |
EL | "異常等級(jí)" | “EL0、EL1、EL2以及EL3” |
SS | 軟件單步控制 | for debugger make PE single-step instruction |
審核編輯:湯梓紅
-
ARM
+關(guān)注
關(guān)注
134文章
9005瀏覽量
366020 -
寄存器
+關(guān)注
關(guān)注
31文章
5268瀏覽量
119640 -
CortexM3
+關(guān)注
關(guān)注
0文章
24瀏覽量
13538 -
狀態(tài)寄存器
+關(guān)注
關(guān)注
0文章
38瀏覽量
7058
原文標(biāo)題:ARM通用寄存器及狀態(tài)寄存器詳解
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論