arm体系结构学习笔记 part4 -- 异常处理的返回

本文深入探讨了ARM体系结构中异常处理的返回过程,包括SWI和未定义指令异常、IRQ和FIQ中断、指令预取终止异常的返回。详细分析了在不同异常情况下,如何确定PC和LR的关系,以及在使用堆栈和不使用堆栈时的返回指令。通过实例解析了异常返回时PC的计算方法,帮助理解异常处理的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来说说arm指令的处理过程:

pc寄存器保存的总是当前正在取指的指令的地址。

如果有如下指令序列S1,S2,S3,S4,S5这五条指令在内存中分布为:

PC寄存器保存的总是当前正在取址的指令的地址,arm态下指令长度为4个字节,如图所示当前正在执行的指令为pc-8即pc的值为当前正在执行的指令加8

同理在arm9五级流水的情况下:

了解一下pc与arm处理指令的过程有利于我们理解异常处理进入时lr保存的pc值  与函数返回时所要执行的指令之间的关系。

在异常发生时常常要保存当前指令地址,即pc保存到lr中。以用来异常处理完毕的返回。

要清楚返回地址,我们必须弄清楚三点:

1.该种异常或者程序跳转发生在什么时候?

2.异常发生时pc的值是否更新

3.异常返回时要接着执行的指令是哪一条?




接着我们来看看各种异常发生后  进入处理函数 处理完毕如何返回

返回包含如下两个操作:
1.将SPSR_mode复制给CPSR
2.返回到异常发生处所要执行的下一条指令   之所以这么说是因为可能返回的时候进行取指操作的第一条指令还是那条触发异常发生的指令  或者触发异常发生的指令的下一条指令  而非仅仅是将lr赋给pc  
 

在谈异常返回pc的值与lr_mode之间的换算关系前    先看看两个跳转指令B 和 BL

还有一点我们要清楚的是PC总是指向当前正在执行的指令的下两条指令    即pc指向的是当前正在取址的指令

对比一下两个代码:

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值