新聞中心

ARM處理器模式及寄存器

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
一、ARM處理器模式
  • ARM微處理器支持7種運(yùn)行模式,分別為:
用戶模式(usr): ARM處理器正常的程序執(zhí)行狀態(tài)。
快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。
外部中斷模式(irq):用于通用的中斷處理。
管理模式(svc): 操作系統(tǒng)使用的保護(hù)模式。軟中斷和復(fù)位
數(shù)據(jù)訪問(wèn)中止模式(abt): 當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。
系統(tǒng)模式(sys): 運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。
未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真
  • 除用戶模式外的其余6種模式都稱為特權(quán)模式,這些模式下,程序可以訪問(wèn)所有的系統(tǒng)資源,也可以任一進(jìn)行處理器模式切換。其中,除系統(tǒng)模式外,其他5種模式又稱為異常模式

二、ARM寄存器

(一)ARM工作狀態(tài)下的寄存器組織
ARM處理器共有37個(gè)寄存器。其中包括:
  • 31個(gè)通用寄存器,包括程序計(jì)數(shù)器(PC)在內(nèi)。這些寄存器都是32位寄存器
  • 6個(gè)32位狀態(tài)寄存器。
表1各種處理器模式下的寄存器
用戶模式
系統(tǒng)模式
特權(quán)模式
中止模式
未定義指令模式
外部中斷模式
快速中斷模式
R0
R0
R0
R0
R0
R0
R0
R1
R1
R1
R1
R1
R1
R1
R2
R2
R2
R2
R2
R2
R2
R3
R3
R3
R3
R3
R3
R3
R4
R4
R4
R4
R4
R4
R4
R5
R5
R5
R5
R5
R5
R5
R6
R6
R6
R6
R6
R6
R6
R8
R8
R8
R8
R8
R8
R8_fiq
R9
R9
R9
R9
R9
R9
R9_fiq
R10
R10
R10
R10
R10
R10
R10_fiq
R11
R11
R11
R11
R11
R11
R11_fiq
R12
R12
R12
R12
R12
R12
R12_fiq
R13
R13
R13_svc
R13_abt
R13_und
R13_inq
R13_fiq
R14
R14
R14_svc
R14_abt
R14_und
R14_inq
R14_fiq
PC
PC
PC
PC
PC
PC
PC
CPSR
CPSR
CPSR
SPSR_svc
CPSR
SPSR_abt
CPSR
SPSR_und
CPSR
SPSR_inq
CPSR
SPSR_fiq
  • 當(dāng)發(fā)生異常中斷時(shí),處理器進(jìn)入相應(yīng)的異常模式。在每一種異常模式下都有相應(yīng)的一組寄存器,供相應(yīng)的異常處理程序使用,這樣就可以保證在進(jìn)入異常模式時(shí),用戶模式下的寄存器(保存了程序運(yùn)行狀態(tài))不被破壞。
  • 系統(tǒng)模式不是通過(guò)異常進(jìn)入的,他和用戶模式具有完全一樣的寄存器

