arm寄存器之r14,r15

来源:互联网 发布:mac 把文件复制到u盘 编辑:程序博客网 时间:2024/04/30 00:54

   最近在学习ARM,发现多出一个R14寄存器(LR:返回连接寄存器),不是有PC指针寄存器(R15)了吗,怎么还需要这个呢?

于是在网上查找各种资料,发现了其中的秘密

先看定义:

(1)PC是程序计数器,存储将要执行的指令地址

(2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。

(3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中,然后再传送至IR。

区别:

(1)IR是微体系结构概念(什么是微体系结构?就是程序员看不到,但硬件中确实存在的硬件逻辑,只有系统设计者知道其存在。),而LR是程序员可见的寄存器。比如用gdb调试程序时,如果打印LR寄存器内容是可以看到其值的,但是打印IR是不可能的。

(2)LR是PC的备份,PC寄存器存的是将要执行的指令的地址;IR存的是将要送到ALU等部件执行的指令内容。


   异常的发生会导致程序正常运行的被打断,并将控制流转移到相应的异常处理(异常响应),有些异常(fiq、irq)事件处理后,系统还希望能回到当初异常发生时被打断的源程序
断点处继续完成源程序的执行(异常返回),这就需要一种解决方案,用于记录源程序的断
点位置,以便正确的异常返回。 
    类似的还有子程序的调用和返回。在主程序中(通过子程序调用指令)调用子程序时,
也需要记录下主程序中的调用点位置,以便将来的子程序的返回。

 

    在ARM处理器中使用 R14实现对断点和调用点的记录,即使用R14用作返回连接寄存器(LR )。在硬件上和指令执行上,CPU 自动完成相应返回点的记录。在ARM 汇编语言程序设计时,R14和LR通用。
    ARM处理器相应异常时,会自动完成将当前的PC保存到LR寄存器。
    ARM处理器执行子程序调用指令(BL )时,会自动完成将当前的PC的值减去4的结果数据保存到LR寄存器。即将调用指令的下紧邻指令的地址保存到LR。
    ARM处理器针对不同的模式,共有6个链接寄存器资源(LR ),其中用户模式和系统
模式共用一个 LR,每种异常模式都有各自专用的R14 寄存器(LR )。这些链接寄存器分别
为 R14、R14_svc、R14_abt、R14_und、R14_irq、R14_fiq,

  程序设计者要清晰处理器的模式与相应寄存器的对应关系,都是使用 R14,但不同模式下的R14 不是同一个物理资源,其内容可能天壤之别。
   
R14 不用做链接寄存器(LR )时,也可以用做通用数据寄存器。



   接下来我们讨论下,为什么PC指针不是每次都加1,而是加上一个固定的常数,此常数跟芯片内核架构有关。

    

     冯 ·诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”!处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取指指令的地址。程序计数器(PC )正是起到这种作用,所以通常又称之为‘指令计数器’CPU总是按照PC的指向对指令序列进行取指、译码和执行,也就是说,最终是PC 决定了程序运行流向。故而,程序计数器(PC )属于特别功能寄存器范畴,不能自由地用于存储其他运算数据。
    在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU  按照 PC的指示从内存读取第一条指令(取指)。当执行指令时,CPU自动地修改PC  的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数(指令字节数),使 PC总是指向下一条将要取指的指令地址。由于大多数指令都是按顺序来执行的,所以修改PC 的过程通常只是简单的对PC 加“指令字节数”。
    当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。处理器总是按照PC 指向取指、译码、执行,以此实现了程序转移。 


    ARM 处理器中使用R15 作为PC,它总是指向取指单元,并且ARM 处理器中只有一个PC 寄存器,被各模式共用。R15 有32 位宽度(下述标记为R15[31:0],表示R15 的‘第31位’到‘第0位'),ARM 处理器可以直接寻址4GB 的地址空间(2^32 = 4G )。

 

    (解释什么是字对齐什么是半字对齐)存储器是计算机中用于记忆数据信息的电子装置,它通过记忆“高/低”电平记忆“1/0”能记忆 1 位“1/0”数据的电子单元,称之为存储元,计算机中的存储器通常将每8 个这样的存储元组成一个单元,称之为字节,字节是处理器访问存储器的最小单位。ARM 处理器对存储器空间的访问分辨率以字节为最小单位;ARM 处理器还支持 16bit 数据(2 字节)的存储器访问和 32bit数据(4 子节)的存储器访问。在ARM 中将32 位的数据称之为‘字’,将 16 位的数据称之为‘半字’。
    ARM 处理器在对于“字”/ “半字”数据进行访问时,对数据的存储格式是有要求的。要求被访问的“半字”必须存放在存储器紧邻的两个字节单元,并且首字节地址必须能被2整除,这样存储的 16bit 数据称为 ‘半字对齐’存储数据,16bit 数据这样的存储方式称为 ‘半字对齐’存储。类似的,ARM 处理器在进“字”数据访问时,要求被访问的“字”必须 存放在存储器紧邻的4 个字节单元,并且首字节地址必须能被4 整除,这样存储的32bit 数 据称为‘字对齐’存储数据,32bit 数据这样的存储方式称为‘字对齐’存储。 


    能被2 整除数据的二进制表示,其最低位一定是‘0’;能被4 整除数据的二进制表示,
其最低两位一定是‘00’。ARM 体系要求32 位长的ARM 指令在存储器中必须字对齐存储,
16 位长的 Thumb 指令必须半字对齐存储
。因此,在ARM 状态下,R15  的值总是能被4 整
除,也就是R15 寄存器的最低2 位总是 0;Thumb 状态下,R15 的值总是能被2 整除,也就是R15 寄存器的最低位总是0。



原创粉丝点击