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

Arm 如何确定一个字(4字节)是16位指令还是32位指令?,arm,decoding,armv7,cortex-m3,opcodes,Arm,Decoding,Armv7,Cortex M3,Opcodes,如何知道单词中的字节是表示16位指令还是32位指令? 我参考了ARMv7M,不清楚如何区分它是16位指令还是32位指令。 上面写着 如果正在解码的半字的位[15:11]采用以下任一值,则该半字是32位指令的第一个半字: •0b11101 •0b11110 •0b11111。 否则,半字为16位指令 这是否意味着处理器总是提取半字,检查它们并决定是16位还是32位? 第一个半字是什么意思?字中的位[31-16]或位[15-0] 如果我有32位,那么我能知道它是32位指令还是16位指令吗 谢谢。根据

如何知道单词中的字节是表示16位指令还是32位指令?
我参考了ARMv7M,不清楚如何区分它是16位指令还是32位指令。
上面写着
如果正在解码的半字的位[15:11]采用以下任一值,则该半字是32位指令的第一个半字:
•0b11101 •0b11110 •0b11111。 否则,半字为16位指令

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

如果我有32位,那么我能知道它是32位指令还是16位指令吗

谢谢。

根据经验,“32位”指令仍然由两个独立的半字组成,因此“第一个半字”是编码的第一个半字,它与内存中的布局无关。Thumb指令是半字对齐的,因此任何给定的内存字都可以包含两条16位指令、一条16位指令和一条32位指令的一半、两条不同32位指令的一半或一条完整的32位指令

从概念上讲,处理器一次解码一个半字,因此,如果它看到上面的位模式之一,它知道它还需要解码下一个半字,然后才能实际执行此指令。由于Cortex-M3/M4的出现,现实情况使这一点变得有些复杂,因此“指令获取”数量与实际解码和执行的指令数量之间的相关性取决于代码本身。试想一下,这些抓取将重新填充一个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 |
          --------------------------------

拇指2呢?此模式具有16位和32位长指令。如果我们使用的是Thumb-2,那么同样的规则也适用于判断它是16位还是32位长的指令吗?此外,哪些体系结构具有Thumb模式,哪些体系结构具有Thumb-2?@Sam Thumb-2是32位Thumb编码,没有“Thumb-2模式”。请注意,并非自ARMv6T2以来的所有体系结构在处于Thumb状态时都支持所有Thumb-2功能-例如,v6M有一些32位编码,但不支持条件执行。感谢您提供的信息。在我的例子中,我知道在我的32位中肯定有16位或32位指令,那么我必须检查单词的位[31-16]才能知道编码,对吗?@UchiaItachi这取决于你单词的确切格式-例如,如果它确实包含16位编码,那么其他16位是什么,它们的顺序是什么?我会说“如果16位编码是一位的话,看看你希望在哪一位中找到它”,但我已经可以想象某些情况下这是不对的。以下是我的理解。我将检查位[31-16],并检查它是否是32位指令。如果不是32位指令,则位[15-0]是16位指令,另一半字可以是16位指令或32位指令的下半字。但是如果它是16位的,那么我就不用它了,我不需要另一半的单词。如果不是,那么你知道这是一条32位指令。