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 指令的位置是不是重要