为什么FIQ模式下的Link寄存器在thumb模式下是指令地址加4而不是指令地址加2?

问题描述 投票:0回答:1

我正在阅读 Cortex R5 技术参考手册(版本:r1p2)。并且根据手册

  • LR_SVC在ARM模式下有IA + 4,在Thumb模式下有IA+2,我可以理解,因为Thumb中的指令大小是2字节。
  • 所以我也期望 IRQ 模式有相同的行为。但它指出 LR_IRQ 在 ARM 和 Thumb 模式下都将具有 IA + 4。谁能解释一下为什么 IRQ 模式会出现这种情况?

如果您也能解释一下为什么 LR_DABT 在 ARM/Thumb 中具有 IA + 8,我将不胜感激。

  • 根据我的理解,我猜测DABT将发生在加载存储单元中,而数据处理单元中的PC将是IA + 8。(这在ARM模式下也很好,我无法理解为什么它是IA +拇指模式下为 8)。如果我错了请纠正我。

其他模式下的LR值可以参考下表。

arm instruction-set armv7 thumb cortex-a
1个回答
0
投票

为什么FIQ模式下的Link寄存器在thumb模式下是指令地址加4而不是指令地址加2?

TL;DR - 简单。

因为与使代码正确相比,他们并不关心让系统程序员的生活变得轻松。为了实现你想要的,他们必须检查模式。如果中断的指令正在改变模式怎么办?什么是正确的做法。

如果您也能解释一下为什么 LR_DABT 在 ARM/Thumb 中具有 IA + 8,我将不胜感激

这是一个类似的原因,正如你所说的。 CPU 是流水线式的,有多条指令在不同的阶段部分完成。 CPU 需要丢弃或撤消这些指令的效果,因为它们将在恢复时重新运行。

对于数据中止,加载/存储单元处于后期阶段,因此其他单元的预读取和效果已经完成。通常将非加载/存储指令与加载/存储指令交错(这会导致数据中止)。当存储通过总线到达终端设备时,CPU 已经可以完成很多工作了。要实现 DABT+4 处于

LR
状态的“愿望”,您必须接受性能下降的情况。现在你介意吗?

© www.soinside.com 2019 - 2024. All rights reserved.