ARM微处理器一共有37个32位寄存器,其中包括31个通用寄存器和6个状态寄存器,但是这些寄存处不能同时访问。但是通用寄存器R14 - R0 ,程序计数器PC(即R15),程序状态寄存器都是可以任何时候访问的。
ARM共有7种不同的处理器模式,在每一组处理器模式下都有一组相应的寄存器组。 在所有的运行模式下,未分组寄存器R0 ~ R7都指向同一个物理寄存器,他们未被系统用作特殊的用途,所以R0,R1,R2,R3,R4,R5,R6,R7都可以放心使用。
但是由于不同的处理器运行模式(包括7中不同运行模式:用户模式usr,系统模式,特权模式,中止模式,未定义指令模式,中断模式,快速中断模式)均使用相同的物理寄存器,可能会造成寄存器中的数据的破坏,所以在切换不同模式时要注意保存当前寄存器的值。
R0~R7为低地址寄存器,可以指定通用寄存器的所有指令访问,R8~R12为高地址寄存器,只能被指定通用寄存器的所有32位指令访问,而不能被16位指令访问。R8 ~ R12又称备份寄存器。对于R8 ~ R12来说每个寄存器对应两个不同的物理寄存器,对于R13和R14每个寄存器对应6个不同的物理寄存器。R13常用作堆栈指针寄存器,由于处理器的每种运行模式均有自己独立的物理寄存器R13(注:用户模式和系统模式下共享一个物理寄存器),所以用户在应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该模式下的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指的堆中,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
R14也称作子程序链接寄存器或者链接寄存器LR(Link Register).主要用于存放子程序的返回地址。
R15寄存器R15常用作程序计数器,自作PC。注意:由于ARM采用流水线机制,程序计数器PC的值不是指向当前正在执行的指令,对于ARM指令集而言,PC总是指向当前指令的下 两条指令的 地址。即PC的值为当前指令的地址+ 8个字节。
R16寄存器为当前程序状态寄存器(Current Program Status Register)CPSR 可以在任何模式下被访问。包括条件标志位,中断禁止位,当前处理器模式及其他状态和控制信息。每种异常模式都有一个程序状态寄存器,称为SPSR(Saved Program Status Register,属于备份的程序状态寄存器。)当异常发生时,SPSR用于保存CPSR的当前值,当从异常模退出时则可由SPSR来恢复CPSR.由于用户模式和系统模式不属于异常模式,所以它们没有SPSR.
总结:
这样看来的话:R0 ~R7放心使用,R8~R12小心使用(而且只能被指定通用寄存器的32位指令访问,不能被16位指令访问),在快速中断模式下,访问的是R8_fiq ~ R12_fiq .在其余模式下访问的就是R8_usr ~ R12_usr. R13,R14,R15,R16 ,系统都用于特殊用户就不要使用了。 但是在任何时候都可以访问这些寄存器,获取相应的信息。
参考:ARM嵌入式系统开发完全入门与主流实践。封景刚,吴宝江编著