ARM寄存器簡(jiǎn)介
(1)31個(gè)通用寄存器:包括程序計(jì)數(shù)器PC等,這些寄存器都是32位寄存器。
(2)6個(gè)狀態(tài)寄存器:狀態(tài)寄存器也是32位的寄存器,但是只使用了其中的12位。
1.通用寄存器
在ARM處理器的7種模式下都有一組對(duì)應(yīng)的寄存器組。在任意時(shí)刻,可見(jiàn)的寄存器組包括15個(gè)通用寄存器R0~R14、一個(gè)或兩個(gè)狀態(tài)寄存器和PC。在所有的寄存器中,有些是各種模式下共用的同一個(gè)物理寄存器,有些是各種模式自己獨(dú)立擁有的物理寄存器。詳細(xì)如表1-3所示。
在ARM處理器的7種模式下都有一組對(duì)應(yīng)的寄存器組。在任意時(shí)刻,可見(jiàn)的寄存器組包括15個(gè)通用寄存器R0~R14、一個(gè)或兩個(gè)狀態(tài)寄存器和PC。在所有的寄存器中,有些是各種模式下共用的同一個(gè)物理寄存器,有些是各種模式自己獨(dú)立擁有的物理寄存器。詳細(xì)如表1-3所示。
表1-3 ARM物理寄存器
用戶(hù)模式 | 系統(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 |
R7 | R7 | R7 | R7 | R7 | R7 | R7 |
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_irq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
通用寄存器通常又可以分為下面3類(lèi)。
n 未備份寄存器:包括R0~R7。
n 備份寄存器:包括R8~R14。
n 程序計(jì)數(shù)器PC:即R15。
1)未備份寄存器R0~R7
對(duì)于每個(gè)未備份寄存器來(lái)說(shuō),在所有的處理器模式下指的都是同一個(gè)物理寄存器,在異常中斷造成處理器模式切換時(shí),由于不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數(shù)據(jù)被破壞。未備份寄存器沒(méi)有被系統(tǒng)用于特別的用途,任何可采用通用寄存器的應(yīng)用場(chǎng)合都可以使用未備份寄存器。
2)備份寄存器R8~R14
備份寄存器中的每個(gè)寄存器對(duì)應(yīng)于兩個(gè)不同的物理寄存器。例如,當(dāng)使用快速中斷模式下的寄存器時(shí),寄存器R8和寄存器R9分別記做R8_fiq和 R9_fiq,當(dāng)使用用戶(hù)模式下的寄存器時(shí),寄存器R8和寄存器R9分別記做R8_usr和R9_usr等。在這兩種情況下使用的是不同的物理寄存器,系統(tǒng)沒(méi)有將這幾個(gè)寄存器用于任何的特殊用途。中斷處理非常簡(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è)是用戶(hù)模式和系統(tǒng)模式共用的,另外的5個(gè)則對(duì)應(yīng)于其他5種處理器模式,采用下面的方法來(lái)標(biāo)識(shí)。
R13_,
其中是usr、svc、abt、und、irq和fiq的一種。
R13通常用做堆棧指針。每一種模式都擁有自己的物理R13。程序初始化R13,使其指向該模式專(zhuān)用的棧地址。當(dāng)進(jìn)入該模式時(shí),可以將需要使用的寄存器保存在R13所指的棧中,當(dāng)退出該模式時(shí),將保存在R13所指的棧中的寄存器值彈出。這樣就實(shí)現(xiàn)了程序的現(xiàn)場(chǎng)保護(hù)。
寄存器R14又被稱(chēng)為連接寄存器(LR),在ARM中有下面兩種特殊用途。
① 每一種處理器模式在自己的物理R14中存放當(dāng)前子程序的返回地址。當(dāng)通過(guò)BL或者BLX指令調(diào)用子程序時(shí),R14被設(shè)置成該子程序的返回地址。在子程序中,當(dāng)把R14的值復(fù)制到程序計(jì)數(shù)器PC中時(shí),就實(shí)現(xiàn)了子程序返回。
可以通過(guò)下面兩種方式實(shí)現(xiàn)這種子程序的返回操作。
◆執(zhí)行下面任何一條指令
MOV pc, LR
BX LR
◆在子程序入口使用下面指令將PC保存到棧中:
STMFD SP!, {registers}, LR}
相應(yīng)地,下面的指令可以實(shí)現(xiàn)子程序的返回:
LDMFD SP!, { registers}, LR }
② 當(dāng)發(fā)生異常中斷的時(shí)候,該模式下的特定物理R14被設(shè)置成該異常模式將要返回的地址。對(duì)于某些異常,R14的值可能與將返回的地址有一個(gè)常數(shù)的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
3)程序計(jì)數(shù)器PC→R15
程序計(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)前指令的下兩條指令的地址。由于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ì)于用戶(hù)來(lái)說(shuō),盡量避免使用STR/STM指令來(lái)保存R15的值。當(dāng)不可避免這種使用方式時(shí),可以先通過(guò)一些代碼來(lái)確定所用的芯片使用的是哪種實(shí)現(xiàn)方式。
需要注意的是,當(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ì)于用戶(hù)來(lái)說(shuō),盡量避免使用STR/STM指令來(lái)保存R15的值。當(dāng)不可避免這種使用方式時(shí),可以先通過(guò)一些代碼來(lái)確定所用的芯片使用的是哪種實(shí)現(xiàn)方式。
假設(shè)R0指向可用的一個(gè)內(nèi)存字,下面代碼可以在R0指向的內(nèi)存字中返回該芯片所采用的地址偏移量。
STR PC, [R0] ;將PC=STR地址+offset保存到R0中
LDR R0, [R0] ;
SUB R0, R0, R1 ;offset=PC-STR地址
2.程序狀態(tài)寄存器
CPSR(當(dāng)前程序狀態(tài)寄存器)可以在任何處理器模式下被訪問(wèn)。每一種模式下都有一個(gè)專(zhuān)用的物理狀態(tài)寄存器,稱(chēng)為SPSR(備份程序狀態(tài)寄存器)。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。在異常退出時(shí),可以用 SPSR中保存的值來(lái)恢復(fù)CPSR。CPSR的具體格式如下。
CPSR(當(dāng)前程序狀態(tài)寄存器)可以在任何處理器模式下被訪問(wèn)。每一種模式下都有一個(gè)專(zhuān)用的物理狀態(tài)寄存器,稱(chēng)為SPSR(備份程序狀態(tài)寄存器)。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。在異常退出時(shí),可以用 SPSR中保存的值來(lái)恢復(fù)CPSR。CPSR的具體格式如下。
31 | 30 | 29 | 28 | 27 | 26 | 7 | 6 | 5 | 4 | 3 | 21 | 0 |
N | Z | C | V | Q | DNMLRAZ | I | F | I | M4 | M3 | M | M0 |
1)條件標(biāo)志位
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)統(tǒng)稱(chēng)為條件標(biāo)志位。大部分的ARM指令可以依據(jù)CPSR中的這些標(biāo)志位來(lái)選擇性地執(zhí)行。各條件標(biāo)志位的具體含義,如表1-4所示。
表 CPSR標(biāo)志位含義
標(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é)果是0,Z=0表示運(yùn)算結(jié)果不是零 對(duì)于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等 |
C | 在加法指令中(包括比較指令CMN),結(jié)果產(chǎn)生進(jìn)位了,則C=1,表示無(wú)符號(hào)數(shù)運(yùn)算發(fā)生上溢出,其他情況下C=0 在減法指令中(包括比較指令CMP),結(jié)果產(chǎn)生借位了,則C=0,表示無(wú)符號(hào)數(shù)運(yùn)算發(fā)生下溢出,其他情況下C=1 對(duì)于包含移位操作的非加/減法運(yùn)算指令,C中包含最后一次被溢出的位的數(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位 |
2)Q標(biāo)志位
在ARM v5的E系列處理器中,CPSR的bit[27]稱(chēng)為Q標(biāo)志位,主要用于指示增強(qiáng)的DSP指令是否發(fā)生了溢出,同樣的,SPSR的bit[27]也稱(chēng)為Q標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)志位。
3)CPSR中的控制位
CPSR的低8位I、F、T及M[4:0]統(tǒng)稱(chēng)為控制位,當(dāng)異常中斷發(fā)生時(shí)這些位發(fā)生變化。在特權(quán)級(jí)的處理器模式下,軟件可以修改這些控制位。
① I中斷禁止位
當(dāng)I=1時(shí)禁止IRQ中斷。
當(dāng)F=1時(shí)禁止FIQ中斷。
通常一旦進(jìn)入中斷服務(wù)程序可以通過(guò)置位I和F來(lái)禁止中斷,但是在本中斷服務(wù)程序退出前必須恢復(fù)原來(lái)I、F位的值。
② T控制位,用來(lái)控制指令執(zhí)行的狀態(tài),即說(shuō)明本指令是ARM指令還是Thumb指令。對(duì)于不同版本的ARM處理器,T控制位的含義是有些不同的。
對(duì)于ARM v3及更低的版本和ARM v4的非T系列版本的處理器,沒(méi)有ARM和Thumb指令的切換,所以T始終為0。
對(duì)于ARM v4及更高版本的T系列處理器,T控制位含義如下。
當(dāng)T=0,表示執(zhí)行ARM指令。
當(dāng)T=1,表示執(zhí)行Thumb指令。
對(duì)于ARM v5及更高的版本的非T系列處理器,T控制位的含義如下。
當(dāng)T=0表示執(zhí)行ARM指令。
當(dāng)T=1表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生為定義指令中斷。
③ M 控制位
控制位M[4:0]稱(chēng)為處理器模式標(biāo)識(shí)位,具體說(shuō)明如表1-5所示。
表CPSR 處理器模式位
M[4:0] | 處理器模式 | 可訪問(wèn)的寄存器 |
0b10000 | User | PC,R14~R0,CPSR |
0b10001 | FIQ | PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq |
0b10010 | IRQ | 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 |
0b11111 | System | PC,R14~R0,CPSR(ARM v4及更高版本) |
④CPSR的其他位用于將來(lái)ARM版本的擴(kuò)展,程序可以先不操作這些位。
評(píng)論