【问题标题】:how to run intermediate file generated in Cool compiler like x86 assembly file如何运行在酷编译器中生成的中间文件,如 x86 汇编文件
【发布时间】:2014-03-19 08:14:00
【问题描述】:

我正在学习编译器。我也有兴趣自己构建一个编译器以获得洞察力。

所以我指的是酷编译器(Classroom Object Oriented Language)。

我已经从 here 下载了 linux 的参考编译器。

酷编译器提供各种选项

我使用--x86 和--asm 编译生成.s 和.asm 文件。 QTSPIM 出现错误。

如何在 Linux 上直接运行这些扩展。

示例

class Main  {

main():Object 

{ (new IO).out_string("HELLO WORLD !\n") };

};

FIRST(.asm 文件 - 程序集输出)

                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
String..vtable:         ;; virtual function table for String
                        constant string6
                        constant String..new
                        constant Object.abort
                        constant Object.copy
                        constant Object.type_name
                        constant String.concat
                        constant String.length
                        constant String.substr
                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Bool..new:              ;; constructor for Bool
                        mov fp <- sp
                        ;; stack room for temporaries: 1
                        li r2 <- 1
                        sub sp <- sp r2
                        push ra
                        li r0 <- 4
                        alloc r0 r0
                        ;; store class tag, object size and vtable pointer
                        li r2 <- 0
                        st r0[0] <- r2
                        li r2 <- 4
                        st r0[1] <- r2
                        la r2 <- Bool..vtable
                        st r0[2] <- r2
                        ;; initialize attributes
                        ;; self[3] holds field (raw content) (Int)
                        li r1 <- 0
                        st r0[3] <- r1
                        ;; self[3] (raw content) initializer -- none 
                        mov r1 <- r0
                        pop ra
                        li r2 <- 1
                        add sp <- sp r2
                        return
                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

第二个(.s 文件 - x86-64 程序集输出)

.globl String..vtable
String..vtable:         ## virtual function table for String
                        .quad string6
                        .quad String..new
                        .quad Object.abort
                        .quad Object.copy
                        .quad Object.type_name
                        .quad String.concat
                        .quad String.length
                        .quad String.substr
                        ## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.globl Bool..new
Bool..new:              ## constructor for Bool
                        pushq %rbp
                        movq %rsp, %rbp
                        ## stack room for temporaries: 1
                        movq $8, %r14
                        subq %r14, %rsp
                        ## return address handling
                        movq $4, %r12
                        movq $8, %rsi
            movq %r12, %rdi
            call calloc
            movq %rax, %r12
                        ## store class tag, object size and vtable pointer
                        movq $0, %r14
                        movq %r14, 0(%r12)
                        movq $4, %r14
                        movq %r14, 8(%r12)
                        movq $Bool..vtable, %r14
                        movq %r14, 16(%r12)
                        ## initialize attributes
                        ## self[3] holds field (raw content) (Int)
                        movq $0, %r13
                        movq %r13, 24(%r12)
                        ## self[3] (raw content) initializer -- none 
                        movq %r12, %r13
                        ## return address handling
                        movq %rbp, %rsp
                        popq %rbp
                        ret
                        ## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

【问题讨论】:

  • “我使用--x86 和--asm 编译生成.s 和.asm 文件。它在QTSPIM 中出现错误” QtSpim 是MIPS 模拟器,不是x86 模拟器。代码看起来像是可以用 GNU 汇编器汇编的东西。
  • @Michael - 你能告诉我如何运行它吗?我已经粘贴了完整的代码。
  • 我可以粘贴完整的代码,但限制只有 30,000 ...
  • 如果您使用的是 x86-64 计算机和操作系统,只需组装和链接代码,然后像运行任何其他命令行可执行文件一样运行它。我希望 Cool 文档指定如何组装和链接输出,所以从那里开始。如果在那里找不到,请搜索一些 x86-64 Linux 汇编教程。

标签: linux assembly compiler-construction


【解决方案1】:

这是一个老问题,但我认为这个答案可能会帮助其他人在遵循 Alex Aiken 的编译器课程(一些变体)时开始使用 Cool。

问题是艾肯教授的编译器课程的多个版本在网上比比皆是,所以如果您在使用为不同版本设计的代码(例如 this one ),你很容易感到困惑。

OP 运行的是 x86 架构的酷解释器之一(可以从here 下载)。运行cool valid-cool-program.cl 将导致您的程序被解释(运行)。此版本可以通过使用适当的标志调用它来吐出程序集,但 AFAIK 只有 x86 程序集本身。

另一方面,上面链接的 YouTube 播放列表是指使用 Cool编译器 编译源程序并发出 MIPS 程序集,然后可以将其传递给 spim 执行,这是一个 MIPS 模拟器。

运行后一个版本的最简单方法可能是使用预配置的 Linux VM(提供 here)。

我昨天才开始学习课程,所以是否还会遇到任何“不兼容”,我还不知道。

【讨论】:

    【解决方案2】:

    您可以使用gcc.s 文件组装成可执行文件。

    gcc hello.s -o hello

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2018-05-02
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多