关于ARM的PC指针异常返回处理

发布者:InspiredDreamer最新更新时间:2020-03-15 来源: eefocus关键字:ARM  PC指针  异常返回处理 手机看文章 扫描二维码
随时随地手机看文章

要理解PC指针,首先就要好好了解LR指针


连接寄存器LR(r14):用来保存和恢复PC寄存器的内容,它有两个特殊功能。


(1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一:

MOV PC, LR 

BX LR

通常子程序这样写,保证了子程序中还可以调用子程序。

stmfd sp!, {lr}

……

ldmfd sp!, {pc}


(2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。


程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。


知道PC寄存器和LR寄存器功能以后,再了解一下ARM处理器的三级流水线和多级流水线


首先,对于ARM7对应的流水线的执行情况,如下面这个图所示:

从图中可以看出,一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,紧接着就是第二条指令的取指,然后第三条...如此嵌套


其实很容易看出,第一条指令:


add r0, r1,#5


取指完成后,PC就指向了第二条指令,此时PC=PC+4


当第一条指令译码完成以后,此时PC=PC+8


所以第一条指令开始执行时,PC值已经加了8


所以必须记住这个前提,在arm中,每次该指令执行时,其实这时的PC值是PC=PC+8


由于此处不是本文重点,更多关于多级流水线和PC为什么是PC+8的详细内容,点此跳转。


接下来谈谈我们在arm汇编时,什么时候需要PC-4, PC-8, PC什么都不减


!记住:PC不是指向你正在运行的指令,而是PC始终指向你要取指的指令的地址


我们以下面uboot中的start.S的最开始的汇编代码为例来进行解释:


00000000 <_start>:

   0: ea000014 b 58

   4: e59ff014 ldr pc, [pc, #20] ; 20 <_undefined_instruction>

   8: e59ff014 ldr pc, [pc, #20] ; 24 <_software_interrupt>

   c: e59ff014 ldr pc, [pc, #20] ; 28 <_prefetch_abort>

  10: e59ff014 ldr pc, [pc, #20] ; 2c <_data_abort>

  14: e59ff014 ldr pc, [pc, #20] ; 30 <_not_used>

  18: e59ff014 ldr pc, [pc, #20] ; 34 <_irq>

  1c: e59ff014 ldr pc, [pc, #20] ; 38 <_fiq>

 

00000020 <_undefined_instruction>:

  20: 00000120 .word 0x00000120


流水线如表格:

image.png

红色加粗字体代表:实际PC的物理地址(即PC始终指向你要取的指令的地址)


指令周期Cycle1

取指

PC总是指向将要读取的指令的地址(即我们常说的,指向下一条指令的地址),而当前PC=4,


所以去取物理地址为4对对应的指令


ldr pc, [pc, #20]

其对应二进制代码为e59ff014。


此处取指完之后,自动更新PC的值,即PC=PC+4(单个指令占4字节,所以加4)=4+4=8


指令周期Cycle2

译指

翻译地址为4的指令e59ff014


同时再去取指

PC总是指向将要读取的指令的地址(即我们常说的,指向下一条指令的地址),而当前PC=8,


所以去物理地址为8所对应的指令“ldr pc, [pc, #20]” 其对应二进制代码为e59ff014。


此处取指完之后,自动更新PC的值,即PC=PC+4=8+4=12=0xc


指令周期Cycle3

执行(指令)

执行“e59ff014”,即


ldr pc, [pc, #20]

所对表达的含义,即PC


= PC + 20


= 12 + 20


= 32


= 0x20


此处,只是计算出待会要赋值给PC的值是0x20,这个0x20还只是放在执行单元中内部的缓冲中。


译指

翻译地址为8的指令e59ff014


取指

此步骤由于是和上面a.中的执行同步做的,所以,未受到影响,继续取指,而取指的那一时刻,PC为上一Cycle更新后的值,即PC=0xc,所以是去取物理地址为0xc所对应的指令


ldr pc, [pc, #20]

对应二进制为e59ff014   此处取指完之后,自动更新PC的值,即PC=PC+4=0xc+4=0x10


用图来总结过程:

再记住:改变PC的值,会导致流水线清空!!!


好了,那我们继续来看什么时候需要PC-4, PC-8, PC什么都不减


这个取决于是在正常程序的跳转还是发生异常:


我先假设当前运行上面地址4所对应的指令,将它称作第一条指令!<即现在状态为上面cycle3>


------------------------------------------------------------------------------------------------------------------------------------------------------------


正常跳转:


如果是使用BL执行了正常程序的跳转,那么执行这条BL指令时,由于是正常的跳转指令,所以cpu会将下一句的物理地址存放在LR中,那么将8地址存放在LR中),当从子程序跳转回来的时候,那么就需要将保存在LR寄存器中的值恢复给PC寄存器,mov PC, LR     这样的指令返回


------------------------------------------------------------------------------------------------------------------------------------------------------------


异常跳转:


当前执行的是地址4对应的第一条指令,


在分别讲解各种异常之前,有一条总的原则就是:无论发生什么异常(除复位),内核总是会首先将 PC-4 放到LR寄存器中。(PC始终指向你要取指的指令的地址 即:PC = 当前指令物理地址 + 8)


IRQ异常发生时,cpu已经自动更新pc值(4+8+4=10),=》LR  = c(10-4),指向的第三条指令,如果不进行减4处理,我们回来将会漏执行第二条指令,所以PC恢复的时候就需要LR减4,所以正常从子程序返回的时候会使用如:


SUBS PC, LR,#4     返回到当前指令的下一条指令


未定义指令异常时,cpu还没有自动更新pc值(4+8=c),=》LR  = 8(c-4)  ;因为该指令未定义,所以返回时就不应该返回到这条未定义指令,而是返回到它的下一条指令,R14中保存的刚好就是下一条指令的地址,所以就不用计算了,直接将R14赋值给PC就行了,即mov PC, LR


预取指令异常时,即cpu还没有自动更新pc值(4+8=c),=》LR  = 8(c-4)  ;出现预取指令异常后,要重新再执行一次这条指令,这也是与其他异常不太一样的地方。,所以PC恢复的时候就需要R14减4,即SUBS PC, LR,#4


数据中止异常,这个异常表示当前存储器的访问不能完成,是在本指令执行完成后才发生的,即cpu已经自动更新pc值(4+8+4=10)值,=》LR  = c(10-4),我们从异常返回时,要重新再执行一次这条指令,所以PC恢复的时候就需要R14减8,即SUBS PC, LR,#8

关键字:ARM  PC指针  异常返回处理 引用地址:关于ARM的PC指针异常返回处理

上一篇:ARM的异常及向量表
下一篇:ARM处理器工作模式介绍

推荐阅读最新更新时间:2024-11-12 02:00

英伟达并购ARM案会否获准?欧盟10月13日将给出答案
据路透社最新报道,英伟达周三 (8 日) 寻求欧盟寻求批准并购英国芯片开发商ARM,欧盟执委会已将 10 月 13 日订为裁决交易的初步期限,外界预料欧盟可能和英国主管机关表达相同疑虑,破坏英伟达预定明年初完成交易的如意算盘。 不过,欧盟执委会虽然设定初步期限,但由于竞争对手与芯片客户批评,仍可能将审查时间至少延长 4 个月。 一年前,英伟达这家全球最大的GPU和人工智能芯片提供商宣布收购ARM的交易后就立即引发了半导体行业的强烈反对。 长期以来,ARM 一直是一个中立的芯片提供商,将关键知识产权授权给众多芯片公司,包括高通、三星电子和苹果等,其中一些是英伟达的竞争对手。 高通曾公开表示不支持英伟达收购ARM。高通与Google
[手机便携]
arm指令集ldr 和 mov的区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。 x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。 另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,
[单片机]
ARM-Linux驱动--DM9000网卡驱动分析(三)
ARM-Linux驱动--DM9000网卡驱动分析(二)硬件平台:FL2440(s3c2440) 内核版本:2.6.35 主机平台:Ubuntu11.04 内核版本:2.6.39 交叉编译器:arm-linuc-gcc4.3.2 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6615027 本文接上文 ARM-Linux驱动--DM9000网卡驱动分析(一) ARM-Linux驱动--DM9000网卡驱动分析(二) 下面开始看网卡设备的打开、关闭函数和操作函数 view plainprint? static const struct net_
[单片机]
<font color='red'>ARM</font>-Linux驱动--DM9000网卡驱动分析(三)
一种基于ARM和智能手机的蓝牙CAN分析仪设计
CAN (controller area network)控制器局域网络是一种实时性强、灵活性好、标准化程度高的串行数据总线,广泛应用于汽车电子、工业自动化、船舶、医疗设备、工业设备等领域。其测试设备CAN网络分析仪成为开发者的必备设备。借助使用方便的CAN总线分析仪,能够快速找到CAN总线系统在使用中出现的设计不周或异常干扰问题,并将故障和问题排除。 传统CAN分析仪需要将电脑通过USB连接到CAN分析仪上,再通过DB9接口将被测总线连接到CAN分析仪上。由于CAN总线是一种流行于车辆行业的现场总线,这样的调试方法对于需要路测的车辆就会显得不太方便,很难保证能够正常工作。同样,在工业控制领域,传统的CAN分析仪由于两段都有连
[单片机]
一种基于<font color='red'>ARM</font>和智能手机的蓝牙CAN分析仪设计
ARM承认存在漏洞 一大批苹果设备也受到波及
    近日,Intel不但被爆出重大的安全漏洞,还把ARM和AMD也拉下了水,整个电子行业都担忧会收到影响。   ARM也已经承认它的多款芯片都存在容易被利用从而受到攻击的处理器漏洞,其中Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A17都曾被用于老款的苹果设备上。这也意味着搭载苹果A4、A5、A6处理器的设备都会受到影响,这些设备包括:初代iPad mini、iPhone4/4s/5/5c、iPod Touch 4G/5G、Apple TV 2G/3G。   目前ARM已经开始指导Android和“其他操作系统”用户积极从其设备操作系统的供应商处寻求补丁,Google已经发布了针对Andro
[手机便携]
物联网操作系统现状与发展前景研讨会
  操作系统是 物联网 时代的战略制高点,今天PC和手机时代的操作系统霸主未必能在 物联网 时代延续霸业。操作系统产业的规律是,当垄断已经形成,后来者就很难颠覆,只有等待下一次产业浪潮。如今,一个全新的、充满想象空间的操作系统市场机会正在开启。下面就随嵌入式小编一起来了解一下相关内容吧。   如此关键的产业环节必然是兵家必争之地。 ARM 、谷歌、微软、华为、阿里、海尔等国内外著名的IT企业纷纷推出 物联网 操作系统,整个产业呈现出群雄逐鹿的壮观景象。传统的嵌入式系统公司也不甘示弱,纷纷通过开源和并购策略推出面向物联网软件平台,比如Intel、风河、芯科和Micrium。在一轮新的产业浪潮中,国内创业公司也走在风口浪尖上,他们纷
[嵌入式]
ARM7202触摸屏接口设计方案
1 引言 不同的应用领域触摸屏的设计方式也各不相同,一般有以下三种:⑴应用触摸屏模块。触摸屏模块提供标准的硬件接口与应用系统(一般为PC或X86架构的工控机)相连,安装驱动程序后即可工作,基本无需开发;⑵扩展触摸屏控制器。这是嵌入式系统中设计触摸屏普遍使用的方法,常用的触摸屏控制芯片有ADS7843、ADS7846等,这些芯片内部集成了A/D转换器和触摸屏的驱动电路,同时要设计一定的软件;⑶与前面方式⑵相仿,有些处理器集成了A/D转换器,通过IO口模拟触摸屏的驱动信号也可实现触摸屏的控制。 ARM7202集成了ARM7TDMI CPU核、存储器管理单元(MMU)、8KB高速缓冲存储器(Cache),主频达70MHz。是一高性能
[单片机]
<font color='red'>ARM</font>7202触摸屏接口设计方案
arm 裸板编程的总结(上)
一、嵌入式系统概述 1.微处理器相关 1.体系结构 a.冯诺依曼体系 特点:指令和数据公用同一条数据总线 注重:主频、缓存 b.哈佛体系 特点:指令和数据分开存储,使用不同的数据总线进行传输 注重:流水线的层级 缺点:不适用于 跳转(调度)比较频繁的场合 2.RISC与CISC a.CISC特点: 1.指令多 2.寻址方式多(甚至可以在内存和内存之间进行寻址,而不通过寄存器) 3.2/8法则 b.RISC特点: 1.指令少,好记 2.寻址方式少,一般只支持load/store两类访存指令 3.流水线 2.嵌入式系统的组成 1.软件 操作系统(可选) 应用程序 网络(可选) 2.硬件 a.嵌入式微处理器 分类: MCU MP
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved