Arm 关于Thumb-2的手臂/拇指互通混淆
从一段时间以来,我一直在阅读与ARM ISA相关的文档,到目前为止,我相信我已经对ARM/Thumb互通的基础知识有了很好的理解。我将在下面简要地总结这一点:Arm 关于Thumb-2的手臂/拇指互通混淆,arm,elf,disassembly,thumb,Arm,Elf,Disassembly,Thumb,从一段时间以来,我一直在阅读与ARM ISA相关的文档,到目前为止,我相信我已经对ARM/Thumb互通的基础知识有了很好的理解。我将在下面简要地总结这一点: 指令可以是4字节对齐(ARM)或2字节对齐(Thumb) Thumb指令和ARM指令位于不同的区域,即,如果处理器状态没有显式改变,它们不会混合在一起 在执行bx、blx、ldm、ldr中的任一项时,可能会发生状态更改。ARM或Thumb之间的选择取决于地址中最低有效位的值,该值可以分别为0或1 处理器的当前状态可以是ARM或thumb
- 指令可以是4字节对齐(ARM)或2字节对齐(Thumb)李>
- Thumb指令和ARM指令位于不同的区域,即,如果处理器状态没有显式改变,它们不会混合在一起
- 在执行
、bx
、blx
、ldm
中的任一项时,可能会发生状态更改。ARM或Thumb之间的选择取决于地址中最低有效位的值,该值可以分别为0或1李>ldr
- 处理器的当前状态可以是ARM或thumb。这取决于CPSR的第5位的状态
ADC
的编码,可以在ARMv7-A/R参考手册的A8.8.2节中找到。基本上,同一条指令有3种不同的编码:16位(Thumb)、32位(Thumb2)和32位(ARM)
以下是我的问题:
- 32位Thumb-2指令是否在处理器的ARM或Thumb模式下执行?(我假设是后者,但不确定)
- 一些参考资料提到,ARM/Thumb指令可以在Thumb-2中“自由”混合使用。这是否意味着不需要使用
bx
、blx
、ldm
或ldr
进行显式的状态更改
最后一点,这是最接近我的,然而,我的重点是互通
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位指令
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位指令
选择模式
到目前为止,我相信我已经对手臂/拇指交互的基础知识有了很好的理解
这很有用,这是一个古老故事的一部分。最初,只有ARM 32位指令(1980年至1990年代中期)。然后ARM制作了一种类似压缩前端的模式,将严格意义上的16位操作码扩展到32位。这是拇指模式(20世纪90年代中期至2005年)。然后ARM推出了thumb2(有点模糊),主要是16位和32位指令的混合(从2005年到现在)
互通的概念仅适用于具有thumb(旧)和ARM功能的CPU。如果您有thumb2CPU和具有正常内存的良好编译器(1+
等待状态),那么thumb2几乎总是最佳选择
拇指2混合
在具有thumb2功能的处理器中,您不需要互通!也就是说,你不会改变模式。您可以使用thumb 16位编码,如果在不可能的情况下请求助记符,则汇编程序将发出32位版本。CPU只有thumb2模式(带指令扩展的真正thumb模式)
拆卸
实际上没有三种类型的操作码,但有两种带有一个扩展名
- 原始32位ARM操作码
- 仅16位拇指编码
- thumb2扩展,包含所有thumb操作码和更多操作码
由于thumb操作码更密集,因此不可能执行所有类型的操作。因此,与手臂相比,拇指的ADC受到限制。但是,对于大多数指令,ARM保持更新了thumb2(CPU中唯一的模式是thumb;thumb2是额外指令/操作码),以具有ARM模式ADC
的所有功能
其他地方也有关于识别二进制模式的讨论。假设代码没有试图混淆,人们做出了理性的选择,那么您只有两个t