我对指令集有点困惑.有Thumb,ARM和Thumb 2.根据我的阅读Thumb指令都是16位,但在ARMv7M用户手册(第vi页)中,提到了Thumb 16位和Thumb 32位指令.
现在我必须克服这种困惑.据说Thumb 2支持16位和32位指令.那么ARMv7M实际上支持Thumb 2指令而不仅仅是Thumb吗?
还有一件事.我可以说Thumb(32位)与ARM指令相同,它们都是32位吗?
哦,ARM和他们愚蠢的命名......
这是一种常见的误解,但官方认为没有"Thumb-2指令集"这样的东西.
忽略ARMv8(其中所有内容都被重命名,AArch64使事情复杂化),从ARMv4T到ARMv7-A有两个指令集:ARM和Thumb.它们都是"32位",因为它们在具有32位地址的32位宽寄存器中对高达32位的数据进行操作.事实上,在它们重叠的地方,它们代表完全相同的指令 - 它只是指令编码不同,而CPU实际上只有两个不同的解码前端到它的管道,它可以在它之间切换.为清楚起见,我现在故意避免使用"32位"和"16位"这两个术语......
ARM指令具有固定宽度的4字节编码,需要4字节对齐.拇指指令具有可变长度(2或4个字节的,现在被称为"窄"和"宽")需要2字节对齐编码-大多数指令具有2字节的编码,但bl
并blx
一直有4字节编码*.真正令人困惑的是ARMv6T2,它引入了"Thumb-2技术".Thumb-2不仅包括向Thumb添加更多指令(主要是4字节编码)以使其几乎与ARM进行奇偶校验,而且还扩展了执行状态以允许条件执行大多数Thumb指令,并最终引入全新的汇编语法(UAL,"统一汇编语言")取代了以前单独的ARM和Thumb语法,允许编写一次代码并将其汇编到任一指令集而无需修改.
Cortex-M架构仅实现Thumb指令集 - ARMv7-M(Cortex-M3/M4/M7)支持大多数"Thumb-2技术",包括条件执行和VFP指令编码,而ARMv6-M(Cortex-) M0/M0 +)仅以少数4字节系统指令的形式使用Thumb-2.
因此,新的4字节编码(以及稍后在ARMv7版本中添加的编码)仍然是Thumb指令 - 它们的"Thumb-2"方面是它们可以具有 4字节编码,并且它们(大多数情况下)可以有条件地编码通过it
(并且,我认为,他们的menmonics仅在UAL中定义)执行.
*在ARMv6T2之前,关于bl
(或blx
)是作为4字节指令还是作为一对2字节指令执行,实际上是一个复杂的实现细节.架构定义是后者,但由于它们只能按顺序执行,因此出于性能原因将它们融合到一条指令中,除了中断中断的能力之外几乎没有什么损失.ARMv6T2刚刚根据融合的单指令执行重新定义了东西
除了Notlikethat的答案,并且正如它所暗示的那样,ARMv8引入了一些新的术语来试图减少混淆(当然还增加了更多的新术语):
存在32位执行状态(AArch32)和64位执行状态(AArch64).
32位执行状态支持两个不同的指令集:T32("Thumb")和A32("ARM").64位执行状态仅支持一个指令集 - A64.
所有A64与所有A32一样,指令大小为32位(4字节),需要4字节对齐.
许多/大多数A64指令可以在32位和64位寄存器上运行(或者可以说是相同底层64位寄存器的32位或64位视图).
所有ARMv8处理器(与所有ARMv7处理器一样)都支持T32指令集中的Thumb-2指令.