0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM通用寄存器及狀態(tài)寄存器詳解

技術(shù)讓夢(mèng)想更偉大 ? 來(lái)源:CSDN-張一西 ? 2023-01-06 14:58 ? 次閱讀

筆者來(lái)聊聊ARM通用寄存器以及狀態(tài)寄存器的認(rèn)識(shí)與理解。

ARM通用寄存器

對(duì)于處理器來(lái)說(shuō),寄存器可以作為暫存器,存儲(chǔ)臨時(shí)結(jié)果,也可以作為輸入數(shù)據(jù),方便運(yùn)算,也可以作為一種索引,去訪問(wè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的需求。

其寄存器模型如下:9ecb823a-8d8e-11ed-bfe3-dac502259ad0.jpg

通用目的寄存器R0-R7

,低組寄存器,32bit,16位thumb以及32位的thumb-2指令均可以訪問(wèn)

可以看到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ù)尋址。
9f8353ce-8d8e-11ed-bfe3-dac502259ad0.jpg
9f912580-8d8e-11ed-bfe3-dac502259ad0.jpg

R0-R3一般作為參數(shù)傳遞,如果參數(shù)再多,則通過(guò)壓棧的方式傳遞

R0、R1還會(huì)作為返回值進(jìn)行傳遞,如果是32位則是R0,64位則會(huì)用R0-R19fa402f4-8d8e-11ed-bfe3-dac502259ad0.jpg

通用目的寄存器R8-R12

,高組寄存器,32bit,較少的16位thumb指令可以訪問(wèn),一般是 thumb-2指令訪問(wèn)。

R11一般用作FP指針,保存棧幀(在加上編譯選項(xiàng)時(shí) ,見(jiàn)上篇文章,下文SP、LR同理ARM開(kāi)發(fā)中幾個(gè)常見(jiàn)的寄存器詳解。

棧指針R13(SP) 指示當(dāng)前棧所指位置。

鏈接寄存器R14(LR) 保存程序返回地址。

程序計(jì)數(shù)器R15(PC)

程序運(yùn)行的當(dāng)前位置。

下圖一PC作為基址地址,然后去訪問(wèn)存儲(chǔ)器,0x4079a1c+480 =0x4079c04

下圖二直接將0x4079c04 作為地址給r09fb1b5c0-8d8e-11ed-bfe3-dac502259ad0.jpg9fbee682-8d8e-11ed-bfe3-dac502259ad0.jpg

指令對(duì)齊半字或者字地址,最低位為0

特殊跳轉(zhuǎn)指令,需要將PC 最低位表示Thumb狀態(tài),否則會(huì)觸發(fā)異常。

PC有時(shí)候會(huì)作為基址寄存器,然后加地址偏移去訪問(wèn)數(shù)據(jù)

CortexR5

Cortex R系列繼承了ARM7架構(gòu)下的系統(tǒng)模型,有多組工作模式,每個(gè)模式都有自己的地址空間(堆棧地址SP)9fd168fc-8d8e-11ed-bfe3-dac502259ad0.jpg

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ò)展,

9fe58968-8d8e-11ed-bfe3-dac502259ad0.jpg

增加了Hyp模式以及Mon模式,分別用于虛擬擴(kuò)展以及安全擴(kuò)展,

Hyp模式下的LR為ELR,記錄異常時(shí)的返回地址,其他均一致。

CortexA53

9ffb5590-8d8e-11ed-bfe3-dac502259ad0.jpg

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 程序寄存器,a00f36d2-8d8e-11ed-bfe3-dac502259ad0.png可以看到程序調(diào)用時(shí),函數(shù)類(lèi)型為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寄存器模型。a037a64e-8d8e-11ed-bfe3-dac502259ad0.jpg

標(biāo)志位域

說(shuō)明解釋:表示程序的運(yùn)行結(jié)果的狀態(tài),可以用來(lái)跳轉(zhuǎn),例如:結(jié)果是否為0,結(jié)果是否有進(jìn)位,結(jié)果是否溢出,結(jié)果是否為負(fù)數(shù)等等。a046dc2c-8d8e-11ed-bfe3-dac502259ad0.jpg

符號(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ù)大于a05f901e-8d8e-11ed-bfe3-dac502259ad0.jpg

相關(guān)數(shù)字運(yùn)算對(duì)標(biāo)志位的影響。a0774650-8d8e-11ed-bfe3-dac502259ad0.jpg

異常中斷控制域

比如常見(jiàn)的DAIF 中斷屏蔽位,分別為:

處理器狀態(tài)debug中斷 屏蔽位:查看點(diǎn)、斷點(diǎn)以及系統(tǒng)單步運(yùn)行

系統(tǒng)錯(cuò)誤中斷屏蔽位(通常是異步的錯(cuò)誤)

普通中斷屏蔽位

快速中斷屏蔽位a084bd26-8d8e-11ed-bfe3-dac502259ad0.jpg常見(jiàn)的中斷控制域如上圖所示,

CortexM3/4 單獨(dú)存在一個(gè)寄存器primask,可以屏蔽中斷,只有普通中斷,沒(méi)有快速中斷(支持嵌套,所以快速與否感覺(jué)關(guān)系不大,同時(shí)進(jìn)入中斷后,硬件自動(dòng)壓棧相關(guān)寄存器,也提高了中斷速度),在cpsr中沒(méi)有中斷屏蔽相關(guān),

CortexR5以及A53系列中均有這樣的中斷控制域,可以訪問(wèn)臨界資源時(shí)屏蔽中斷,

模式控制域

CPSR的低五位為模式控制位,控制當(dāng)前CPU為何種模式,設(shè)置各種模式則是為了處理異常以及分層管理,低級(jí)無(wú)法訪問(wèn)特定資源,而特權(quán)模式則可以進(jìn)行資源上的操作。a0993ca6-8d8e-11ed-bfe3-dac502259ad0.jpg

