x86指令集的声明性表示

时间:2013-10-13 15:41:39

标签: assembly x86

我正在为编译器编写一个x86后端,并且发现编写我需要的每个汇编指令的机器代码真的很乏味,我显然正在重新发明轮子。是否在任何地方都有该指令集的声明性表示,例如一个XML文件映射指令操作和操作数到字节?

2 个答案:

答案 0 :(得分:1)

我强烈建议您使用DynASM。它不是一个声明性的描述,但它可以让你绝对控制发出的指令,并且它比声明性描述更容易使用。这是编写特定于平台的codegen IMO的理想方式。

它也非常小而且不引人注意:运行时完全包含在几百行.h个文件中。

有关使用DynASM编写非常简单的codegen的示例,请参阅我的DynASM tutorial

即使您不相信DynASM,您也可以在DynASM代码库中找到a pretty concise declarative description of x86 instructions,您可能会发现它很有用。

答案 1 :(得分:1)

我在下面假设你不想在运行时依赖像 LLVM 这样的大东西。

我研究这个问题的原因是我想向 self-hosting Lisp 添加一个机器码发射器,其大小在 2000-3000 LoC 的范围内。解决当前的 LLVM 依赖项,或 Gnu 汇编程序依赖项,将使该项目背后的理想失效:从尽可能少的代码实现自托管。

这是我目前发现的:

还有 LLVM 的 TableGen

这很重要,要从其声明性描述生成您自己的代码,您需要编写 C++ 代码(除非您准备好自己解析和处理其格式)。它很全面,但不是最简单的。

https://llvm.org/docs/TableGen/index.html

lib/Target/X86/X86InstrInfo.td

llvm-tblgen-10 --help

Previous NEXT 模拟器中有一个更简单的

这基本上是一个可以相对简单地处理的 #define C 宏网络 (see a Lisp example)。

以下是我在网上找到的副本/版本:

https://github.com/cebix/macemu/blob/master/BasiliskII/src/uae_cpu/compiler/codegen_x86.h

https://unix.superglobalmegacorp.com/previous/newsrc/src/cpu/jit/codegen_x86.h.html

http://previous.unixdude.net/

https://github.com/probonopd/previous/blob/master/src/cpu/jit/codegen_x86.h

相关问题