ARM中PC和LR寄存器的关系
我们常常听说的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寄存器的关系的更多相关文章
- 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- ARM 内核SP,LR,PC寄存器
深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模 ...
- ARM中R0-R15寄存器的作用
根据“ARM-thumb 过程调用标准”: 注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4-R11
- 2—ARM中的异常中断
ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...
- ARM汇编编程基础之一 —— 寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...
- [zhuan]arm中的汇编指令
http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text& ...
- ARM中的---汇编指令
一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是"以下是代码段& ...
- ARM的编程模式及寄存器
根据朱老师的课程及下面博客整理 http://blog.chinaunix.net/uid-20443992-id-5700979.html ARM 采用的是32位架构 ARM 约定: Byte : ...
- ARM中的汇编指令
Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行, 指令都是32bit的,高四位是条件码[31:28], Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节 ...
随机推荐
- Python定位错误:段错误 (核心已转储)
技术背景 在各种编程语言中都有可能会遇到这样一个报错:"段错误 (核心已转储)".显然是编写代码的过程中有哪里出现了问题,但是这个报错除了这几个字以外没有任何的信息,我们甚至不知道 ...
- DC - 设计和工艺数据
环境建立命令与变量 综合主要的三部分:RTL\目标工艺库\约束文件 DC综合过程中timing > area,在时序满足的条件下进行面积优化 RTL一般会映射为standcell(与非门),需要 ...
- Clock Domain Crossing
Clock Domain Crossing CDC问题主要有亚稳态问题,多比特信号同步,握手信号同步,异步Fifo等 Topics Describe the SoC Design Issues Und ...
- 你和时间管理大师,就差一个开源工具「GitHub 热点速览」
在这个快节奏的生活中,我们努力地在平衡工作.生活和个人发展,但常常感到时间不够用.如何在繁忙的日程中找到一丝丝"喘息"的机会,这个名叫 cal.com 开源项目能让你更轻松地管理日 ...
- 【rt-thread】移植touchgfx时出现如下错误和现象
[问题描述] 基于cubemx生成的touchgfx工程,移植入rt-threadkeil编译报重复定义 加载到文件组中的文件奇妙的出现了 Src_ .Device_.i2c_.Keil_ 前缀,这 ...
- vscode - Prettier插件 统一代码风格规范,保存自动格式化代码
安装 Prettier - Code formatter prettier安装完毕,使用shift+alt+f就可格式化代码. 如果需要自动保存,要在系统设置中增加"editor.forma ...
- [转帖]Nginx中absolute_redirect、port_in_redirect配置简述
一.背景: 我们在访问nginx代理下的项目前端页面时,经常会有访问链接最末尾带不带'/'的问题,当我们访问http://xxxx/home时,如果匹配不到location,会自动加上端口port以及 ...
- Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase
Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase) 前言 想着能够使用多种数据库进行一些操作. 所以本文 ...
- [转帖]tidb 搭建私有镜像库
https://docs.pingcap.com/zh/tidb/stable/tiup-mirror 在构建私有云时,通常会使用隔离的网络环境,此时无法访问 TiUP 的官方镜像.因此,TiUP 提 ...
- [转帖]CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9)
CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9) 共10073个文件 复制389-ds-base-1.3.10.2-6.el7.x86_64.rpm ...