我们常常听说的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. feign接口自动生成工具

    最近发现开发spring cloud时,编写feign接口是一件痛苦的事,不仅要编写feign接口,还有fallback.请求参数和返回值等,大量重复工作,很浪费时间. 于是便想到可以编写工具自动生成 ...

  2. 异步httpClient(Async HttpClient)

    一.简介 二.mvn依赖 三.客户端 3.1 官网实例 3.2. 根据官方文档的介绍,简单封装了一个异步HttpClient工具类 3.3 基本原理 四.参考文档 一.简介 HttpClient提供了 ...

  3. 例2.9 建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。

    1.题目 例2.9建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算. 2.算法分析 3.代码 /* 二进制加1 */ ...

  4. 2023浙江省大学生信息安全竞赛技能赛初赛 部分wp

    CRYPTO 小小数学家 1.题目信息 查看代码 19+49=? 96-31=? 86-3=? 20+47=? 29+55=? 35+35=? 81+42=? 73-16=? 52+48=? 0+56 ...

  5. [java] - JavaBeans 获取 session

    RegServlet // 保存到 session request.getSession().setAttribute("user", user); userinfo.jsp // ...

  6. [转帖]【数据库架构】NewSQL和PGXC

    数据库架构风格 数据库的基本架构 分库分表方案 分布式事务和跨节点查询 PGXC NewSQL:原生分布式数据库 总结 数据库的两种架构风格:NewSQL(代表Google Spanner).Prxo ...

  7. [转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复

    https://tidb.net/blog/4b5451bb?utm_source=tidb-community&utm_medium=referral&utm_campaign=re ...

  8. [转帖]数据库系列之TiDB存储引擎TiKV实现机制

    TiDB存储引擎TiKV是基于RocksDB存储引擎,通过Raft分布式算法保证数据一致性.本文详细介绍了TiKV存储引擎的实现机制和原理,加深对TiDB底层存储架构的理解. 1.TiDB存储引擎Ti ...

  9. [转帖]人人都应该知道的CPU缓存运行效率

    https://zhuanlan.zhihu.com/p/628017496 提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注.但是除了利用率之外,还有很容易被人忽视的指标 ...

  10. css伪类和伪元素在项目中的使用-红色*显示

    CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...