【问题标题】:How to determine if a word(4 bytes) is a 16-bit instruction or 32-bit instruction?如何判断一个字(4 字节)是 16 位指令还是 32 位指令?
【发布时间】:2015-03-04 16:53:41
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: arm decoding armv7 cortex-m3 opcodes


    【解决方案1】:

    在 Thumb 中,“32 位”指令仍然由两个单独的半字组成,因此“第一个半字”是编码的第一个半字,它没有说明内存中的布局。 Thumb 指令是半字对齐的,因此任何给定的内存字都可以保存两条 16 位指令、一条 16 位指令和一条 32 位指令的一半、两条不同的 32 位指令的两半或一个完整的 32 -位指令。

    从概念上讲,处理器一次解码一个半字,因此如果它看到上述位模式之一,它知道它还需要解码下一个半字才能真正执行该指令。自从 Cortex-M3/M4 only ever actually fetch whole 32-bit words from memory 以来,现实情况稍微复杂化了这一点,因此“指令获取”的数量与实际解码和执行的指令数量之间的相关性取决于代码本身。试想一下,这些提取是为了重新填充一个 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 |
              --------------------------------
    

    【讨论】:

    • Thumb-2 怎么样?此模式具有 16 位和 32 位长指令。如果我们在 Thumb-2 中,相同的规则是否适用于判断它是 16 位还是 32 位长指令?另外,哪些架构有 Thumb 模式,哪些有 Thumb-2?
    • @Sam Thumb-2 32 位 Thumb 编码 (along with other stuff),没有“Thumb-2 模式”。请注意,并非所有自 ARMv6T2 以来的架构都支持 Thumb 状态下的所有 Thumb-2 功能 - 例如v6M 有一些 32 位编码,但不支持条件执行。
    • 感谢您的信息。就我而言,我知道在我拥有的 32 位中肯定有 16 位或 32 位指令,那么我必须检查单词的位 [31-16] 才能知道编码,对吗?
    • @UchiaItachi 这取决于您单词的确切格式 - 例如如果它确实包含 16 位编码,那么 other 16 位是什么,它们的顺序是什么?我会说“看看你希望在哪个位中找到 16 位编码,如果它是一个”,但我已经可以想象在某些情况下这是不正确的。
    • 以下是我的理解。我会检查 bits[31-16] 并检查它是否是 32 位指令。如果它不是 32 位指令,则 bits[15-0] 是 16 位指令,另一个半字可以是 16 位指令或 32 位指令的下半字。但是如果它是 16 位的,那么我已经完成了它,我不需要另一个半字是什么。如果不是,则知道它是 32 位指令。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2023-02-05
    • 2010-12-29
    • 2020-02-11
    • 2014-05-06
    • 1970-01-01
    • 2018-06-14
    • 2011-11-27
    相关资源
    最近更新 更多