ARM Thumb指令集是什么?

71
在《ARM11 技术参考手册》的第1-34节中,关于“Thumb指令集”写道:
“Thumb指令集是最常用的32位ARM指令的子集。Thumb指令长度为16位,并且有一个相应的32位ARM指令,在处理器模型上具有相同的效果。”
能否有人进一步解释这一点,特别是第二句话,并说明处理器如何执行它?
1个回答

99
ARM处理器有两种指令集:传统的ARM指令集,其中所有指令都是32位长,以及更加紧凑的Thumb指令集,其中大多数常见指令是16位长(部分为32位长)。可以由开发人员选择要运行哪个指令集,并且只能激活一个集合(即一旦处理器切换到Thumb模式,所有指令都将被解码为使用Thumb而非ARM)。
虽然它们是不同的指令集,但它们具有类似的功能,并且可以使用相同的汇编语言表示。例如,指令
ADDS  R0, R1, R2

该指令可以编译为ARM(E0910002/11100000100100010000000000000010)或Thumb(1888/0001100010001000)。当然,即使它们具有不同的编码,它们执行相同的功能(将r1和r2相加并将结果存储到r0中)。这就是“Thumb指令长度为16位,并且有一个对应的32位ARM指令,其对处理器模型产生相同效果”的含义。

在Thumb编码中,每个指令也都有一个对应的ARM编码,这是“子集”句子所表示的含义。


*:严格来说并不完全准确,ARM中没有“IT”指令,尽管ARM不需要“IT”指令(汇编程序会忽略它)。


42
原始的Thumb指令集只包含16位指令。Thumb2引入了混合的16/32位指令。Thumb(1)只是ARM指令集的压缩版本。在取指令时,CPU会启用“解压器”,因此最终CPU仍会处理ARM指令。对于ARM来说,这很可能是一种快速而优雅的方法,可以减少代码大小和ICache利用率,而实际内核的变化很小。Thumb2增加了许多新功能,比如提到的“IT*”指令和一些32位指令。 - Nico Erfurth
2
据我所知,“16位ARM处理器”不存在。如果你的目标是armv7或更高版本,请使用Thumb。 - kennytm
1
@Rajesh:具有独立的16位和32位模式的机器通常以大约相同的每指令速度执行两种类型的指令,但许多任务所需的32位指令数量将小于16位操作的数量。因此,对速度至关重要的代码部分通常受益于使用32位模式,而不需要该功能的部分则可以使用16位模式更加紧凑。 - supercat
1
@Rajesh。不要谈论16位和32位模式。指令的长度与处理器寄存器的长度无关。80386可以在数据上处于16位模式,地址长度为32位模式或反之亦然,而指令是相同的。ARM不能处于16位数据模式!在英特尔出现之前,x位处理器只意味着具有x位宽数据路径的处理器。英特尔至少包含4个单独的指令来将寄存器A移动到寄存器B,它们的长度不相同。Groetjes Albert - Albert van der Horst
1
@pmor 这里的“压缩”并不是指zip压缩。而是通过去除一些灵活性和做出一些假设来实现原始指令集。然后在CPU流水线前面放置了一个固定的解压器,它只实现了一个固定的Thumb-2-Arm转换。在那里,指令被扩展为完整的ARM指令。然后CPU将执行ARM指令。例如,请参见https://scienceprog.com/compressed-thumb-instructions-of-arm-mcu/。 - Nico Erfurth
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接