| |
通用寄存器可分为3类:
不分组寄存器R0-R7;
分组寄存器R8-R14;
程序计数器R15(PC).
1)不分组寄存器R0-R7
R0-R7是不分组寄存器。这意味着在所有处理器模式下,它们每一个访问的都是同一个物理寄存器。它们是真正在每种状态下都统一的通用寄存器。在异常中断造成处理器模式切换时,在不同的异常处理模式下,如果使用名称相同的寄存器。也就意味着使用相同的一个物理寄存器。如果未加保护,模式变化后,有可能造成寄存器存储的数据被破坏,这是需要特别注意的。未分组寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可使用未分组寄存器,但必须注意对同一寄存器在不同模式下使用的数据保护。
2)分组寄存器R8-R14
R8-R12是分组寄存器。可大致分为两组:一组为分组寄存器R8-R12;一组为分组寄存器R13、R14。
(1)分组寄存器R8-R12
从图中可以看出,分组寄存器R8-R12各有两组物理寄存器:一组为FIQ模式,一组为除了FIQ以外的所有模式。
① FIQ模式分组寄存器R8-R12
在FIQ模式下使用R8_fiq—R12_fiq,FIQ处理程序必不可保存和恢复中断现场,从而使FIQ中断的处理过程更加迅速。
② FIQ以外的分组寄存器R8-R12
在FIQ模式以外的其他4种异常模式下,可访问R8-R12的寄存器和用户模式。系统模式下的R8-R12没有区别,属于同一物理寄存器,也没有任何指定的特殊用途。
在FIQ模式以外的其他4种异常模式下,只使用R8-R12和这4种异常模式下的分组寄存器R13、R14,足以简单地处理中断。显然,在FIQ模式下,由于可使用R8_fiq—R12_fiq,因此比FIQ模式以外的其他4种异常模式提供较多的寄存器资源,更方便于异常处理。
(2)分组寄存器R13和R14
寄存器R13和R14各有6个分组的鳄梨寄存器。1个用于用户模式和系统模式,而其他5个分别用于5种异常模式。异常模式下进行R13、R14的访问时,需要特别明确指定工作模式。寄存器名字构成规则如下:R13_<mode>
R14_<mode>
其中<mode>可从svc、abt、und、irq和fiq着5种模式中选取一种。
① R13
寄存器R13通常用作堆栈指针SP。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为堆栈指针,用户也可使用其他寄存器作为栈指针。而在Thumb指令集中,有一些指令强制性地使用R13作为堆栈指针。每一种异常模式拥有自己的物理R13。应用程序在对每一种异常模式进行初始化时,都要初始化该模式下的R13,使其指向相应的堆栈当退出异常处理程序时,将保存在R13所指的堆栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。
② R14
寄存器R14用作子程序链接寄存器,也称为LR。当程序执行子程序调用命令BL、BLX时,当前的PC将保存在R14寄存器中。每一种异常模式都有自己的物理R14,R14用来存放当前子程序的返回地址。当执行完子程序后,只要把R14的值复制到程序计数器PC中,子程序即可返回。下面2种方式可实现子程序的返回:
MOV PC,LR
BX LR
在子程序入口使用下面的指令将PC保存到栈中:
STMFD SP!,{<registers>,LR}
相应地,下面的指令可实现子程序返回:
LDMFD SP!,{<rsgisters>,PC}
R14还用于异常处理的返回。当某种异常中断发生时,该异常模式下的寄存器R14将保存基于PC(进入异常前的PC)的返回地址。在不同的流水线下,R14所保存的值会有所不同,3级流水线下的R14保存到值为PC-4.在一个处理器的异常返回过程中,R14保存的返回值地址可能与真正需要返回的地址有一个常数的偏移量,而且对于不同的异常模式,这个偏移量会有所不同。异常中断返回的方式与上面的子程序返回方案基本相同。
当然,在其他情况下R14寄存器也作为通用寄存器使用。
3) 程序计数器R15
寄存器R15被用作程序计数器,也称为PC。它虽然可作为一般的通用寄存器使用,但由于R15的特殊性,即R15的改变将引起程序执行顺序的变化,这有可能引起程序执行中出现一些不可预料的结果,因此,对于R15的使用一定要慎重。当向R15中写入一个地址值时,程序将跳转到该地址执行。由于在ARM状态下指令总是字对齐的,所以R15值的第0位和第1位总为0,PC[31:2]用于保存地址。
需要注意的是,ARM处理器采用多级流水线技术,因此保存在R15的程序地址并不是当前指令的地址。对于3级流水线,PC总是指向下两条指令的地址,因此PC保存的是当前指令地址值加8;对于5级流水线,保存的是当前指令地址加12.到底是哪种方式,取决于ARM核采用的是几级流水线结构。但对于同一流水线结构的ARM处理器,所有指令应该是统一的,即或者采用当前指令地址加8,或者采用当前指令地址加12.
有一些指令对于R15的用法有特殊的要求。例如,指令“BX Rm”利用Rm的bit[0]来确定是跳转到ARM状态,还是跳转到Thumb状态。
凌阳教育专注嵌入式培训14年,为大量企业输送了优质的嵌入式人才,我们培养的学生得到各个企业的好评。想详细了解嵌入式培训和凌阳教育请点击www.sunplusedu.com访问凌阳教育官网。