一段时间以来,我一直在阅读与 ARM ISA 相关的文档,到目前为止,我相信我对 ARM/Thumb 互通的基础知识有了很好的理解。我将在下面快速总结一下:
- 指令可以是 4 字节对齐 (ARM) 或 2 字节对齐 (Thumb)。
- Thumb 和 ARM 指令位于不同的区域,即它们不会在没有显式处理器状态更改的情况下混合使用。
- 状态更改可以在执行
bx
,blx
,ldm
,中的任何一个时发生ldr
。在 ARM 或 Thumb 之间进行选择取决于地址中最低有效位的值,分别可以是 0 或 1。 - 处理器的当前状态可以是 ARM 或 thumb。这取决于 的第 5 位的状态
CPSR
。
状态变化的规则可以总结为下图摘自本文:
但是,Thumb-2 指令让我有点困惑。例如,让我们检查指令的编码,ADC
可以在A8.8.2
ARMv7-A/R 参考手册的部分中找到。基本上,相同的指令有 3 种不同的编码 16 位 (Thumb)、32 位 (Thumb2) 和 32 位 (ARM)。
以下是我的问题:
32 位 Thumb-2 指令是否在处理器的 ARM 或 Thumb 模式下执行?(我假设是后者,但不确定)
一些资源提到 ARM/Thumb 指令可以在 thumb-2 中“自由”混合。这是否意味着使用,或不需要发生显式状态更改?
bx
blx
ldm
ldr
最后一点,这是最接近我的问题,但是,我专注于互通。