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

如何从gcc(或其他地方)获得合法ARM操作码列表?,gcc,arm,llvm,Gcc,Arm,Llvm,我想生成伪随机ARM指令。通过汇编指令,我可以告诉gcc我处于哪种模式,如果我尝试在该模式下不合法的一组操作码和操作数,它会抱怨,因此它必须有一些内部列表,说明在哪种模式下可以做什么。它住在哪里?从LLVM中提取这些信息会更容易吗 这个问题“没有错”吗?我应该尝试完全不同的方法吗?回答我自己的问题,这实际上很容易从gcc/config/arm/中的arm.md和constraints.md实现。我回答这个问题和回答评论的时间可能比我弄明白这一点的时间要多。事实证明,我只需要寻找“TARGET_T

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


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

回答我自己的问题,这实际上很容易从gcc/config/arm/中的arm.md和constraints.md实现。我回答这个问题和回答评论的时间可能比我弄明白这一点的时间要多。事实证明,我只需要寻找“TARGET_THUMB1”,直到我着手实现thumb2。

对于ARM系列,责任就落在ARM上(ARM架构参考手册)。有一个ARM指令集部分和一个Thumb指令集部分。在这两条指令中,每条指令都会告诉您生成的是什么(ARMvX,其中X是一些数字,如4(arm7)或5(arm9时间帧),等等)。因为每个指令都列出了操作码和伪码,所以您应该能够弄清楚什么是真正的指令,如果有的话,还应该弄清楚在另一条指令上保存键入的语法(例如push和pop)

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

add r1,r1,r2
在thumb中,只有两个寄存器操作

add r1,r2
欲望基本上是在中间遇到,或者更准确地说,鼓励手臂装配者解析拇指指令并用等效ARM指令对它们进行编码而不抱怨。这可能是从thumb开始的,而不是thumb2,直到最近,我在代码中一直将这两个语法分开(我仍然通常使用ARM语法表示ARM,thumb表示thumb)


然后是的,你必须看看汇编工具的具体实现是什么,在你的例子中是binutils。听起来你找到了binutils/gnu秘密解码环。

只是出于好奇:你想实现什么?Mat,我认为ARM thumb emulator非常酷,我想尝试用另一种语言编写类似的东西,作为学习新语言的一种方式。我想用David的模拟器来测试我的模拟器,作为检查我没有做错任何事情的简单方法。我可以直接给它们输入相同的随机位字符串,但我想要一些更直接的指令。对它们抛出“随机”指令没有多大意义:如果两个模拟器做了不同的事情,如果你也不知道应该发生什么,你怎么知道哪一个是正确的呢?你不应该在手臂上查一下吗(ARM体系结构参考手册)?我将查看手册,这是我首先为实现所做的。从最一般的形式来看,您的评论听起来像是“为什么要麻烦测试?您不知道是您的测试失败了还是您的程序失败了”。