有关Thumb-2的ARM / Thumb交互操作混淆

时间:2015-07-28 08:51:06

标签: arm elf disassembly thumb

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

  • 指令可以是4字节对齐(ARM)或2字节对齐(Thumb)。
  • Thumb和ARM指令位于不同的区域,即如果没有显式处理器状态更改,它们不会混合。
  • 执行bxblxldmldr时,可能会发生状态更改。在ARM或Thumb之间进行选择取决于地址中最低有效位的值,该值分别可以是0或1。
  • 处理器的当前状态可以是ARM或拇指。这取决于CPSR的第5位的状态。

状态变更规则可以在下图中总结为paper

thumb state change rules]

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

以下是我的问题:

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

  • 有些资源提到ARM / Thumb指令可以自由地"用拇指2混合。这是否意味着使用bxblxldmldr进行显式状态更改并不需要发生?

最后注意,这是我最接近的question,但是,我专注于互通。

2 个答案:

答案 0 :(得分:3)

选择模式

  

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

嗯,这很有用,它确实是旧故事的一部分。最初,只有ARM 32位指令(1980年代 - 1990年代中期)。然后,ARM制作了一个类似于压缩前端的模式,将严格的16位操作码扩展为32位。这是 thumb 模式(20世纪90年代中期到2005年)。然后ARM出现了 thumb2 (这有些模糊),主要是16bit和32bit指令的混合(~2005到当前)。

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

Thumb2混合

thumb2 处理器中,您不需要互通!即,你不改变模式。您可以使用 thumb 16位编码,如果您要求无法使用的助记符,汇编程序将发出32位版本。 Cortex-M CPU只有 thumb2 模式(实际上是带有指令扩展名的 thumb 模式)。

拆卸

实际上并没有三种类型的操作码,而是两种带有扩展名的操作码。

  • 原始32位ARM操作码。
  • 仅限16位拇指编码。
  • thumb2 扩展程序,所有拇指操作码加上更多。

由于 thumb 操作码更密集,因此无法执行所有类型的操作。因此,与ARM相比, thumb ADC是有限的。但是,对于大多数说明,ARM Holding更新了 thumb2 (CPU中唯一的模式是拇指; thumb2 是额外的指令/操作码)以获得ARM模式的所有功能ADC

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

  1. ARM 32位
  2. 的Thumb2
  3. thumb2 反汇编程序应该使用纯 thumb 代码。大多数人不使用交互工作。如果他们这样做,那么二进制文件的很大一部分将是拇指模式,在ARM模式下具有较小的性能关键部分。

    thumb2 的一个难点是混合的16/32位可能会导致反汇编程序错误解释指令流,如果它解码一个32位编码的中间流。

      

    最后请注意,这是我的the closest question,然而,我正专注于互通。

    互通 thumb2 CPU上毫无意义。由于您的问题被标记为反汇编,因此我尝试回答这个问题,而不是主要关于模式是什么的其他问题。对于 elf 反汇编,反汇编程序应该没有任何问题来找到主要功能入口点,并且应该能够在没有太多问题的情况下进行反汇编。

答案 1 :(得分:2)

  

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

     

可以访问Thumb-2指令,当处理器处于Thumb状态时,Thumb指令,即CPSR中的T位为1且J位在CPSR中为0. source

  

有些资源提到ARM / Thumb指令可以自由地&#34;用拇指2混合。这是否意味着使用bx,blx,ldm或ldr显式状态变化是否不需要发生?

不需要进行状态更改,因为Thumb-2指令和普通Thumb指令在相同的状态下执行。至于如何适应指令编码, ARM体系结构参考手册:Thumb-2补充说明了这一点:

  

新的32位Thumb指令添加在Thumb BL和BLX先前占用的空间中   说明。这可以通过将BL和BLX指令视为32位指令而不是   将它们视为两个16位指令。