2

我找不到这个问题的答案。您能告诉我 ARM 架构何时从手臂模式切换到拇指模式吗?解释转换工作的所有方式。

4

1 回答 1

10

答案在 ARM ARM(ARM 架构参考手册)中。例如,查看 ARM 指令和 Thumb 指令中的 BX。如果这是一个家庭作业问题,还有更多说明。

另请查看伪代码以了解发生异常时会发生什么:

R14_ = 返回链接
SPSR_ = CPSR
CPSR[4:0] = 异常模式编号
CPSR[5] = 0
如果 == 重置或 FIQ 则
    CPSR[6] = 1
CPSR[7] = 1
如果 != UNDEF 或 SWI 则
    CPSR[8] = 1
CPSR[9] = CP15_reg1_EEbit
PC = 异常向量地址

上述伪代码的注释(在 ARM ARM 中)描述了您问题的另一个答案。

现在,在 BX 和其他指令描述中不明显且可能误导的是 bx rm 并不总是切换状态。thumb BX 描述说“ARM 代码和 Thumb 代码之间的分支”。好像拇指使用它会带你一直武装代码。伪代码描绘了一幅稍微好一点的画面,寄存器中地址的 lsbit 告诉您是分支到拇指代码还是手臂代码。不过,拇指描述中的 PC 伪代码具有误导性。Thumb 指令为 16 位,pc 每次向前移动 16 位,0x00、0x02、0x04 等。在 arm 模式下,指令为 32 位,pc 进入 0x00、0x04、0x08 等。(查看分支指令 ARM分支是 signed_immed<<2, 0,4,8 等。拇指分支是 signed_immed<<1, 0,2,4,6 等)

基本上,如果您有一个混合模式程序,您想使用 BX 而不是 B,特别是在返回 bx lr 而不是 mov pc,lr 时。因此 thumb 和 arm 函数都将使用 bx lr 返回。所有四个案例都包括在内,手臂呼唤手臂,手臂呼唤拇指,拇指呼唤手臂和拇指呼唤拇指。

因此,寻找影响 cpsr 的 T 位和/或影响程序计数器的指令,从而导致程序计数器在某处分支。还要小心将自己限制在您感兴趣的特定系列/内核(阅读 ARM ARM 时)、armv4t、armv6、armv6 等。您可能想要获取特定内核的 TRM(技术参考手册)使用为好。ARM ARM 非常通用,随着内核数量的增加,ARM ARM 中的具体差异并不清楚。您需要 TRM。

我有很多 ARM ARM 版本,它们都包含错误/错误。我不知道是不是有意的,所以总是需要一些黑客来找出你使用的核心是如何工作的。

2018年编辑

我不会为每个核心等列出一个清单。这就是 arm 文档的用途。

但是,答案再次在于ARM 网站上提供的架构参考手册。您可能不得不牺牲一个电子邮件地址,但非常值得。

您正在寻找的关键词是interworkor interworking。旧的/原始的手臂现在被称为armv5 architectural reference manual你寻找 aT Flag并查看哪些指令会更改该标志。对于armv7-marmv8-m ARM,您可以查找互通支持或互通地址。它还显示了影响PC但支持或不支持互通的指令列表。

对于armv7-a/r,我仍在寻找互通分支,到目前为止我还没有看到一个部分。寻找和之间的变化Thumb stateARM state有一个部分显示了从拇指状态到手臂状态的指令列表和从手臂状态到拇指状态的列表。

ARMv6(不是 -M)跨越 armv5 和 armv7 ARM,但每个指令/编码都显示了支持它的体系结构,因此您可能必须遍历每个互通分支指令并查看它们是否支持 armv6(armv4 和 armv5也显示)。blx尽管armv4T/armv5T 中有一个拇指编码不是 armv6-m/armv7-m 的一部分,但 armv7 手册并不是全部,过去该blx编码现在是 thumb2 扩展的一部分。

所有这些都支持的主要指令是BX,其他指令因体系结构而异,取决于您是否可以使用它们来切换状态。如果您正在编写模拟器,祝您好运,如果您正在编程,您可以尝试调整架构,但当它怀疑时,只需使用bx. 请注意,在 arm11-mpcore(不是像 Raspberry Pi 中的那样较旧的 arm11)中有一个未记录的错误,它在 a 之后pop pcldr pc如果该数据类似于分支指令时对数据进行预取。

我的建议是不要在 arm11 mpcore 上使用这些指令,而是做一个 armv4t 风格的 pop 或加载到一个易失性寄存器和 bx 。pop {r3}; bx r3而不是pop {pc}. 副作用很难看到,读取周期可能发生在执行读取操作的外围设备上,例如从 uart 上的数据寄存器读取并丢失字符。仅供参考,我们花了一段时间才找到并确认这一点。

于 2010-11-30T05:20:43.597 回答