1、通用寄存器
通用寄存器通常分為以下三類(lèi):
未備份寄存器:R0——R7
備份寄存器:R8——R14
程序計(jì)數(shù)器PC,即R15
未備份寄存器R0——R7:
R0~R7。在所有的處理器模式下指的都是同一個(gè)物理寄存器。在異常中斷造成處理器模式切換時(shí),由于不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數(shù)據(jù)被破壞。
備份寄存器R8~R14:
(1)寄存器R8~R12
每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器。例如,當(dāng)使用快速中斷模式下的寄存器時(shí),寄存器R8和寄存器R9分別記作R8_fiq、R9_fiq;當(dāng)使用用戶模式下的寄存器時(shí),寄存器R8和寄存器R9分別記作R8_usr、R9_usr等。在這兩種情況下使用的是不同的物理寄存器。系統(tǒng)沒(méi)有將這幾個(gè)寄存器用于任何的特殊用途,但是當(dāng)中斷處理非常簡(jiǎn)單,僅僅使用R8~R14寄存器時(shí),F(xiàn)IQ處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場(chǎng)的指令,從而可以使中斷處理過(guò)程非常迅速。對(duì)于備份寄存器R13和R14來(lái)說(shuō),每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器,其中的一個(gè)是用戶模式和系統(tǒng)模式共用的;另外的5個(gè)對(duì)應(yīng)于其他5種處理器模式。
(2)寄存器R13在ARM中常用作棧指針(Stack Point,SP)
  • 在ARM指令集中,這只是一種習(xí)慣的用法,并沒(méi)有任何指令強(qiáng)制性的使用R13作為棧指針,用戶也可以使用其他的寄存器作為棧指針;而在Thumb指令集中,有一些指令強(qiáng)制性地使用R13作為棧指針。
  • 每一種異常模式擁有自己的物理的R13。應(yīng)用程序初始化該R13,使其指向該異常模式專用的棧地址。當(dāng)進(jìn)入異常模式時(shí),可以將需要使用的寄存器保存在R13所指的棧中;當(dāng)退出異常處理程序時(shí),將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會(huì)破壞被其中斷程序的運(yùn)行現(xiàn)場(chǎng)。
(3)寄存器R14又被稱為連接寄存器(Link Register,LR)
  • 在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的物理R14中存放在當(dāng)前子程序的返回地址。當(dāng)通過(guò)BL或BLX指令調(diào)用子程序時(shí),R14被設(shè)置成該子程序的返回地址。在子程序中,當(dāng)把R14的值到程序計(jì)數(shù)器PC中時(shí),子程序即返回。
  • 當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理R14被設(shè)置成該異常模式將要返回的地址,對(duì)于有些異常模式,R14的值可能與將返回的地址有一個(gè)常數(shù)的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
  • R14寄存器也可以作為通用寄存器使用。

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

  • 程序計(jì)數(shù)器R15又被記作PC。它雖然可以作為一般的通用寄存器使用,但是有一些指令在使用R15時(shí)有一些特殊限制。當(dāng)違反了這些限制時(shí),該指令執(zhí)行的結(jié)果將是不可預(yù)料的。
  • 由于ARM采用了流水線機(jī)制,當(dāng)正確讀取了PC的值時(shí),該值為當(dāng)前指令地址值加8個(gè)字節(jié)。也就是說(shuō),對(duì)于ARM指令集來(lái)說(shuō),PC指向當(dāng)前指令的下兩條指令的地址。(因?yàn)锳RM使用RISC精簡(jiǎn)指令集,ARM的一條指令所占內(nèi)存為32位,4個(gè)字節(jié)。所以當(dāng)一條指令正確讀取時(shí),該寄存器指向當(dāng)前指令地址加8,即指向下兩條指令的地址)
  • 當(dāng)成功地向R15中寫(xiě)入一個(gè)地址數(shù)值時(shí),程序?qū)⑻皆摰刂穲?zhí)行。由于ARM指令是字對(duì)齊的,所以PC值的第0位和第1位總為0。需要注意的是,當(dāng)使用指令STR/STM保存R15時(shí),保存的可能是當(dāng)前指令地址值加8字節(jié),也可能保存的是當(dāng)前指令地址加12字節(jié)。到底是哪種方式,取決于芯片具體設(shè)計(jì)方式。無(wú)論如何,在同一芯片中,要么采用當(dāng)前指令地址加8,要么采用當(dāng)前指令地址加12,不能有些指令采用當(dāng)前指令地址加8,另一些指令采用當(dāng)前指令地址加12。因此對(duì)于用戶來(lái)說(shuō),盡量避免使用STR/STM指令來(lái)保存R15的值。當(dāng)不可避免這種使用方式時(shí),可以先通過(guò)一些代碼來(lái)確定所用的芯片使用的是哪種實(shí)現(xiàn)方式。
  • 對(duì)于ARM版本4以及更高的版本,程序必須保證寫(xiě)入R15寄存器的地址值的bits[1:0]為0b00;否則將會(huì)產(chǎn)生不可預(yù)知的結(jié)果。
  • 對(duì)于Thumb指令集來(lái)說(shuō),指令是半字對(duì)齊的。處理器將忽略bit[0],即寫(xiě)入R15的地址值首先與0XFFFFFFFE做與操作,再寫(xiě)入R15中。
  • 還有—些指令對(duì)于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來(lái)確定是ARM指令,還是Thumb指令。這種讀取PC值和寫(xiě)入PC值的不對(duì)稱的操作需要特別注意。
