Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 关于Thumb-2的手臂/拇指互通混淆_Arm_Elf_Disassembly_Thumb - Fatal编程技术网

Arm 关于Thumb-2的手臂/拇指互通混淆

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

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

  • 指令可以是4字节对齐(ARM)或2字节对齐(Thumb)
  • Thumb指令和ARM指令位于不同的区域,即,如果处理器状态没有显式改变,它们不会混合在一起
  • 在执行
    bx
    blx
    ldm
    ldr
    中的任一项时,可能会发生状态更改。ARM或Thumb之间的选择取决于地址中最低有效位的值,该值可以分别为0或1
  • 处理器的当前状态可以是ARM或thumb。这取决于CPSR的第5位的状态
状态更改的规则可总结为下图:

然而,Thumb-2指令让我有点困惑。例如,让我们检查指令
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