【问题标题】:Coding in x86 - compiler code generationx86 中的编码 - 编译器代码生成
【发布时间】:2012-03-26 23:58:41
【问题描述】:

在 x86 汇编中编写代码是否有很好的参考。我正在编写一个编译器,目前正处于代码生成阶段。我正在实现的语言是面向对象的。例如,现在我在为类声明、对象布局等编写程序集时遇到了麻烦……有没有涵盖这个主题的书籍或参考资料?

【问题讨论】:

  • 你的问题很模糊。类声明或对象布局不应该涉及任何程序集。
  • 也许你可以阅读clang/llvm源代码?根据我的经验,这很容易理解。
  • 你是什么意思没有涉及类声明的程序集。如果我有一个包含多个方法和字段的类怎么办?如果我不在程序集中对方法进行编码,那么如果以后使用它们,将在哪里/何时声明?
  • @MikeG:类声明是整个辣酱玉米饼馅;其中的代码(即可执行语句)与程序集生成更相关。
  • OOP 在代码生成阶段不应再存在。

标签: compiler-construction x86


【解决方案1】:

architecture reference documentation 是您的最佳选择。

但是,不要期望对类声明或对象布局有任何帮助。正在编译的语言规范会包含其中的一些内容,但为类声明生成的机器代码与语言的耦合非常松散,并且很大程度上是实现者的选择,而不是 CPU 架构。

【讨论】:

  • 您能否说得更具体一些,例如是否有参考资料解释了如何将方法减速转换为程序集等……那太好了
  • @MikeG:将方法声明转换为代码不是 CPU 架构问题,这就是文档的用途。编译器编写者的工作是创建将源代码编译为目标代码的代码。由于您选择了编写编译器这一挑战,我们希望您已经了解如何从源代码生成解析树并将其转换为针对特定架构的伪指令(或真实指令)。
  • @MikeG:如前所述,布置堆栈帧之类的东西;将 args 放入堆栈以进行方法调用;以及如何在内存对象中布局字段、调度表指针等,与指令集无关。只有一种方法可以做到。你应该看看龙之书。
  • @MikeG:或“C/Java/ML 中的现代编译器实现”
【解决方案2】:

您的问题可能有“直接”和“有用”的答案,但它们可能不兼容。

直接的答案是您应该将架构参考(请参阅上一个答案中的链接)与您为此选择的确切汇编器的详细信息结合起来 - 例如gas、nasm、yasm、fasm、masm[32]、tasm 等;他们都引用了指令语法、伪指令(如分段、内存分配等)、实现细节、目标文件格式......

有用的 (jIMHO) 答案是复制行业领导者的结果,如 GNU Compiler Collection、Microsoft Developer Studio 等,需要数千人年,所以这是一种很奇怪的方式;相反,您应该尽可能地重用现有措施。例如,要验证您的语言概念,您可以实现转换为 C 代码并为此提供支持库。或者,为著名的虚拟机及其语言如 Java 或 C# 编写。在高级级别上,您可以用自己的编译器前端替换编译器前端(如 GCC 和 LLVM 允许的那样),并重用它们的代码生成后端,这些后端编写得很好并针对多个目标进行了调整。

我很怀疑您正在设计一些无法转换为 C 并支持库调用的东西。中间代码看起来不好看,它应该可以工作。

如果您仍想手动进行日落,请在目标平台(Windows/Linux/etc., 16- 32- or 64-bit...)上编辑问题并提供更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2014-06-24
    • 2015-07-05
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多