首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何像x86程序集文件一样运行在Cool编译器中生成的中间文件

如何像x86程序集文件一样运行在Cool编译器中生成的中间文件
EN

Stack Overflow用户
提问于 2014-02-19 06:43:43
回答 2查看 1K关注 0票数 1

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

因此,我指的是Cool编译器(面向课堂对象的语言)。

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

酷编译器提供了各种选项

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

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

示例

代码语言:javascript
复制
class Main  {

main():Object 

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

};

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

代码语言:javascript
复制
                        ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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文件-x8664程序集输出)

代码语言:javascript
复制
.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
                        ## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EN

回答 2

Stack Overflow用户

发布于 2016-12-09 13:00:17

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

问题是,艾肯教授的编译器课程的多个版本在网上比比皆是,因此,如果你指的是一个版本的材料(比如这些 YouTube视频),同时使用为不同版本设计的代码(比如这一个),那么你很容易感到困惑。

OP正在运行的是用于x86体系结构的酷解释器之一(可以从这里下载)。运行cool valid-cool-program.cl将导致您的程序被解释(运行)。此版本可以使用适当的标志调用程序集,但AFAIK仅使用x86程序集本身。

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

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

我昨天才开始学习这个课程,所以如果有更多的“不兼容”,我还不知道。

票数 2
EN

Stack Overflow用户

发布于 2015-06-19 11:27:27

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

gcc hello.s -o hello

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21873026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档