如何判断一个字(4字节)是16位指令还是32位指令?
How to determine if a word(4 bytes) is a 16-bit instruction or 32-bit instruction?
我如何知道字中的字节代表的是 16 位指令还是 32 位指令?
我提到了ARM ARMv7M,我不清楚如何区分它是16位指令还是32位指令。
它说
如果被解码的半字的位 [15:11] 取以下任何值,则该半字是 32 位指令的第一个半字:<br>
• 0b11101
• 0b11110
• 0b11111。
否则,半字为16位指令
这是否意味着处理器总是获取半字,检查它们并决定它是 16 位还是 32 位?
第一个半字是什么意思? Bit[31-16] or Bit[15-0] in a word ?
如果我有 32 位,那么我能知道它是 32 位指令还是 16 位指令吗?
谢谢。
在 Thumb 中,“32 位”指令仍然由两个独立的半字组成,因此 "first halfword" 是编码 的第一个半字 ,它什么也没说关于内存中的布局。 Thumb 指令是半字对齐的,因此任何给定的内存字都可以容纳两条 16 位指令、一条 16 位指令和一条 32 位指令的一半、两条不同的 32 位指令的两半,或者一个完整的 32 -位指令。
从概念上讲,处理器一次解码一个半字,因此如果它看到上述位模式之一,它就知道在实际执行该指令之前还需要解码下一个半字。由于 Cortex-M3/M4 only ever actually fetch whole 32-bit words from memory,现实使这一点变得复杂,因此 "instruction fetches" 的数量与实际解码和执行的指令数量之间的相关性取决于代码本身。想象一下,这些提取是为了重新填充一个 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 |
--------------------------------
我如何知道字中的字节代表的是 16 位指令还是 32 位指令?
我提到了ARM ARMv7M,我不清楚如何区分它是16位指令还是32位指令。
它说
如果被解码的半字的位 [15:11] 取以下任何值,则该半字是 32 位指令的第一个半字:<br>
• 0b11101
• 0b11110
• 0b11111。
否则,半字为16位指令
这是否意味着处理器总是获取半字,检查它们并决定它是 16 位还是 32 位?
第一个半字是什么意思? Bit[31-16] or Bit[15-0] in a word ?
如果我有 32 位,那么我能知道它是 32 位指令还是 16 位指令吗?
谢谢。
在 Thumb 中,“32 位”指令仍然由两个独立的半字组成,因此 "first halfword" 是编码 的第一个半字 ,它什么也没说关于内存中的布局。 Thumb 指令是半字对齐的,因此任何给定的内存字都可以容纳两条 16 位指令、一条 16 位指令和一条 32 位指令的一半、两条不同的 32 位指令的两半,或者一个完整的 32 -位指令。
从概念上讲,处理器一次解码一个半字,因此如果它看到上述位模式之一,它就知道在实际执行该指令之前还需要解码下一个半字。由于 Cortex-M3/M4 only ever actually fetch whole 32-bit words from memory,现实使这一点变得复杂,因此 "instruction fetches" 的数量与实际解码和执行的指令数量之间的相关性取决于代码本身。想象一下,这些提取是为了重新填充一个 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 |
--------------------------------