ARM處理器共有37個(gè)寄存器,。其中包括:31個(gè)通用寄存器,包括程序計(jì)數(shù)器(PC)在內(nèi),。這些寄存器都是32位寄存器,。以及6個(gè)32位狀態(tài)寄存器,。但目前只使用了其中12位。ARM處理器共有7種不同的處理器模式,,在每一種處理器模式中有一組相應(yīng)的寄存器組,。任意時(shí)刻(也就是任意的處理器模式下),可見(jiàn)的寄存器包括15個(gè)通用寄存器(R0~R14),、一個(gè)或兩個(gè)狀態(tài)寄存器及程序計(jì)數(shù)器(PC),。在所有的寄存器中,有些是各模式共用的同一個(gè)物理寄存器,;有一些寄存器是各模式自己擁有的獨(dú)立的物理寄存器,。表1列出了各處理器模式下可見(jiàn)的寄存器情況。
表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
|
通用寄存器可以分為下面3類:未備份寄存器(The unbanked registers),,包括R0~R7,。備份寄存器(The banked registers),包括R8~R14,。程序計(jì)數(shù)器PC,,即R15。
未備份寄存器包括R0~R7,。
對(duì)于每一個(gè)未備份寄存器來(lái)說(shuō),,在所有的處理器模式下指的都是同一個(gè)物理寄存器。在異常中斷造成處理器模式切換時(shí),,由于不同的處理器模式使用相同的物理寄存
器,,可能造成寄存器中數(shù)據(jù)被破壞,。未備份寄存器沒(méi)有被系統(tǒng)用于特別的用途,,任何可采用通用寄存器的應(yīng)用場(chǎng)合都可以使用未備份寄存器。
對(duì)于備份寄存器R8~R12來(lái)說(shuō),,每個(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í),,FIQ處理程序可以不必執(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種處理器模式。采用記號(hào)R13_<mode>來(lái)區(qū)分各個(gè)物理寄存器:
其中,,<mode>可以是下面幾種模式之一:usr,、svc、abt,、und,、irq及fiq。
寄存器R13在ARM中常用作棧指針,。在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)。
寄存器R14又被稱為連接寄存器(Link Register,,LR),,在ARM體系中具有下面兩種特殊的作用:每一種處理器模式自己的物理R14中存放在當(dāng)前子程序的返回地址。當(dāng)通過(guò)BL或BLX指令調(diào)用子程序時(shí),,R14被設(shè)置成該子程序的返回地址,。在子程序中,當(dāng)把R14的值復(fù)制到程序計(jì)數(shù)器PC中時(shí),,子程序即返回,。
當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理R14被設(shè)置成該異常模式將要返回的地址,,對(duì)于有些異常模式,,R14的值可能與將返回的地址有一個(gè)常數(shù)的偏移量。具體的返回方式與上面的子程序返回方式基本相同,。
|