首页 理论教育 嵌入式系统通用寄存器简介

嵌入式系统通用寄存器简介

更新时间:2025-01-19 工作计划 版权反馈
【摘要】:图2.7ARM 状态下的寄存器组织未分组寄存器R0 ~R7R0 ~R7 是未分组寄存器。它们是真正并且在每种状态下都统一的通用寄存器。1)分组寄存器R8 ~R12从图2.7 中可以看出分组寄存器R8 ~R12 各有两组物理寄存器,一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。当然,在其他情况下R14 寄存器也可以作为通用寄存器使用。

通用寄存器包括R0 ~R15,可以分为三类:①未分组寄存器R0 ~R7;②分组寄存器R8 ~R14;③程序计数器PC(R15)。

图2.7 ARM 状态下的寄存器组织

(1)未分组寄存器R0 ~R7

R0 ~R7 是未分组寄存器。 这意味着在所有处理器模式下,它们每一个都访问的是同一个物理寄存器。 它们是真正并且在每种状态下都统一的通用寄存器。 在异常中断造成处理器模式切换时,在不同的异常处理模式下,如果使用寄存器名称相同,也就意味着使用相同的一个物理寄存器。 如果未加保护,模式变化后,有可能造成寄存器中存储的数据被破坏,这是特别需要注意的。 未分组寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器,但必须注意对同一寄存器在不同模式下使用时的数据保护。

(2)分组寄存器R8 ~R14

R8 ~R14 是分组寄存器。 可以大致分为两组,一组为分组寄存器R8 ~R12,一组为分组的寄存器R13 ~R14。

1)分组寄存器R8 ~R12

从图2.7 中可以看出分组寄存器R8 ~R12 各有两组物理寄存器,一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。

①FIQ 模式分组寄存器R8 ~R12

在FIQ 模式下使用R8_fiq ~R12_fiq,FIQ 处理程序可以不必保存和恢复中断现场,从而使FIQ 中断的处理过程更加迅速。

②FIQ 以外的分组寄存器R8 ~R12

在FIQ 模式以外的其他四种异常模式下,可以访问R8 ~R12 的寄存器和用户模式、系统模式下的R8 ~R12 没有区别,是属于同一物理寄存器,也没有任何指定的特殊用途。

在FIQ 模式以外的其他四种异常模式下只使用R8 ~R12 和这四种异常模式下的分组寄存器R13、R14,足以简单地处理中断。 显然,在FIQ 模式以外的中断处理中,如果要使用R8 ~R12 必须考虑保护,而在FIQ 模式下由于可以使用R8_fiq ~R12_fiq,比FIQ 模式以外的其他四种异常模式提供较多的寄存器资源,更方便异常处理。

2)分组寄存器R13、R14

寄存器R13、R14 各有6 个分组的物理寄存器。 只有一个用于用户模式和系统模式,而其他的分别用于5 种异常模式。 异常模式下R13、R14 的访问时特别需要明确指定它们的工作模式。 寄存器名字构成规则如下:

R13_<mode>

R14_<mode>

其中<mode>可以从svc、abt、und、irq 和fiq 五种模式中选取一个。(www.xing528.com)

①R13

寄存器R13 通常用做堆栈指针SP,在ARM 指令集中,并没有任何指令强制性的使用R13作为堆栈指针,而在Thumb 指令集中,有一些指令强制性地使用R13 作为堆栈指针。

每一种异常模式拥有自己的物理R13。 应用程序在对每一种异常模式进行初始化时,都要初始化该模式下的R13,使其指向相应的堆栈。 当退出异常处理程序时,将保存在R13 所指的堆栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。

②R14

寄存器R14 用作子程序链接寄存器LR(Link Register),当程序执行子程序调用指令BL、BLX 时,当前的PC 将保存在R14 寄存器中。

每一种异常模式都有自己的物理R14,R14 用来存放当前子程序的返回地址。 当执行完子程序后,只要将R14 的值复制到程序计数器PC 中,子程序即可返回。 下面两种方式可实现子程序的返回。

执行下面任何一条指令都可以实现子程序的返回:

MOV PC,LR

BX  LR

在子程序入口使用下面的指令将PC 保存到栈中:

STMFD SP!,{ <registers>,LR}

相应地,下面的指令可以实现子程序返回:

LDMFD SP!,{ <registers>,PC}

R14 还用于异常处理的返回。 当某种异常中断发生时,该异常模式下的寄存器R14 将保存基于PC(进入异常前的PC)的返回地址,在不同的流水线下,R14 所保存的值会有所不同,三级流水下的R14 保存的值为PC-4。 在一个处理器的异常返回过程中,R14 保存的返回地址可能与真正需要返回的地址有一个常数的偏移量,而且不同的异常模式这个偏移量会有所不同。 异常中断返回的方式与上面的子程序返回方式基本相同。

当然,在其他情况下R14 寄存器也可以作为通用寄存器使用。

(3)程序计数器PC(R15)

寄存器R15 被用作程序计数器,也称为PC。 它虽然可以作为一般的通用寄存器使用,但是由于R15 的特殊性,即R15 值的改变将引起程序执行顺序的变化,这有可能引起程序执行中出现一些不可预料的结果,所以对于R15 的使用一定要慎重。

当向R15 中写入一个地址值时,程序将跳转到该地址执行。 由于在ARM 状态下指令总是字对齐的,所以R15 值的第0 位和第1 位总为“0”,PC[31:2]用于保存地址。 ARM 状态下,位[1:0]为“0”,位[31:2]用于保存PC;Thumb 状态下,位[0]为“0”,位[31:1]用于保存PC。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