1

一段时间以来,我一直在阅读与 ARM ISA 相关的文档,到目前为止,我相信我对 ARM/Thumb 互通的基础知识有了很好的理解。我将在下面快速总结一下:

  • 指令可以是 4 字节对齐 (ARM) 或 2 字节对齐 (Thumb)。
  • Thumb 和 ARM 指令位于不同的区域,即它们不会在没有显式处理器状态更改的情况下混合使用。
  • 状态更改可以在执行bx, blx, ldm,中的任何一个时发生ldr。在 ARM 或 Thumb 之间进行选择取决于地址中最低有效位的值,分别可以是 0 或 1。
  • 处理器的当前状态可以是 ARM 或 thumb。这取决于 的第 5 位的状态CPSR

状态变化的规则可以总结为下图摘自本文

拇指状态更改规则]

但是,Thumb-2 指令让我有点困惑。例如,让我们检查指令的编码,ADC可以在A8.8.2ARMv7-A/R 参考手册的部分中找到。基本上,相同的指令有 3 种不同的编码 16 位 (Thumb)、32 位 (Thumb2) 和 32 位 (ARM)。

以下是我的问题:

  • 32 位 Thumb-2 指令是否在处理器的 ARM 或 Thumb 模式下执行?(我假设是后者,但不确定)

  • 一些资源提到 ARM/Thumb 指令可以在 thumb-2 中“自由”混合。这是否意味着使用,或不需要发生显式状态更改?bxblxldmldr

最后一点,这是最接近我的问题,但是,我专注于互通。

4

2 回答 2

3

选择模式

到目前为止,我相信我对 ARM/Thumb 互通的基础知识有了很好的理解。

嗯,这很有用,它确实是一个古老故事的一部分。最初,只有 ARM 32 位指令(1980-1990 年代中期)。然后 ARM 制作了一种类似于压缩前端的模式,将严格的 16 位操作码扩展到 32 位。这是拇指模式(1990 年代中期至 2005 年左右)。然后 ARM 推出了thumb2(有点模糊),主要是 16 位和 32 位指令的混合(约 2005 年至今)。

互通的概念仅对具有拇指(旧)和 ARM 功能的 CPU 有用。如果您有一个thumb2 CPU 和一个具有正常内存(1+等待状态)的良好编译器,那么thumb2几乎总是最好的选择。

Thumb2 混合

支持 thumb2的处理器中,您不需要互通!即,您不改变模式。您可以使用拇指16 位编码,如果您在不可能的情况下要求助记符,则汇编器会发出 32 位版本。Cortex-M CPU 只有thumb2 模式(带有指令扩展的真正的thumb模式)。

拆卸

实际上并不是三种类型的操作码,而是两种加一个扩展名

  • 原始 32 位 ARM 操作码。
  • 仅 16 位拇指编码。
  • thumb2 扩展,带有所有拇指操作码以及更多。

由于拇指操作码更密集,不可能进行所有类型的操作。所以拇指 ADC相对于ARM来说是有限的。但是,对于大多数指令,ARM Holding 更新了thumb2(CPU 中唯一的模式是 thumb;thumb2是额外的指令/操作码)以拥有 ARM 模式的所有功能ADC

在其他地方有关于在二进制中识别模式的讨论。假设代码没有试图混淆并且人们做出了理性的选择,那么您将只有两种类型的反汇编。

  1. ARM 32 位
  2. 拇指2

thumb2汇编程序应该使用纯拇指代码。大多数人不使用互通。如果他们这样做,那么大部分二进制文件将是拇指模式,而在 ARM 模式下会有一小部分性能关键部分。

thumb2的一个困难是混合的 16/32 位可能会导致反汇编程序在解码 32 位编码中间流时误解指令流。

最后一点,这是最接近我的问题,但是,我专注于互通。

在thumb2 CPU上互通毫无意义。由于您的问题被标记为disassemble,因此我试图以该重点而不是其他主要与模式有关的问题来回答。对于精灵反汇编来说,反汇编程序应该没有问题定位主要功能入口点,并且应该能够在没有太大问题的情况下进行反汇编。

于 2015-07-28T14:16:26.273 回答
2

32 位 Thumb-2 指令是否在处理器的 ARM 或 Thumb 模式下执行?

当处理器处于 Thumb 状态时, Thumb-2 指令与 Thumb 指令一样可访问,即 CPSR 中的 T 位为 1,CPSR 中的 J 位为 0。来源


一些资源提到 ARM/Thumb 指令可以在 thumb-2 中“自由”混合。这是否意味着不需要使用 bx、blx、ldm 或 ldr 进行显式状态更改?

不需要发生状态更改,因为 Thumb-2 指令和普通 Thumb 指令在相同的状态下执行。至于这如何与指令编码相匹配,ARM 架构参考手册:Thumb-2 补充说:

新的 32 位 Thumb 指令被添加到之前由 Thumb BL 和 BLX 指令占用的空间中。这是通过将 BL 和 BLX 指令视为 32 位指令而不是将它们视为两个 16 位指令来实现的。

于 2015-07-28T09:22:13.197 回答