注:PC指向的地址是取指單元要取指令的地址,而不是當(dāng)前執(zhí)行的指令。
2、程序狀態(tài)寄存器
CPSR(當(dāng)前程序狀態(tài)寄存器)可以在任何處理器模式下被訪問(wèn)。它包含了條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志以及其他的一些控制和狀態(tài)位。每一種處理器模式下都有一個(gè)專用的物理狀態(tài)寄存器,稱為SPSR(備份程序狀態(tài)寄存器)。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)寄存器用于存放當(dāng)前程序狀態(tài)寄存器(CPSR)的內(nèi)容。在異常中斷程序退出時(shí),可以用SPSR中保存的值來(lái)恢復(fù)CPSR。
由于用戶模式和系統(tǒng)模式不是異常中斷模式,所以它們沒(méi)有SPSR。當(dāng)在用戶模式或系統(tǒng)模式中訪問(wèn)SPSR,將會(huì)產(chǎn)生不可預(yù)知的結(jié)果。
CPSR的格式如下所示。SPSR格式與CPSR格式相同。
31
30
29
28
27
26
7
6
5
4
3
2
1
0
N
Z
C
V
Q
DNM(RAZ)
I
F
T
M4
M3
M2
M1
M0

1.條件標(biāo)志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統(tǒng)稱為條件標(biāo)志位。大部分的ARM指令可以根據(jù)CPSR中的這些條件標(biāo)志位來(lái)選擇性地執(zhí)行。

在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的。
在Thumb狀態(tài)下,僅有分支指令是有條件執(zhí)行的。

本文引用地址:http://m.butianyuan.cn/article/201611/317758.htm
N  Negative        對(duì)于有符號(hào)運(yùn)算,如果結(jié)果是負(fù)數(shù)則置位Z  Zero            如果結(jié)果是零則置位C  Carry           對(duì)于無(wú)符號(hào)運(yùn)算,如果發(fā)生進(jìn)位則置位V  Overflow        對(duì)于有符號(hào)運(yùn)算,如果發(fā)生溢出則置位I  IRQ             中斷禁用F  FIQ             快速中斷禁用
標(biāo)志位
含義
N
本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit[31]的值
當(dāng)兩個(gè)補(bǔ)碼表示的有符號(hào)整數(shù)運(yùn)算時(shí),N=1表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示結(jié)果為正數(shù)或零
Z
Z=1表示運(yùn)算的結(jié)果為零;Z=0表示運(yùn)算的結(jié)果不為零。
對(duì)于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。
C
下面分4種情況討論C的設(shè)置方法:
在加法指令中(包括比較指令CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無(wú)符號(hào)數(shù)運(yùn)算發(fā)生上溢出;其他情況下C=0。
在減法指令中(包括比較指令CMP),當(dāng)運(yùn)算中發(fā)生借位則C=0表示無(wú)符號(hào)數(shù)運(yùn)算發(fā)生下溢出;其他情況下C=1。
對(duì)于包含移位操作的非加/減法運(yùn)算指令,C中包含最后一次溢出的位數(shù)數(shù)值。
對(duì)于其他非加/減法運(yùn)算指令,C位的值通常不受影響。
V
對(duì)于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí)V=1表示符號(hào)位溢出。
通常其他的指令不影響V位,具體可參考各指令的說(shuō)明。

2.Q標(biāo)志位

在ARMv5的E系列處理器中,CPSR的bit[27]稱為Q標(biāo)志位,主要用于指示增強(qiáng)的DSP指令是否發(fā)生了溢出。同樣的SPSR中的bit[27]也稱為Q標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)志位。
在ARM v5以前的版本及ARM v5的非E系列的處理器中,Q標(biāo)志位沒(méi)有被定義。CPSR的bit[27]屬于DNM(RAZ)。

