我们常常听说的PC,LR到底是什么关系,我这次终于弄明白了。我们都知道,LR是指向PC下一次要执行的地址,但是ARM不同的工作模式,他们有不同的关系。ARM有如下几种工作模式:用户模式,FIQ模式,IRQ模式,系统模式,终止模式,数据访问终止模式,未定义模式。

  ARM是三级流水线的:取指,译码,执行。ARM的R15(PC)总是指向取指的地方,而我们总是以执行作为分析参考点,注意,取指的地方在高地址。当ARM处在ARM指令的时候,每条指令得长度为4,PC = 当前执行+8,当然如果处在THUMB指令中,每条指令长度为2,PC = 当前执行+4.

  当程序发生函数调用的时候,LR里面存放的时候函数返回的地址。当发生中断的时候,不同模式如下:

(1)SWI和未定义中断

此时PC指针的地址还没有更新,所以LR的内容为PC-4。指令地址:

  A       PC-8

  A+4   PC-4     ;LR

  A+8   PC       ;PC

  当发生中断的时候,直接返回A(PC-8)的下一条指令(PC-4)就可以了,所以在执行的时候,直接把LR给PC就行了。说白了,就是在发生这两种异常的时候,PC指针没有更新,仍然等于A+8,还是原来的数值,在返回的时候,直接在LR处执行就可以了。

返回指令:MOV  PC,LR

(2)FIQ和IRQ中断

  在这两种中断中,中断总是在执行完一条指令后开始执行,但这时候PC发生了更新,也就是说PC数值一定不是A+8 了,变成了A+12了,那么相应的LR也变成了A+8(PC-4)。

,如果返回,那么在LR(A+8)处开始执行,这样就跳过了A+4这个地址,少执行了一个指令。所以发生这两种中断的时候,应该返回LR -4。

中断前:

  A           PC -8

  A+4      PC -4                ;LR

  A+8      PC                    ;PC

  中断后:

  A          PC-12      此处中断

  A+4      PC-8       ;跳过未执行

  A+8      PC-4                 ;LR

  A+12     PC         ;已更新

说明白点,比如CPU在执行执行D的时候发生中断,在没有执行完 D指令前是不会处理中断的 ,执行完之后,PC已经更新,然后将PC-4的数值给LR,这个有系统决定,软件无法修改。即A+8。在中断 返回时, 应该执行没有执行的下一条指令,即A+4,所以在返回的时候,将LR-4,所以返回的时候PC= LR-4.返回指令为:SUB PC,LR,#4

(3) 指令中止模式中断

此种模式的中断发生时,PC不会更新,但是会在发生中断的地方重新执行,因为 CPU执行指令的时候被打断,这个指令可能就没执行完或者还没执行,一定要重新执行该指令才行 。

指令模式:

  A        PC-8     ;此处发生指令中止中断

  A+4    PC-4     ;LR

  A+8    PC       ;

所以,发生中断时,PC未更新,即PC = A+8,此时LR = PC-4,即A+4,因为要从被中断指令处重新执行,即从A处重新执行,所以返回LR-4,返回指令:SUB   PC, LR, #4

(4)数据访问中止模式中断

  此种中断模式,是在数据访问的时候发生中止,所以要像指令中止一样,从此处重新执行,但是不同的是,此时的PC已经更新,不是A+8了,而是变成A+12了,与上面情况类似,LR的数值为 PC-4,即A+8,所以要返回被中断的指令处执行,必须返回LR-8,返回指令为:

SUB   PC,  LR,  #8.

 小结:总之,能够引起PC发生更新的只有数据访问中止和FIQ和IRQ,其他都不会引起PC更新,但是不同的工作模式下,中断返回执行的地址不一样,这一点 要注意。

ARM中PC和LR寄存器的关系的更多相关文章

  1. 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.                                                 ...

  2. 大脸猫讲逆向之ARM汇编中PC寄存器详解

    i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...

  3. ARM 内核SP,LR,PC寄存器

    深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模 ...

  4. ARM中R0-R15寄存器的作用

    根据“ARM-thumb 过程调用标准”: 注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4-R11

  5. 2—ARM中的异常中断

    ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...

  6. ARM汇编编程基础之一 —— 寄存器

    ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...

  7. [zhuan]arm中的汇编指令

    http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令)   1. ".text& ...

  8. ARM中的---汇编指令

    一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是"以下是代码段& ...

  9. ARM的编程模式及寄存器

    根据朱老师的课程及下面博客整理 http://blog.chinaunix.net/uid-20443992-id-5700979.html ARM 采用的是32位架构 ARM 约定: Byte : ...

  10. ARM中的汇编指令

    Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行, 指令都是32bit的,高四位是条件码[31:28], Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节 ...

随机推荐

  1. [转帖]kingbase(人大金仓)的一些常用表操作语句

    包括 1)创建表 2)删除表 3)加字段 4)字段换名 5)字段改类型 6)字段添加注释 7)修改字段为自增类型 8)增加主键 9)查看模式下的表 一.创建和删除表 DROP TABLE IF EXI ...

  2. [转帖]nginx配置默认首页(index.html index.htm)全流程(包含遇到问题的解决)

    https://www.cnblogs.com/tujietg/p/10753041.html#:~:text=%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9 ...

  3. [转帖]Kafka 与RocketMQ 落盘机制比较

    https://www.jianshu.com/p/fd50befccfdd 引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准--软件可靠性 ...

  4. Mysql数据库部分管理命令极简学习总结

    背景 今天遇到一个得很奇怪的问题. Mysql一个运行时间很长的select阻塞了对select里面左连接表做create index 操作的SQL 当时感觉不应该, 一直以为读锁不会与独占更新锁互斥 ...

  5. Beyond Compare 的比较以及导出的简单设置方法

    最近需要对文件进行对比 但是发现对比的工作量比较难搞. 用到了beyond compare 的工具 感觉挺好用的 但是需要注意事项比较多这里记录一下 1.  session setting 里面进行设 ...

  6. MySQL数据库存储varchar时多大长度会出现行迁移?

    最近客户现场有人问过mysql数据库的一些参数配置的问题, 这边数据库需要将strict 严格模式关掉, 目的是为了保证数据库在插入字段时不会出现8126的长度限制错误问题. 但是一直很困惑, mys ...

  7. Spring源码——初识Spring容器

    Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器.为了能存多个对象,并 ...

  8. 微信小程序-应用程序生命周期方法

    官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html // app.js App({ onLau ...

  9. IServiceBehavior, IOperationBehavior,IParameterInspector

    1 public class MyOperationBehavior:Attribute, IOperationBehavior 2 { 3 public void AddBindingParamet ...

  10. PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)

    相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...