电工学习网

 找回密码
 立即注册

送体验金官网

2015-3-23 07:43| 编辑:电工学习网| 查看: 4489| 评论: 0

摘要: 在ARM7TDMI处理器内部有37个用户可见的寄存器。 在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同. 所有的37个寄存器,分成两大类:(1)31个通用32位寄存器;(2)6个状态寄存器。 在汇编语 ...
   在ARM7TDMI处理器内部有37个用户可见的寄存器。
     在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同.
     所有的37个寄存器,分成两大类:(1)31个通用32位寄存器;(2)6个状态寄存器。
     在汇编语言中寄存器R0~R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
     其中R0~R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。
     寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器
     寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所 有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。
     寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。
     寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。
     R14为链接寄存器(LR),在结构上有两个特殊功能:
     在每种模式下,模式自身的R14版本用于保存子程序返回地址;
     当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
     R14寄存器与子程序调用
     操作流程:
     1.程序A执行过程中调用程序B;
     2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14;
     3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;

     R14寄存器与异常发生
     异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于有些异常有一个小常量的偏移。
     R14寄存器注意要点
     当发生异常嵌套时,这些异常之间可能会发生冲突。
     例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是 如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。
     解决办法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。 寄存器R15为程序计数器(PC),它指向正在取指的地址。可以认 为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的  方式超出了这些限制,那么结果将是不可预测的。
     读R15的限制
     正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。
     当使用STR或STM指令保存R15时,会有一个例外。这些指令可能将当前指令地址加8字节或加12字节保存(将来可能还有其它数字)。偏移量是8还是12取决于具体的ARM芯片,但是对于一个确定的芯片,这个值是一个常量。
     所以最好避免使用STR和STM指令来保存R15,如果很难做到,那么应当在程序中计算出该芯片的偏移量。
     “写R15的限制”
     正常操作时,写入R15 的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。
     由于ARM指令以字节为边界,因此写入R15的值最低两位通常为0b00。具体的规则取决于内核结构的版本:
     (1)在ARM结构V3版及以下版本中,写入R15的值的最低两位被忽略,因此跳转地址由指令的实际目标地址(写入R15的值)和0xFFFFFFFC相与得到;
     (2)在ARM结构V4版及以上版本中,写入R15的值的最低两位为0,如果不是,结果将不可预测。
     寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。详细描述参看3.8小节。
     Thumb状态寄存器
     Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:
     (1)8个通用寄存器R0~R7;(2)程序计数器(PC);(3)堆栈指针(SP);(4)链接寄 存器(LR);(5)有条件访问程序状态寄存器(CPSR)。
     在汇编语言中寄存器R0~R7为保存数据或地址值的通用寄存器。对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊的用途,并且可用于任何使用通用寄存器的指令。
     堆栈指针SP对应ARM状态的寄存器R13。每个异常模式都有其自身的SP分组版本,SP通常指向各异常模式所专用的堆栈。
     注意:在发生异常时,处理器自动进入ARM状态。
     链接寄存器LR对应ARM状态寄存器R14,在结构上有两个特殊功能,详见“ARM状态下的链接寄存器LR”。
     注意:在发生异常时,处理器自动进入ARM状态。
     ARM状态和Thumb状态之间寄存器的关系
     Thumb状态寄存器与ARM状态寄存器有如下的关系:
     (1)Thumb状态R0~R7与ARM状态R0~R7相同;
     (2)Thumb状态CPSR和SPSR与ARM状态CPSR和SPSR相同;
     (3)Thumb状态SP映射到ARM状态R13;
     (4)Thumb状态LR映射到ARM状态R14;
     (5)Thumb状态PC映射到ARM状态PC(R15)。
     下面讲一下,在Thumb状态中访问高寄存器:
     在Thumb状态中,高寄存器(R8~R15)不是标准寄存器集的一部分。汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。
     可以使用MOV、CMP和ADD指令对高寄存器操作。

看过《ARM内部寄存器》的人还看了以下文章:

发表评论

最新评论

热点文章

|电工学习网 ( )

GMT+8, 2020-2-26 02:06

Powered by © 2011-2020 www.vegfestkc.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础注册送体验金的白菜网电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

返回顶部