3

我想了一会儿这个问题:ARM7(具有3个管道)处理器何时增加其PC寄存器。

我原本以为,一条指令执行完后,处理器首先检查最后一次执行是否有异常,然后根据当前状态将 PC 增加 2 或 4。如果发生异常,ARM7 将改变其运行模式,将 PC 存储在当前模式的 LR 中,并开始处理当前异常,而无需修改 PC 寄存器。

但是在分析返回指令时没有任何意义。我无法弄清楚为什么当从未定义指令异常返回而从预取中止异常返回 LR-4 时,PC 将被分配 LR,这两个异常不是都发生在解码状态吗?更重要的是,根据我的教科书,无论在发生异常之前处理器处于什么状态(ARM 或 Thumb),PC 从预取异常返回时总是被分配 LR-4。但是,如果原始状态是 Thumb,我认为应该为 PC 分配 LR-2,因为 Thumb 指令是 2 个字节长,而不是 ARM 指令持有的 4 个字节,我们只想回滚当前状态的指令. 我的推理是否有任何缺陷或教科书有问题。

似乎是一个很长的问题。我真的希望任何人都可以帮助我得到正确的答案。

提前致谢。

4

1 回答 1

2

您从未定义指令处理返回到 LR,因为它指向导致陷阱的指令之后的指令;您不想再次返回相同的未定义指令,它只会遇到相同的陷阱。

如果你想再次执行相同的指令,你从 prefetch-abort 返回到 LR-4;大概是因为您已经为它映射了一些内存,所以它现在可以工作了。

ARM7 在流水线中的哪个点实际增加其 PC 无关紧要,因为执行期间 PC 的值以及因此中止处理程序中 LR 的值是 ARM 架构标准的一部分,主要基于古老的 ARM2用它的电脑做了。

但是,如果原始状态是 Thumb,我认为应该为 PC 分配 LR-2

这是有道理的,但是异常处理程序需要知道导致它触发的原始​​代码是 ARM 代码还是 Thumb 代码。这也可能影响了兼容性,因为周围有很多非 Thumb-aware 异常处理代码。因此,Thumb 架构在进入异常处理程序时伪造了 LR,以便处理程序始终可以使用相同的指令返回,即他们习惯于用于非 Thumb 代码的指令。

于 2010-04-15T12:50:01.170 回答