当处理器处于 arm 模式时,Ax 编码是 arm 的,它将使用这些编码对找到的位进行解码。如果有不止一个 A1、A2,那么显然存在不同的特征或原因。这两条指令可以被认为是分开的(例如,看看 x86 中 mov 指令的过度使用,它有很多编码)。将每个编码视为单独的“指令”。
然后是 Tx 变体,即 thumb 和 thumb2 扩展。thumb 都是 16 位的(bl 可以被解码为两个单独的 16 位指令),它们下面的描述表示“所有 thumb 变体”或“armv4t 到现在”或一些这样的语言。thumb2 扩展都是 32 位的,前 16 位是拇指世界中未定义的指令。这些对支持它们的架构有更多限制。
您将无法为其中一个处理器完全创建反汇编程序,原因与您不能为 x86 或许多其他处理器(全部?)做一个相同的原因。如果您假设所有指令都是一种模式(手臂或拇指或拇指+拇指2)但没有模式混合(手臂+拇指),那么您可以,因为一切都是固定的指令长度,您可以简单地反汇编所有数据和代码,您不会运行任何问题。为了反汇编混合模式,您必须基本上模拟/执行指令并遵循指令流(就像可变字长指令集反汇编器一样)来尝试找到转换,这里的问题当然是在最小负载下的多指令一个寄存器然后bx那个寄存器,有时指令计算涉及数学,并且不能保证地址计算或加载发生在 bx 之前的指令。所以你可以做一些,并通过反汇编程序获得很长的路要走。
如果您使用的处理器支持/允许 thumb2,那么您在检测到拇指代码的入口点时会遇到可变指令长度问题。除非你已经这样做了,否则你必须遵循代码的执行来确定指令从哪里开始(基本可变指令长度反汇编的东西)。
技术参考手册和架构参考手册的组合将告诉您该架构 (trm) 的架构和实现是否允许手臂和拇指模式。我假设 A9 支持手臂拇指和拇指 2,所有三个。
cortex-m 家族是迄今为止唯一仅限于不支持 arm 的家族,它们的 thumb2 变化很大,因为 cortex-m0(和 m1)是 armv6m,m3 和 m4 是 armv7m(几十个(armv6m)指令到 armv7m 中的许多 thumb2 扩展)。有专门针对 -m 变体的单独架构参考手册,例如 armv7-m 与 armv7-ar 手册。