Linux 如何运行在酷酷的编译器中生成的中间文件,如x86汇编文件
我正在学习编译器。此外,我还对自己构建一个用于insight的编译器感兴趣 所以我指的是酷编译器(课堂面向对象语言) 我已经从下载了linux参考编译器 酷编译器提供了各种选项 我使用--x86和--asm进行编译,它们生成.s和.asm文件它在QTSPIM中给出错误。 如何在Linux上直接运行这些扩展 示例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文件-程序
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
## ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;