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