x86指令集的声明性表示

4

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


3
这个?http://ref.x86asm.net/ - harold
3
或者,只需使用LLVM IR。无须担心指令编码,甚至不需要担心指令的选择,更加便携,提供免费优化和更可靠的代码生成。 - user395760
@Leeor 你可以将它编译成x86汇编语言,编译成x86机器码(以各种目标代码格式),解释执行它,使用旧的JIT或MC JIT将其JIT编译成x86机器码,使用Emscripten将其编译成JavaScript并在运行在x86机器上的JS引擎中运行,你可以将其编译成ARM、MIPS、x64或其他几种架构之一,并在由x86机器托管的虚拟机中运行。如果x86机器有GPU,甚至可以将其编译成GPU程序并在GPU上运行;-) - user395760
1
@Leeor 重点是你使用 LLVM的x86后端,在每个方面上都可能比OP创建的任何东西都要优秀(当然,除了OP的学习经验)。 - user395760
@delnan,这就是为什么我建议使用LLVM后端。我以为你的意思是他应该出于某种原因离开后端,只专注于IR。那就算了。 - Leeor
显示剩余6条评论
2个回答

3
我强烈推荐使用DynASM。它不是一个声明性的描述,但它可以让你完全控制发出什么指令,并且比声明性描述更容易使用。在我看来,这是编写特定于平台的代码生成器的理想方式。
此外,它非常小巧:运行时完全包含在几百行的.h文件中。
请查看我的DynASM教程,以了解使用DynASM编写非常简单的代码生成器的示例。
即使您对DynASM没有信心,您也会在DynASM代码库中找到x86指令的相当简洁的声明性描述,这可能会对您有用。

1
我假设您不想在运行时依赖像LLVM这样庞大的东西。
我研究这个问题的原因是,我想给一个自托管的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

在前一个NEXT模拟器中有一个更简单的版本

这基本上是一些C宏#define的网络,可以相对简单地处理(看一个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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接