什么是ARM Thumb指令集?

Sor*_*ush 38 arm instruction-set thumb

在"ARM11TechnicalRefManual"的第1-34节"拇指指令集"下,它说:

"Thumb指令集是最常用的32位ARM指令的子集.Tumb指令长16位,并且具有相应的32位ARM指令,对处理器型号具有相同的影响."

谁可以解释更多关于这个特别是第二句话,并说处理器如何执行它?

ken*_*ytm 49

ARM处理器有2个指令集,传统ARM集,其中所述指令是所有32位长,并且更稠拇指集,其中最常见的指令是16位长(和一些是32位长).开发人员可以选择运行哪个指令集,并且只有一个集合可以处于活动状态(即,一旦处理器切换到Thumb模式,所有指令将被解码为使用Thumb而不是ARM).

虽然它们是不同的指令集,但它们共享相似的功能,并且可以使用相同的汇编语言表示.例如,指令

ADDS  R0, R1, R2
Run Code Online (Sandbox Code Playgroud)

可以编译为ARM(E0910002/11100000 10010001 00000000 00000010)或Thumb(1888/00011000 10001000).当然,它们执行相同的功能(添加r1和r2并将结果存储到r0),即使它们具有不同的编码.这是Thumb指令长度为16位的含义,并且具有相应的32位ARM指令,对处理器型号具有相同的效果.

Thumb编码中的每个*指令在ARM中也具有相应的编码,其由"子集"句子表示.


*:不完全正确,ARM中没有"IT"指令,尽管ARM无论如何都不需要"IT"(汇编器会忽略它).

  • 原始Thumb-Instruction集仅包含16位指令.Thumb2引入了混合16/32位指令.Thumb(1)只是ARM指令集的压缩版本.CPU将在取指令时启用"解压缩器",因此CPU最终仍处理ARM指令.对于ARM来说,这很可能是一个快速但优雅的黑客,可以减少代码大小和ICache-Utilization,而实际内核几乎没有变化.Thumb2添加了许多新功能,如提到的"IT*"指令和一些32位指令. (23认同)
  • @pmor 这并不意味着像 zip 压缩那样“压缩”。但最初的指令集基本上是通过消除一些灵活性并采取假设来实现的。然后CPU管道前面有一个固定的解压缩器,它只是实现了固定连线的拇指2臂翻译。在那里,指令被扩展为完整的手臂指令。CPU将执行ARM指令。例如,请参见 https://scienceprog.com/compressed-thumb-instructions-of-arm-mcu/。 (3认同)
  • @Rajesh AFAIK 没有“16 位 ARM 处理器”。如果您的目标是armv7或更高版本,请使用Thumb。 (2认同)
  • @Rajesh:具有单独 16 位和 32 位模式的机器倾向于以大约相同的每条指令速度执行这两种指令,但执行许多任务所需的 32 位指令数量将小于16 位操作。因此,对速度至关重要的代码部分通常会受益于使用 32 位模式,而对速度不敏感的部分则可以使用 16 位模式变得更加紧凑。 (2认同)