我目前正在尝试为ARM cortex A9实现一个反汇编程序,它实现了ARMv7指令集。
为此,我使用的是手册"DDI0406C_b_arm_architecture_reference_manual.pdf“,可以在这里下载(在arm网站上注册后):
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.architecture/index.html
在本手册中,在包含指令细节的A8.8部分中,我不明白为什么一条指令(如A1、A2等)有几种编码,而这些编码似乎都是用ARMv7实现的。
另外,由于手臂皮质A9使用了thumb-2,它是否也实现了A1/A2/...编码,或仅T1/T2...?
我真的读到了这本手册的所有部分都与编码有关,但我仍然不明白我们如何知道程序使用了哪种编码。
发布于 2013-04-20 03:57:36
指令的不同编码在功能上做了不同的事情。
使用不同编码的一个例子是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。
发布于 2013-04-20 00:13:10
在指令流中没有办法真正区分ARM和Thumb。你只能根据函数被调用的方式来决定(如果最低位被设置为1,那么它就是thumb,否则就是arm)。
ARM编码非常“稳定”,你只会发现一些A1编码,BLX是一个给出了A2编码的例子,但这主要是因为新的ARM-ARM的结构与旧的不同。BL和BLX是两个不同的指令,BLX被添加到额外的指令空间中(通常用于条件的高4位被设置为1111,在v5之前的ARM中意味着“从不执行”。
对于thumb编码,它是不同的,它们有很多,因为它们必须放在更压缩的指令空间中,A6-220页有关于如何决定thumb指令由两个或只有一个半字组成的信息。
发布于 2013-04-20 01:59:10
Ax编码是arm,当处理器处于arm模式时,它将使用这些编码对找到的位进行解码。如果有多个A1,A2,那么很明显会有不同的特性或原因。这两条指令可以被认为是分开的(例如,看看x86中过度使用mov指令,它有许多编码)。将每个编码视为单独的“指令”。
然后是Tx变体,它们是thumb和thumb2扩展。thumb都是16位的(B1可以被解码为两个单独的16位指令),并且它们的下面的描述指示“所有thumb变体”或"armv4t to The present“或某种这样的语言。thumb2扩展都是32位的,在thumb世界中,前16位是一个未定义的指令。这些在支持它们的架构上有更多的限制。
您不能为这些处理器中的一个完全创建反汇编程序,原因与您不能为x86或许多其他处理器(所有?)创建反汇编程序的原因相同。如果你假设所有的指令都是一种模式(arm、thumb或thumb+thumb2),但是没有模式混合(arm+thumb),那么你可以,因为所有的指令都是固定的指令长度,你可以简单地反汇编所有的数据和代码,你就不会遇到任何问题。为了反汇编混合模式,你必须基本上模拟/执行指令并遵循指令流(就像可变字长的指令集反汇编程序一样)来尝试找到过渡,这里的问题当然是多指令在最小程度上加载寄存器然后是bx,有时在指令计算上涉及数学,并且不能保证地址计算或加载发生在bx之前的指令。所以你可以做一些这样的事情,并通过反汇编程序获得很长的路要走。
如果您正在使用的处理器支持/允许thumb2,那么在您检测到thumb代码的入口点时,您就会遇到指令长度可变的问题。除非你已经这样做了,否则你必须跟随代码的执行来确定指令从哪里开始(基本的可变指令长度反汇编之类的东西)。
技术参考手册和体系结构参考手册的组合将告诉您该体系结构(trm)的体系结构和实现是否允许arm和thumb模式。我假设A9支持arm thumb和thumb2,这三个都支持。
皮质-m家族是到目前为止仅限于不支持arm的家族,它们的thumb2差异很大,因为皮质-m0(和m1)是armv6m,而m3和m4是armv7m (armv7m中的几十个(armv6m)指令到几十个thumb2扩展)。有专门针对-m变体的单独的体系结构参考手册,例如armv7-m和armv7-ar手册。
https://stackoverflow.com/questions/16107929
复制相似问题