3.CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]統(tǒng)稱為控制位。當(dāng)異常中斷發(fā)生時(shí)這些位發(fā)生變化。在特權(quán)級(jí)的處理器模式下,軟件可以修改這些控制位。
1)中斷禁止位
  • 當(dāng)I=1時(shí)禁止IRQ中斷。
  • 當(dāng)F=1時(shí)禁止FIQ中斷。
2)T控制位
T控制位用于控制指令執(zhí)行的狀態(tài),即說(shuō)明本指令是ARM指令,還是Thumb指令。對(duì)與不同版本的ARM處理器,T控制位的含義不同。
對(duì)于ARMv4以及更高版本的T系列的ARM處理器,
  • T=0表示執(zhí)行ARM指令。
  • T=1表示執(zhí)行Thumb指令。
對(duì)于ARMv5以及更高的版本的非T系列的ARM處理器,T控制位含義如下:
  • T=0表示執(zhí)行ARM指令。
  • T=1表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生未定義指令中斷。
3)M控制位
控制位M[4:0]控制處理器模式,具體含義如表3所示。
表3控制位M[4:0]的含義
M[4:0]
處理器模式
可訪問(wèn)的寄存器
0b10000
User
PC,R14一R0,CPSR
0b10001
FIQ
PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq
0b10010
1RQ
PC,R14 _irq-R13 _irq,R12一R0,CPSR,SPSR_ irq
0b10011
Supervisor
PC,R14_ svc-R13 _svc,R12~R0,CPSR,SPSR_svc
0b10111
Abort
PC,R14_abt-R13_abt,R12~R0,CPSR,SPSR_abt
0b11011
Undefined
PC,R14_und-R13_und,R12~R0,CPSR,SPSR_ und

4.CPSR中的其他位

CPSR中的其他位用于將來(lái)ARM版本的擴(kuò)展。應(yīng)用軟件不要操作這些位,以免與ARM將來(lái)版本的擴(kuò)展沖突。
(二)Thumb工作狀態(tài)下的寄存器組織

Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的一個(gè)子集,程序可以直接訪問(wèn)8個(gè)通用寄存器(R7~R0)、程序計(jì)數(shù)器(PC)、堆棧指針(SP)、 連接寄存器(LR)和CPSR。同時(shí),在每一種特權(quán)模式下都有一組SP、LR和SPSR。圖2.4表明Thumb狀態(tài)下的寄存器組織。


Thumb狀態(tài)下的寄存器組織與ARM狀態(tài)下的寄存器組織的關(guān)系:
─ Thumb狀態(tài)下和ARM狀態(tài)下的R0~R7是相同的。
─ Thumb狀態(tài)下和ARM狀態(tài)下的CPSR和所有的SPSR是相同的。
─ Thumb狀態(tài)下的SP對(duì)應(yīng)于ARM狀態(tài)下的R13。
─ Thumb狀態(tài)下的LR對(duì)應(yīng)于ARM狀態(tài)下的R14。
─ Thumb狀態(tài)下的程序計(jì)數(shù)器對(duì)應(yīng)于ARM狀態(tài)下R15
以上的對(duì)應(yīng)關(guān)系如圖2.5所示:


訪問(wèn)THUMB狀態(tài)下的高位寄存器(Hi-registers):
在Thumb狀態(tài)下,高位寄存器R8~R15并不是標(biāo)準(zhǔn)寄存器集的一部分,但可使用匯編語(yǔ)言程序受限制的訪問(wèn)這些寄存器,將其用作快速的暫存器。使用帶特殊變量的MOV指令,數(shù)據(jù)可以在低位寄存器和高位寄存器之間進(jìn)行傳送;高位寄存器的值可以使用CMP和ADD指令進(jìn)行比較或加上低位寄存器中的值。




關(guān)鍵詞: ARM處理器模式寄存

評(píng)論


技術(shù)專區(qū)

關(guān)閉