在 Thumb 中,“32 位”指令仍然由两个单独的半字组成,因此“第一个半字”是编码的第一个半字,它没有说明内存中的布局。Thumb 指令是半字对齐的,因此任何给定的内存字都可以保存两条 16 位指令、一条 16 位指令和一条 32 位指令的一半、两条不同的 32 位指令的两半或一个完整的 32位指令。
从概念上讲,处理器一次解码一个半字,因此如果它看到上述位模式之一,它知道它还需要解码下一个半字才能真正执行该指令。由于 Cortex-M3/M4实际上只从内存中获取整个 32 位字,因此现实情况稍微复杂化了,因此“指令获取”的数量与实际解码和执行的指令数量之间的相关性取决于代码本身。试想一下,这些提取是为了重新填充一个 4 字节的缓冲区,管道会从该缓冲区中提取单个半字(据我所知,这可能与事实相去甚远)。
因此,如果您有一个半字在其高位中包含其中一个值,那么您就知道它是 32 位编码的前半部分,您需要结合下一个半字来解释它。相反,如果您的半字在其高位中有任何其他值,那么它要么是 16 位编码,要么是 32 位编码的后半部分,具体取决于前一个半字是什么。
请注意,指令总是小端,因此 32 位编码的实际内存布局如下所示,其中地址 A 是偶数:
--------------------------------
address A | bits 7:0 of first halfword |
--------------------------------
A+1 | bits 15:8 of first halfword |
--------------------------------
A+2 | bits 7:0 of second halfword |
--------------------------------
A+3 | bits 15:8 of second halfword |
--------------------------------