Encoding 为什么ARMv7中的一条指令有几个编码

Encoding 为什么ARMv7中的一条指令有几个编码,encoding,binary,arm,thumb,instruction-set,Encoding,Binary,Arm,Thumb,Instruction Set,我目前正在尝试为ARM cortex A9实现一个反汇编程序,它实现ARMv7指令集 为此,我正在使用手册“DDI0406C_b_arm_architecture_reference_manual.pdf”,可在此处下载(在arm网站上注册后): 在本手册中,在A8.8部分的详细说明中,我无法理解为什么一条指令(如A1、A2等)有多个编码,这些编码似乎都是用ARMv7实现的 此外,由于手臂皮质A9使用thumb-2,它是否也实现了A1/A2/。。。编码,还是只有T1/T2 我确实阅读过本手册的

我目前正在尝试为ARM cortex A9实现一个反汇编程序,它实现ARMv7指令集

为此,我正在使用手册“DDI0406C_b_arm_architecture_reference_manual.pdf”,可在此处下载(在arm网站上注册后):

在本手册中,在A8.8部分的详细说明中,我无法理解为什么一条指令(如A1、A2等)有多个编码,这些编码似乎都是用ARMv7实现的

此外,由于手臂皮质A9使用thumb-2,它是否也实现了A1/A2/。。。编码,还是只有T1/T2


我确实阅读过本手册的所有部分都与编码有关,但我仍然不明白如何知道程序使用的是哪种编码。

在指令流中无法真正区分ARM和Thumb。您只能根据调用函数的方式来决定(如果最低位设置为1,则为thumb,否则为arm)

ARM编码非常“稳定”,您只会发现一些A1编码,BLX是一个给出A2编码的示例,但这主要是因为新的ARM-ARM的结构与旧的不同。BL和BLX是两条不同的指令,BLX被添加到额外的指令空间中(通常用于条件的高位4位被设置为1111,这在v5之前的ARM中表示“从不执行”)


对于Thumb编码,它是不同的,有很多,因为它们必须放在一个更压缩的指令空间中,A6-220页有关于如何决定Thumb指令由两个或一个半字组成的信息。

Ax编码是arm当处理器处于arm模式时,它将解码它找到的位唱那些编码。如果有不止一个A1、A2,很明显,这有不同的特性或原因。这两条指令可以被视为独立的(例如,看看x86中过度使用mov指令,它有许多编码)。将每个编码视为单独的“指令”

然后是Tx变体,它们是thumb和thumb2扩展。thumb都是16位的(bl可以被解码为两个单独的16位指令),下面的描述表示“所有thumb变体”或“armv4t到当前”thumb2扩展都是32位的,前16位是thumb世界中未定义的指令。这些对支持它们的架构有更多限制

您将无法为其中一个处理器完全创建反汇编程序,原因与您无法为x86或许多其他处理器(全部?)创建反汇编程序相同。如果您假设所有指令都是一种模式(arm或thumb或thumb+thumb2),但没有模式混合(arm+thumb)然后你可以,因为所有的东西都是固定的指令长度,你可以简单地反汇编所有的数据和代码,你不会遇到任何问题。为了反汇编混合模式,你必须基本上模拟/执行指令并遵循指令流(就像一个可变字长的指令集反汇编程序)为了找到转换,这里的问题当然是,转换是多指令,以最小的速度加载一个寄存器,然后加载bx那个寄存器,有时指令计算涉及到数学,并且不能保证地址计算或加载发生在bx之前的指令。所以你可以做一些这样的事情,然后分解这个程序不会有太长的路要走

如果正在使用的处理器支持/允许thumb2,则在检测thumb2代码的入口点时,您会遇到指令长度可变的问题。除非您已经这样做了,否则您必须按照代码的执行来确定指令的起始位置(基本可变指令长度反汇编)

《技术参考手册》和《架构参考手册》的结合将告诉您该架构(trm)的架构和实现是否允许arm和thumb模式。我假设A9支持arm thumb和thumb2这三种模式


cortex-m系列是迄今为止唯一不支持arm的系列,它们的thumb2变化很大,因为cortex-m0(和m1)是armv6m,m3和m4是armv7m(armv7m中几十个thumb2扩展的几十条(armv6m)指令)。有专门针对-m变体的独立体系结构参考手册,例如armv7-m与armv7 ar手册。

指令的不同编码在功能上是不同的

使用不同编码的一个示例是
A8.9.12 ADR

此指令将立即值添加到PC值以形成PC相对地址,并将结果写入 目的地寄存器

如果指令编码为
A1
,则偏移量必须解释为零或正;如果指令编码为
A2
,则偏移量为负

另一个例子是
A8.8.132 POP

如果列表包含多个寄存器,则将指令汇编为编码A1。如果列表仅包含一个寄存器,则将指令汇编为编码A2

我可以想象,出于性能原因,创建不同的
POP
编码可能是为了创建不同的微代码


对于问题的第二部分,Cortex-A9是一款ARMv7-A体系结构CPU,它支持您所指手册中指定的所有指令。可能您也应该阅读。

回答得好,简洁。吹毛求疵:Cortex-A9不支持体系结构参考手册中定义的所有指令;它不支持这些指令VFPv4/AdvSIMDv2和虚拟化扩展介绍的说明。非常感谢大家,你们所有的答案都非常有用。我做到了