3

如何知道字中的字节代表 16 位指令还是 32 位指令?
我提到了 ARM ARMv7M,但我不清楚如何区分它是 16 位指令还是 32 位指令。
它说
If bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101 • 0b11110 • 0b11111. Otherwise, the halfword is a 16-bit instruction

这是否意味着处理器总是获取半字,检查它们并决定它是 16 位还是 32 位?
第一个半字是什么意思?位[31-16] 或位[15-0] 一个字?

如果我有 32 位,那么我可以知道它是 32 位指令还是 16 位指令?

谢谢。

4

1 回答 1

6

在 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 |
          --------------------------------
于 2015-03-04T22:00:54.067 回答