【发布时间】: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