我正在研究<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,我的计算出了什么问题?哪种方法正确?以及如何计算最终返回地址?顺便说一句,我的英语太差了,不好意思,希望你能理解我要表达的意思...