Linux 如何运行在酷酷的编译器中生成的中间文件,如x86汇编文件

Linux 如何运行在酷酷的编译器中生成的中间文件,如x86汇编文件,linux,assembly,compiler-construction,Linux,Assembly,Compiler Construction,我正在学习编译器。此外,我还对自己构建一个用于insight的编译器感兴趣 所以我指的是酷编译器(课堂面向对象语言) 我已经从下载了linux参考编译器 酷编译器提供了各种选项 我使用--x86和--asm进行编译,它们生成.s和.asm文件它在QTSPIM中给出错误。 如何在Linux上直接运行这些扩展 示例 class Main { main():Object { (new IO).out_string("HELLO WORLD !\n") }; }; 第一个(.asm文件-程序

我正在学习编译器。此外,我还对自己构建一个用于insight的编译器感兴趣

所以我指的是酷编译器(课堂面向对象语言)

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

酷编译器提供了各种选项

我使用--x86和--asm进行编译,它们生成.s和.asm文件它在QTSPIM中给出错误。

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

示例

class Main  {

main():Object 

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

};
第一个(.asm文件-程序集输出)


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

gcc hello.s-o hello

这是一个老问题,但我想这个答案可能会帮助其他人在学习Alex Aiken的编译器课程时开始使用Cool

问题是,Aiken教授的编译器课程的多个版本在网上比比皆是,所以如果你在使用为不同版本(比如YouTube视频)设计的代码时引用一个版本的材料,你很容易感到困惑

OP正在运行的是x86体系结构的一个很酷的解释器(可以从下载)。运行
cool有效的cool程序。cl
将导致您的程序被解释(运行)。此版本可以通过使用适当的标志调用程序集来吐出程序集,但AFAIK仅支持x86程序集本身

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

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


我昨天才开始学习这门课程,所以如果还有其他“不兼容”的地方,我还不知道。

“我使用--x86和--asm进行编译,它们生成.s和.asm文件。它在QTSPIM中出现错误。”QTSPIM是一个MIPS模拟器,而不是x86模拟器。代码看起来像是用GNU汇编程序汇编的。@Michael-你能告诉我如何运行这个吗。我已经粘贴了完整的代码。我可以粘贴完整的代码,但限制仅为30000…如果您在x86-64计算机和操作系统上,只需组装和链接代码,然后像运行任何其他命令行可执行文件一样运行它。我希望这些很酷的文档能够指定如何组装和链接输出,所以从这里开始吧。如果在那里找不到,请搜索一些x86-64 Linux汇编教程。
                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.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
                        ## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;