通過(guò)寫(xiě)CPSR的低五位,可以控制系統(tǒng)處于何種模式。

通過(guò)讀CPSR的第五位 也可以知道當(dāng)前處于何種模式,判斷程序發(fā)生了什么故障。

mode description restriction
User Mode 運(yùn)行用戶程序,非特權(quán)模式 ,無(wú)法處理異常,除非異常,否則無(wú)法改變當(dāng)前模式 對(duì)系統(tǒng)資源的訪問(wèn)進(jìn)行限制(外設(shè)以及memory)
SVC Mode 用于系統(tǒng)管理,比如系統(tǒng)下的資源訪問(wèn),以及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ù)訪問(wèn)出錯(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ì)齊的指令,增加代碼密度,減少I(mǎi)mage 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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8965

    瀏覽量

    364993
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5250

    瀏覽量

    119192
  • CortexM3
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    13528
  • 狀態(tài)寄存器
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    7049

原文標(biāo)題:ARM通用寄存器及狀態(tài)寄存器詳解

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內(nèi)的組成部分。寄存器是有限存貯容量
    發(fā)表于 03-08 14:26 ?2.2w次閱讀

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思 數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加AX、基址寄存器BX、計(jì)數(shù)
    發(fā)表于 03-08 14:38 ?1.2w次閱讀

    ARM寄存器詳解

    ARM有37個(gè)寄存器,其中31個(gè)通用寄存器,6個(gè)狀態(tài)寄存器。   這里尤其要注意區(qū)別的是
    發(fā)表于 07-10 10:04 ?2887次閱讀

    DSP2812寄存器詳解

    DSP2812寄存器詳解DSP2812寄存器詳DSP2812寄存器詳解
    發(fā)表于 01-08 14:17 ?8次下載

    寄存器與移位寄存器

    寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實(shí)現(xiàn)。
    發(fā)表于 05-20 11:47 ?0次下載

    arm程序狀態(tài)寄存器訪問(wèn)指令

    arm程序狀態(tài)寄存器訪問(wèn)指令
    發(fā)表于 01-04 13:11 ?0次下載

    51寄存器的所有寄存器名稱,(包括寄存器每一位的作用及用法)資源詳解

    51寄存器的所有寄存器名稱,(包括寄存器每一位的作用及用法)資源詳解
    發(fā)表于 10-16 13:04 ?14次下載
    51<b class='flag-5'>寄存器</b>的所有<b class='flag-5'>寄存器</b>名稱,(包括<b class='flag-5'>寄存器</b>每一位的作用及用法)資源<b class='flag-5'>詳解</b>

    淺談ARM寄存器組織

    是32位的,但目前只使用了其中的12位。除了這6個(gè)狀態(tài)寄存器外,其余的31個(gè)寄存器又稱為通用寄存器A
    發(fā)表于 10-18 13:26 ?1次下載
    淺談<b class='flag-5'>ARM</b><b class='flag-5'>寄存器</b>組織

    ARM處理中的寄存器基本知識(shí)詳解

    ARM處理在每一種處理模式下均有一組相應(yīng)的寄存器與之對(duì)應(yīng)。即在任意一種處理模式下,可訪問(wèn)的寄存器
    的頭像 發(fā)表于 12-11 11:48 ?1.6w次閱讀
    <b class='flag-5'>ARM</b>處理<b class='flag-5'>器</b>中的<b class='flag-5'>寄存器</b>基本知識(shí)<b class='flag-5'>詳解</b>

    移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途

    移位寄存器是一個(gè)具有移位功能的寄存器,是指寄存器中所存的代碼能夠在移位脈沖的作用下依次左移或右移。本文主要介紹了移位寄存器的用途以及移位寄存器
    發(fā)表于 12-22 15:49 ?2w次閱讀

    寄存器操作方法_對(duì)寄存器操作的通用方法總結(jié)

    本文主要詳解寄存器操作方法以及對(duì)寄存器操作的通用方法總結(jié),具體的跟隨小編來(lái)了解一下。
    的頭像 發(fā)表于 05-22 15:53 ?2.2w次閱讀

    零基礎(chǔ)學(xué)ARM:程序狀態(tài)寄存器訪問(wèn)指令解析

    一、程序狀態(tài)寄存器訪問(wèn)指令ARM微處理支持程序狀態(tài)寄存器訪問(wèn)指令,用于在程序
    的頭像 發(fā)表于 12-24 13:36 ?3004次閱讀

    AArch64寄存器介紹

    作為 RISC 架構(gòu),AArch64 提供了大量的通用寄存器。除通用寄存器之外,本節(jié)還會(huì)介紹特殊寄存器、系統(tǒng)控制
    的頭像 發(fā)表于 08-24 09:57 ?5665次閱讀

    CPSR寄存器和APSR寄存器的組成

    程序狀態(tài)寄存器的作用就是反映處理狀態(tài)信息。在程序運(yùn)行期間我們可以通過(guò)查看程序狀態(tài)寄存器
    的頭像 發(fā)表于 10-20 11:38 ?3718次閱讀
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的組成

    寄存器分為基本寄存器和什么兩種

    ,它們用于存儲(chǔ)指令、數(shù)據(jù)和地址等信息?;?b class='flag-5'>寄存器的容量通常較小,但訪問(wèn)速度非???,因?yàn)樗鼈兣cCPU的執(zhí)行單元緊密相連。 基本寄存器的分類(lèi) 基本寄存器可以分為以下幾類(lèi): (1)通用
    的頭像 發(fā)表于 07-12 10:31 ?631次閱讀