我一直在浏览ARM ISA相关文档,到目前为止,我相信我对ARM / Thumb互通的基础知识有了很好的理解。我将在下面快速总结一下:
bx
,blx
,ldm
,ldr
时,可能会发生状态更改。在ARM或Thumb之间进行选择取决于地址中最低有效位的值,该值分别可以是0或1。 CPSR
的第5位的状态。状态变更规则可以在下图中总结为paper:
然而,Thumb-2指令让我感到困惑。例如,让我们检查指令ADC
的编码,该编码可以在ARMv7-A / R参考手册的A8.8.2
部分找到。基本上,相同的指令具有3个不同的编码16位(Thumb),32位(Thumb2)和32位(ARM)。
以下是我的问题:
32位Thumb-2指令是在处理器的ARM或Thumb模式下执行的吗? (我假设后者但不确定)
有些资源提到ARM / Thumb指令可以自由地"用拇指2混合。这是否意味着使用bx
,blx
,ldm
或ldr
进行显式状态更改并不需要发生?
最后注意,这是我最接近的question,但是,我专注于互通。
答案 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 处理器中,您不需要互通!即,你不改变模式。您可以使用 thumb 16位编码,如果您要求无法使用的助记符,汇编程序将发出32位版本。 Cortex-M CPU只有 thumb2 模式(实际上是带有指令扩展名的 thumb 模式)。
实际上并没有三种类型的操作码,而是两种带有扩展名的操作码。
由于 thumb 操作码更密集,因此无法执行所有类型的操作。因此,与ARM相比, thumb ADC
是有限的。但是,对于大多数说明,ARM Holding更新了 thumb2 (CPU中唯一的模式是拇指; thumb2 是额外的指令/操作码)以获得ARM模式的所有功能ADC
。
有关于在其他地方识别二进制模式的讨论。假设代码没有试图混淆并且人们做出了理性的选择,那么你将只有两种类型的反汇编。
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位指令。