凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

ARM状态的通用寄存器

已有 960 次阅读| 2015-12-1 15:33 |个人分类:嵌入式培训

通用寄存器可分为3类:

不分组寄存器R0-R7;

分组寄存器R8-R14;

程序计数器R15PC.

1)不分组寄存器R0-R7

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

2)分组寄存器R8-R14

R8-R12是分组寄存器。可大致分为两组:一组为分组寄存器R8-R12;一组为分组寄存器R13R14

1)分组寄存器R8-R12

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

     FIQ模式分组寄存器R8-R12

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

FIQ以外的分组寄存器R8-R12

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

FIQ模式以外的其他4种异常模式下,只使用R8-R12和这4种异常模式下的分组寄存器R13R14,足以简单地处理中断。显然,在FIQ模式下,由于可使用R8_fiqR12_fiq,因此比FIQ模式以外的其他4种异常模式提供较多的寄存器资源,更方便于异常处理。

2)分组寄存器R13R14

寄存器R13R14各有6个分组的鳄梨寄存器。1个用于用户模式和系统模式,而其他5个分别用于5种异常模式。异常模式下进行R13R14的访问时,需要特别明确指定工作模式。寄存器名字构成规则如下:R13_<mode>

R14_<mode>

其中<mode>可从svcabtundirqfiq5种模式中选取一种。

     R13

寄存器R13通常用作堆栈指针SP。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为堆栈指针,用户也可使用其他寄存器作为栈指针。而在Thumb指令集中,有一些指令强制性地使用R13作为堆栈指针。每一种异常模式拥有自己的物理R13。应用程序在对每一种异常模式进行初始化时,都要初始化该模式下的R13,使其指向相应的堆栈当退出异常处理程序时,将保存在R13所指的堆栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。

     R14

寄存器R14用作子程序链接寄存器,也称为LR。当程序执行子程序调用命令BLBLX时,当前的PC将保存在R14寄存器中。每一种异常模式都有自己的物理R14R14用来存放当前子程序的返回地址。当执行完子程序后,只要把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位总为0PC[31:2]用于保存地址。

需要注意的是,ARM处理器采用多级流水线技术,因此保存在R15的程序地址并不是当前指令的地址。对于3级流水线,PC总是指向下两条指令的地址,因此PC保存的是当前指令地址值加8;对于5级流水线,保存的是当前指令地址加12.到底是哪种方式,取决于ARM核采用的是几级流水线结构。但对于同一流水线结构的ARM处理器,所有指令应该是统一的,即或者采用当前指令地址加8,或者采用当前指令地址加12.

有一些指令对于R15的用法有特殊的要求。例如,指令“BX Rm”利用Rmbit[0]来确定是跳转到ARM状态,还是跳转到Thumb状态。

凌阳教育专注嵌入式培训14年,为大量企业输送了优质的嵌入式人才,我们培养的学生得到各个企业的好评。想详细了解嵌入式培训和凌阳教育请点击www.sunplusedu.com访问凌阳教育官网。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 23:09 , Processed in 0.015027 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部