如何解决Lisp x86_64编译器产生不正确的输出
我正在编写一个Lisp编译器,该编译器为x86_64体系结构(特别是针对OS X)生成代码。我使用Chez Scheme作为参考编译器,以检查编译器的输出是否正确。 Chez为下面的表达式提供了32的输出,但是我的编译器代码给了我8的输出(在Lisp代码下面)。我无法弄清楚原因,也无法弄清楚如何调整程序集以使其返回正确的结果。如果您精通x86_64(GAS,Intel语法),可以在这里给我一些建议吗?
(define (f x y) (* (* y 2) (+ x 3)))
(define x (f 5 2)); expecting an output of 32
.global _main
.text
_main:
push 2 # push argument to f
push 5 # push argument to f
call f
mov [x + rip],rax
mov rdi,rax
mov rax,0x2000001
syscall
f:
push rbp
mov rbp,rsp
push 3 # push argument to +
push [rbp + 16] # push argument to +
call plus
push rax # result of +
push 2 # push argument to *
push [rbp + 24] # push argument to *
call multiply
push rax # result of *
call multiply
mov rsp,rbp
pop rbp
ret
.data
x:
.quad 0
这是add
和multiply
函数:
.macro operator mnemonic
push rbp
mov rbp,rsp
mov rdi,[rbp + 24]
mov rsi,[rbp + 16]
\mnemonic rdi,rsi
mov rax,rdi
mov rsp,rbp
pop rbp
ret
.endm
plus: operator add
multiply: operator imul
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。