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