博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LR和pc寄存器
阅读量:4158 次
发布时间:2019-05-26

本文共 1327 字,大约阅读时间需要 4 分钟。

 异常的发生会导致程序正常运行的被打断,并将控制流转移到相应的异常处理(异常响应),有些异常(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 )时,也可以用做通用数据寄存器。

 

 

LR 连接寄存器:Link Register

  LR寄存器的作用主要由两个:

  一是用来保存子程序的返回地址; 

  当通过BL或BLX指令调用子程序时,硬件自动将子程序返回地址保存在R14寄存器中。子程序返回时,把R14的值

复制到程序计数器PC,即可实现子程序返回。

  二是当异常发生时,R14中保存的值等于异常发生时程序计数器PC的值减4(因为cortex-m3采用3级指令流水线)。

因此在异常模式下,可以根据R14的值返回到异常发生前的相应位置,继续执行。

 

  需要注意的是:

      当调用一个函数时,返回地址被自动保存到R14连接寄存器,在函数返回时有效。这使得快速进入和返回

“叶”函数(不调用其它函数的函数)成为可能。如果函数是分枝的一部分(即函数中又调用了另外一个函数),

则R14连接寄存器必须入栈(R13)。

 

(1)PC是程序计数器,存储将要执行的指令地址(2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器,当调用函数时,返回地址即PC的值被保存到LR中(mov l,pc)。(3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中,然后再传送至IR。区别:(1)IR是微体系结构概念(什么是微体系结构?就是程序员看不到,但硬件中确实存在的硬件逻辑,只有系统设计者知道其存在。),而LR是程序员可见的寄存器。比如用gd调试程序时,如果打印LR寄存器内容是可以看到其值的,但是打印IR是不可能的。(2)LR是PC的备份,PC寄存器存的是将要执行的指令的地址;IR存的是将要送到ALU等部件执行的指令内容。

转载地址:http://pxbxi.baihongyu.com/

你可能感兴趣的文章
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
查看>>
kermit的安装和配置
查看>>
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>
进程创建时信号处理函数处理
查看>>
进程创建时信号处理
查看>>
进程创建时内存描述符处理
查看>>
进程创建时命名空间处理
查看>>
进程创建时IO处理
查看>>
进程创建时线程栈处理
查看>>
进程创建时pid分配
查看>>
进程创建时安全计算处理
查看>>
进程创建时cgroup处理
查看>>
进程创建时共享内存处理
查看>>
idle进程创建
查看>>
内核线程创建
查看>>
linux elf tool readelf
查看>>