4

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

4

2 回答 2

3

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

它也非常小且不显眼:运行时完全包含在几百行.h文件中。

有关使用 DynASM编写非常简单的代码生成器的示例,请参阅我的DynASM 教程。

即使您不相信 DynASM,您也会在 DynASM 代码库中找到对 x86 指令的非常简洁的声明性描述,您可能会发现它很有用。

于 2013-11-04T18:07:31.860 回答
1

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

我研究这个问题的原因是我想将机器代码发射器添加到大小在 2000-3000 LoC 范围内的自托管 Lisp中。解决当前的 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 宏网络(参见 Lisp 示例)。

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

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

于 2020-12-22T15:25:10.780 回答