x86 指令集的声明式表示

Posted

技术标签:

【中文标题】x86 指令集的声明式表示【英文标题】:Declarative representation of the x86 instruction set 【发布时间】:2013-10-13 15:41:39 【问题描述】:

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

【问题讨论】:

你不能只使用 x86 汇编器吗? MASM,TASM - 谷歌他们。 其中之一? ref.x86asm.net 为什么不看看 llvm x86 后端是如何工作的?它是开源的并且相当清晰(虽然不是很简单..) 或者,只使用 LLVM IR。无需担心指令编码——甚至指令选择——更便携、免费优化、更可靠的代码生成。 @Leeor 关键是您使用 LLVM 的 x86 后端,这可能在各个方面都优于 OP 创建的任何东西(当然,除了 OP 的学习经验)。 【参考方案1】:

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

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

请参阅我的DynASM tutorial,了解使用 DynASM 编写非常简单的代码生成的示例。

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

【讨论】:

【参考方案2】:

我在下面假设您不想在运行时依赖于像 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

【讨论】:

以上是关于x86 指令集的声明式表示的主要内容,如果未能解决你的问题,请参考以下文章

求助!为啥X86以上的CPU指令集不提供给用户呢?比如X86-64,sSSE3等等。

在 x86 程序集的过程中调用 ret 指令的位置是不是重要

X86汇编4.基本指令详解

MultiMedia eXtensions - MMX:第一套应用于英特尔 80x86 指令集的 SIMD 扩展

x86LinuxGNUGNOME是什么

趋势观察:第五代精简指令集RISC