我正在考虑这个问题:ARM7(带有3个流水线)处理器何时增加其PC寄存器。
我原本以为在执行指令后,处理器首先检查上次执行中是否有异常,然后根据当前状态将PC增加2或4。如果发生异常,ARM7将更改其运行模式,将PC存储在当前模式的LR中,并开始处理当前异常而不修改PC寄存器。
但在分析返回指令时没有任何意义。我无法理解为什么PC从未定义指令异常返回时将被分配LR,而LR-4来自prefetch-abort-exception,这两种异常都不会在解码状态下发生?更重要的是,根据我的教科书,无论在发生异常之前处理器处于什么状态(ARM或Thumb),PC都会在从prefetch-abort-exception返回时被分配LR-4。但是,如果原始状态是Thumb,我认为应该为PC分配LR-2,因为Thumb指令长2个字节而不是ARM指令保存的4个字节,我们只想回滚当前状态的指令。我的推理是否有任何缺陷或教科书有什么问题。
似乎是一个很长的问题。我真的希望有人能帮我找到正确的答案。
提前致谢。
答案 0 :(得分:2)
从未定义指令处理返回LR,因为它指向导致陷阱的指令之后的指令;你不想再次回到同一个未定义的指令,它只会遇到同样的陷阱。
如果要再次执行相同的指令,则从prefetch-abort返回LR-4;可能是因为你已经为它绘制了一些内存,所以它现在可以工作了。
在管道中的哪一点,ARM7 实际增加其PC是无关紧要的,因为执行期间PC的值以及因此中止处理程序中LR的值是作为ARM的一部分而定的架构标准,主要基于古代ARM2对其PC的作用。
但是,如果原始状态为Thumb
,我认为应该为PC分配LR-2
这是有道理的,但是异常处理程序需要知道导致它触发的原始代码是ARM还是Thumb代码。这可能也会影响兼容性,因为有很多非Thumb-aware异常处理代码。因此,Thumb架构在进入异常处理程序时捏造了LR,这样处理程序总是可以使用相同的指令返回,这是他们习惯用于非Thumb代码的指令。