如何确定一个字(4个字节)是16位指令还是32位指令?

时间:2015-03-04 16:53:41

标签: arm decoding armv7 cortex-m3 opcodes

如何知道字中的字节是代表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位指令?

感谢。

1 个答案:

答案 0 :(得分:6)

在Thumb中," 32位"说明仍然由两个单独的半字组成,所以"前半字"是编码的前半部分,它没有说明内存中的布局。 Thumb指令是半字对齐的,因此任何给定的存储器字都可以存储两个16位指令,一个16位指令和一个32位指令的一半,两个不同的32位指令的两半,或者一个整数32位指令。

从概念上讲,处理器一次解码一个半字,因此如果它看到上述位模式之一,它就知道它需要在实际执行该指令之前解码下一个半字。自从Cortex-M3 / M4 only ever actually fetch whole 32-bit words from memory以来,现实使这一点变得复杂,因此"指令的数量与#34;之间的相关性。并且实际解码和执行的指令数量取决于代码本身。想象一下,这些提取是为了重新填充一个4字节的缓冲区,管道将单个半字泄露出来(据我所知,这可能并不是真的如此)。

因此,如果你的半字包含其顶部位中的一个值,那么你就知道它是32位编码的前半部分,你需要将它与下一个半字一起解释。相反,如果你的顶部有一个半字和任何其他值,那么它可以是16位编码,也可以是32位编码的后半部分,具体取决于前一个半字是什么。

请注意,指令始终是little-endian,因此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 |
          --------------------------------