棋子 · 2020年01月08日

如何计算异常的返回地址?

我正在研究<Arm体系结构参考手册ARMv7-A ARMv7-R版本>。当我阅读此手册的异常处理部分时,遇到了一个混乱,问题是如何确定异常应返回的指令地址。

这是文档中提到的方法:

假设处理器正在执行0x_0000_1000的指令,并且IRQ进入IRQ模式

根据文档,我们可以获取此异常的返回信息,如下所示:

1)首选返回地址:下一条要执行的指令的地址(在这种情况下,拇指指令集状态为0x_0000_1002,臂指令集状态为0x_0000_1004)。

2)LR: 首选返回地址加上偏移量,该偏移量取决于发生异常时的指令集状态(在这种情况下,LR = 0x_0000_1002 + 4(用于拇指指令集)和0x_0000_1004 + 4(用于arm指令状态)),因此LR = 0x_0000_1006拇指指令集状态,而LR = 0x_0000_1008为手臂指令集状态。

3)PC :在这种情况下,PC = 0x_0000_1000 + 4用于拇指指令集状态,PC = 0x_0000_1000 + 8用于拇指指令集状态。

4)文件给出一个伪代码,通过使用参数PC来计算LR

LR = PC-0,处于拇指指令设置状态。在这种情况下是LR = 0x_0000_1004-0 = 0x_0000_1004

LR = PC-4,处于布防指令设置状态。在此cse中LR = 0x_0000_1008-4 = 0x_0000_1004

在这里我们可以看到通过2)和4)可以得到直接的LR,我的计算出了什么问题?哪种方法正确?以及如何计算最终返回地址?顺便说一句,我的英语太差了,不好意思,希望你能理解我要表达的意思...

1 个回答 得票排序 · 时间排序
极术小姐姐 · 2020年01月08日

只需取(2):从LR中减去4(或在虚拟/数据中止的情况下为8)即可得到返回地址。
(4)显示核心功能。不是您的软件应该做什么。

你的回答
关注数
1
收藏数
0
浏览数
2226
极术小姐姐
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息