Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Lisp x86_64编译器产生不正确的输出_Assembly_Lisp_X86 64_Masm_Callstack - Fatal编程技术网

Assembly Lisp x86_64编译器产生不正确的输出

Assembly Lisp x86_64编译器产生不正确的输出,assembly,lisp,x86-64,masm,callstack,Assembly,Lisp,X86 64,Masm,Callstack,我正在编写一个Lisp编译器,为x86_64体系结构生成代码,特别是针对OS X。我正在使用Chez Scheme作为参考编译器,以检查编译器的输出是否正确。Chez为下面的表达式提供了32的输出,但我的编译器代码给了我8的输出(在Lisp代码下面)。我不知道为什么,也不知道如何调整程序集以使其返回正确的结果。如果你精通x86_64(GAS,Intel语法),你能在这里给我一些建议吗 (定义(fxy)(*(*y2)(+x3))) (定义x(f2));预期输出为32 以下是add和multipl

我正在编写一个Lisp编译器,为x86_64体系结构生成代码,特别是针对OS X。我正在使用Chez Scheme作为参考编译器,以检查编译器的输出是否正确。Chez为下面的表达式提供了32的输出,但我的编译器代码给了我8的输出(在Lisp代码下面)。我不知道为什么,也不知道如何调整程序集以使其返回正确的结果。如果你精通x86_64(GAS,Intel语法),你能在这里给我一些建议吗

(定义(fxy)(*(*y2)(+x3)))
(定义x(f2));预期输出为32
以下是
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

在函数调用后(例如,使用
addrsp,16
)不会从堆栈中删除推送参数。请注意,标准的x86-64调用约定通常在寄存器而不是堆栈中传递参数。如果要在堆栈上传递参数,那么加载到RDI和RSI有什么意义?只需
mov-rax,[rbp+24]
/
imul-rax,[rbp+16]
。虽然通过内联简单指令(如
add
)而不是push/call/ret,可以获得更大的效率增益,尤其是将当前的“栈顶”保留在寄存器中。看见你的代码就像是你能做任何事情的最慢的方式。您在推送/调用上花费的指令和代码大小与内联时一样多。@RossRidge我会在
pop rbp
之后在函数中添加rsp,16,还是在我调用它之后?@PeterCordes我不担心这里的效率;我只是想要一些有用的东西。但是,尽管如此,您关于提高运算符宏效率的提示还是非常有用。您不能在函数中使用
add rsp,16
,因为返回地址位于堆栈顶部,而不是函数参数。。
.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