1、寄存器
ARM微处理器共有
37个
32位寄存器,其中
31
个位通用寄存器,
6
个为状态寄存器
。但是这些寄存器不能同时被访问,具体哪些寄存器是可以访问的,取决于ARM处理器的工作状态及具体的运行模式。
但在任何时候,通用寄存器
R14~R0
、程序计数器
PC(即R15)
、一个状态寄存器都是可以访问的。
2、
寄存器(ARM状态)
在ARM工作状态下,任一时刻都可以访问16个通用寄存器和一到两个状态寄存器。在非用户模式(特权模式)下,则可访问到特定模式分组寄存器,具体如图:
3、
寄存器(Thumb状态)
Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。具体如图:
4、寄存器对应
Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系:
Thumb状态下和ARM状态下的
R0~R7是相同
的。
Thumb状态下和ARM状态下的
CPSR和SPSR是相同
的。
Thumb状态下的
SP对应
于ARM状态下的
R13
。
Thumb状态下的
LR对应
于ARM状态下的
R14
。
Thumb状态下的
程序计数器PC
对应于ARM状态下
R15
。
5、通用寄存器
-----------------------------------------------------
R0~R15
R13_svc、R13_abt、R13_und、R13_irq、R13_fiq
R13_svc、R13_abt、R13_und、R13_irq、R13_fiq
R14_svc、R14_abt、R14_und、R14_irq、R14_fiq
------------------------------------------------------------
1. 不分组寄存器(The unbanked registers)
R0 - R7
2. 分组寄存器(The banked registers)
R8 - R14
3. 程序计数器:
R15(PC)
(1)不分组寄存器
R0 - R7是不分组寄存器。这意味着在所有处理器模式下,访问的都是同一个物理寄存器。
未分组寄存器没有被系统用于特殊的用途,任何可采用通用寄存器的应用场合都可以使用不分组寄存器。
(2)分组寄存器
> 分组寄存器R8 - R12
1、FIQ模式分组寄存器R8 - R12
2、FIQ以外的分组寄存器R8 - R12
> 分组寄存器R13、R4
1、寄存器
R13通常用作堆栈指针SP。
2、寄存器
R14用作子程序链接寄存器
(Link Register - LR),也称为
LR
,指向函数的返回地址。
(3)程序计数器
寄存器R15被用作程序计数器,也称为PC。其值等于正在执行的指令的地址+8(因为在取地址和执行之间多了一个译码的阶段)。
6、状态寄存器
-----------------------------------------------------
CPSR
SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq
SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq
------------------------------------------------------------
ARM所有工作模式下都可以访问程序状态寄存器CPSR。
CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。
CPSR在每种异常模式下都有一个对应的物理寄存器——
程序状态保存寄存器SPSR
。
当异常出现时,SPSR用于保存CPSR的值,以便异常返回后恢复异常发生时的工作状态。