如何从gcc(或其他地方)获取合法的ARM操作码列表?

时间:2011-03-16 23:00:42

标签: gcc arm llvm

我想生成伪随机ARM指令。通过汇编程序指令,我可以告诉gcc我所处的模式,如果我尝试一组在该模式下不合法的操作码和操作数,它会抱怨,所以它必须有一些内部列表,说明在哪种模式下可以做什么。那住在哪里?从LLVM中提取信息会更容易吗?

这个问题“甚至没有错”吗?我应该完全尝试不同的方法吗?

2 个答案:

答案 0 :(得分:2)

要回答我自己的问题,这实际上很容易从arm.md和gcc / config / arm /中的constraints.md做。我可能花了更多的时间来回答这个问题并回答它的评论,而不是我弄清楚这个问题。事实证明我只需要寻找'TARGET_THUMB1',直到我开始实施thumb2。

答案 1 :(得分:1)

对于ARM系列,降级在ARM ARM(ARM架构参考手册)中停止。有一个ARM指令集部分和一个Thumb指令集部分。在每个指令中都告诉你哪一代(ARMvX,其中X是某个数字,如4(arm7),或5(arm9时间帧)等)。由于每个指令都列出了操作码和伪代码,因此您应该能够确定什么是真正的指令,如果有的话,还可以保存在另一个指令上输入的语法(例如push和pop)。

特别是Cortex-m3和thumb2,您还需要查看TRM(技术参考手册)。我忘了这个名字,他们试图使用的通用语法应该适用于Thumb和ARM。例如,在ARM上,您有三个寄存器指令:

add r1,r1,r2

用拇指只有两个寄存器操作

add r1,r2

希望基本上是在中间会面,或者我会更准确地说,鼓励ARM汇编程序解析Thumb指令并使用等效的ARM指令对其进行编码而不会抱怨。这可能是以拇指而不是thumb2开始的,我总是将代码中的两种语法分开,直到最近(我仍然通常使用ARM语法进行ARM和Thumb for Thumb)。

然后是的,你必须看看汇编工具的具体实现是什么,在你的情况下是binutils。听起来你已经找到了binutils / gnu秘密解码器响铃。