通用寄存器包括R0~R15,包括:
●未分组寄存器R0~R7。
●分组寄存器R8~14。
●程序计数器PC(R15)。
1.未分组寄存器R0~R7
在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,没有特殊用途。因此,在中断或异常处理进行模式切换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在程序设计时应引起注意。
2.分组寄存器R8~R14
对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。若要访问特定的物理寄存器而不依赖于当前的处理器模式,则要使用规定的名字。
对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。
对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中一个由用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。
采用以下的记号来区分不同的物理寄存器:(www.daowen.com)
其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
寄存器R13在ARM指令中通常用作堆栈指针,简称为SP。每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要将R13初始化为指向其运行模式的栈空间,这样,当程序运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复被保护的寄存器,采用这种方式可以保证异常发生后程序的正常执行。
R14也称作子程序链接寄存器,简称为LR。当执行BL(子程序调用)指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。
在每一种运行模式下,都可用R14保存子程序的返回地址。当用BL或BLX指令调用子程序时,将PC的当前值复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。此外,当异常出现时,相应异常模式的R14也可被设置成异常返回地址。异常返回以与子程序返回类似的方法实现,但使用的指令稍有不同。
3.程序计数器R15
寄存器R15通常用作程序计数器PC。在ARM状态下,R15的位[1:0]为0,位[31:2]用于保存PC的值;在Thumb状态下,R15的位[0]为0,位[31:1]用于保存PC的值。
R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊限制,当违反了这些限制时,程序的执行结果是未知的。
由于ARM7体系结构采用了两级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
在ARM状态下,任一时刻可以访问以上所讨论的16个通用寄存器和一到两个状态寄存器。在非用户模式(特权模式)下,则可访问特定模式分组寄存器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。