我目前正在尝试为ARM cortex A9实现一个反汇编程序,它实现了ARMv7指令集。
为此,我使用的手册“DDI0406C_b_arm_architecture_reference_manual.pdf”可以在这里下载(在手机网站上注册后):
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.architecture/index.html
在本手册中,在带有指令细节的A8.8部分中,我无法理解为什么一条指令(如A1,A2,...)有多种编码,这些都似乎都是用ARMv7实现的
另外,由于ARM cortex A9使用了thumb-2,它是否也实现了A1 / A2 / ...编码,或者只实现了T1 / T2 ......?
我真的读过本手册的所有部分都与编码有关,但我仍然不明白我们如何知道程序使用的是哪种编码。
答案 0 :(得分:3)
指令的不同编码在功能上做不同的事情。
使用不同编码的一个示例是A8.9.12 ADR
该指令将立即值添加到PC值以形成PC相对地址,并将结果写入 目的地登记。
如果指令编码为A1
,则必须将偏移解释为零或正,如果它被编码为A2
,则偏移为负。
另一个例子是A8.8.132 POP
如果列表包含多个寄存器,则指令将汇编为编码A1。如果列表只包含一个寄存器,则指令将汇编为编码A2。
我可以想象,出于性能原因,可能会创建不同的POP
编码,以创建不同的微码。
对于问题的第二部分,Cortex-A9是一个ARMv7-A架构CPU,它支持您指出的手册中指定的所有指令。也许你应该阅读Cortex™-A9 Technical Reference Manual。
答案 1 :(得分:1)
在指令流中无法真正区分ARM和Thumb。您只能根据调用函数的方式来决定(如果最低位设置为1则是拇指,否则为arm)。
ARM-Encoding非常“稳定”,你只能找到一些A1编码,BLX是一个给出A2编码的例子,但这主要是因为新的ARM-ARM的结构与旧版本不同那些。 BL和BLX是两个不同的指令,在附加指令空间中添加了BLX(正常用于条件的高4位设置为1111,在v5之前的ARM中意味着“从不执行”。
对于Thumb-Encodings它有所不同,它们有很多,因为它们必须放在一个更加压缩的指令空间,第A6-220页有关于如何决定拇指指令由两个或两个组成的信息只有一个半字。
答案 2 :(得分:1)
当处理器处于手臂模式时,Ax编码是手臂,它将解码使用这些编码找到的位。如果有多个A1,A2,那么显然存在不同的特征或原因。这两条指令可以分开考虑(例如,在x86中看过度指令的过度使用,它有很多编码)。将每个编码视为单独的“指令”。
然后有Tx变种,那些是拇指和拇指2扩展。拇指都是16位(bl可以解码为两个单独的16位指令),下面的描述表示“所有拇指变体”或“armv4t到现在”或某种这样的语言。 thumb2扩展都是32位,前16位是拇指世界中未定义的指令。这些对架构支持它们有更多限制。
您无法为其中一个处理器完全创建反汇编程序,原因与x86或许多其他处理器(全部?)不同。如果您假设所有指令都是一种模式(手臂或拇指或拇指+拇指2)但没有模式混合(手臂+拇指)那么您可以因为一切都是固定的指令长度而您可以简单地反汇编所有数据和代码而您不会运行陷入任何问题。为了反汇编混合模式,你必须基本上模拟/执行指令并遵循指令流(就像一个可变字长指令集反汇编程序)来试图找到转换,这里的问题当然转换是在最小负载下的多指令寄存器然后bx寄存器,有时指令计算涉及数学,并且不能保证地址计算或加载发生在bx之前的指令。所以你可以做一些,并通过拆解程序获得很长的路要走。
如果您使用的处理器支持/允许使用thumb2,那么在检测到拇指代码的入口点时,您会遇到可变指令长度问题。除非你已经这样做,否则你必须执行代码来确定指令的起始位置(基本变量指令长度反汇编的东西)。
技术参考手册和架构参考手册的组合将告诉您该架构(trm)的架构和实现是否允许手臂和拇指模式。我假设A9支持手臂拇指和拇指2,这三个。
到目前为止,皮质m家族是唯一限制不支持手臂的家族,他们的拇指2变化很大,因为皮质-m0(和m1)是armv6m而m3和m4是armv7m(几十( armv6m)指令armv7m中的许多thumb2扩展。有专门针对-m变体的独立架构参考手册,例如armv7-m与armv7-ar手册。