ARM、Thumb和Thumb 2指令编码之间的区别是什么?

ARM、Thumb和Thumb 2指令编码之间的区别是什么?,arm,thumb,Arm,Thumb,我对指令集有点困惑。有拇指,手臂和拇指2。据我所知,Thumb指令均为16位,但在《ARMv7M用户手册》(第六页)中提到了Thumb 16位和Thumb 32位指令 现在我必须克服这种困惑。据说Thumb 2支持16位和32位指令。那么,ARMv7M实际上支持Thumb 2指令而不仅仅是Thumb指令吗 还有一件事。我能说Thumb(32位)和ARM指令一样都是32位的吗?哦,ARM和它们愚蠢的命名 这是一个常见的误解,但官方并没有所谓的“Thumb-2指令集” 忽略ARMv8(其中所有内容都

我对指令集有点困惑。有拇指,手臂和拇指2。据我所知,Thumb指令均为16位,但在《ARMv7M用户手册》(第六页)中提到了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字节对齐。Thumb指令具有可变长度(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
有条件地执行(我想,它们的菜单只在UAL中定义)

*在ARMv6T2之前,实际上是一个复杂的实现细节,即
bl
(或
blx
)是作为4字节指令执行还是作为一对2字节指令执行。体系结构定义是后者,但由于它们只能按顺序成对执行,因此出于性能原因,将它们融合到一条指令中几乎不会有什么损失(除了中途中断的能力)。ARMv6T2只是根据融合的单指令执行重新定义了一些东西,正如它所暗示的,ARMv8引入了一些新的术语,试图减少混淆(当然添加了更多的新术语):

存在32位执行状态(AArch32)和64位执行状态(AArch64)

32位执行状态支持两种不同的指令集:T32(“Thumb”)和A32(“ARM”)。64位执行状态仅支持一个指令集A64

所有A64指令和所有A32指令一样,大小为32位(4字节),需要4字节对齐

许多/大多数A64指令都可以在32位和64位寄存器(或同一底层64位寄存器的32位或64位视图)上运行

所有实现AArch32的ARMv8处理器(与所有ARMv7处理器一样)都支持T32指令集中的Thumb-2指令

并非所有ARMv8-A处理器都实现AAarch32,有些处理器也没有实现AARC64。某些处理器同时支持这两种功能,但仅在较低的异常级别支持AArch32。

请参阅
它详细说明了Thumb2体系结构的增强。这同样隐含了ARM、Thumb和Thumb2指令集的描述。

同样,Thumb2中也有随时间增加的操作码。所以不是所有的拇指2都是一样的。从主CPU的角度来看,没有称为Thumb2的模式(我认为这就是您所说的“官方”的意思);当然,握臂似乎有一个想法,Thumb2是16/32位混合编码,但除此之外,它是模糊的。谢谢!这帮我解决了问题。无论如何,两天前我去了在纽伦堡举行的嵌入式世界博览会,那真是太棒了。我得到了很多关于手臂的信息。惊人的事件!那么,参数
-mthumb的相互作用实际上是(a)Thumb16与Thumb32的结合还是(b)Thumb16与32与ARM的结合呢?目前,我正在使用
-mthumb
参数进行汇编,并且在源文件中使用
.syntax unified
,以便汇编程序减少Thumb16和Thumb32编码的使用。但是我可以从源文件中删除
.syntax unified
,并在汇编时使用
-mthumb interwork
参数吗?文档并不是很清楚…Cortex M4是
armv7e-m
我能说Thumb(32位)与同样是32位的ARM指令相同吗?答案是否定的。Thumb2是32/16位的混合体,编码与直臂32位不同。我没有足够的声誉来评论unixsmurf的答案