我实施Lisp“ cons”功能有什么问题?

问题描述

我试图在MacOS的x86_84程序集中制作Lisp函数cons。下面,我尝试制作一对23,但是它不起作用;我遇到了细分错误

    .global _main
    .extern _malloc
    .text

.macro make_node register 
mov rdi,8  # 64-bit number
call _malloc  # Failed on malloc
mov [rax],\register  # contents of register in address of rax
mov \register,[rax]
.endm

cons:
    push rbp
    mov rbp,rsp
    mov r8,[rbp + 16]
    make_node r8
    mov r9,[rbp + 24]
    make_node r9
    mov rsp,rbp
    pop rbp
    ret

_main:
    push 3
    push 2
    call cons
    add rsp,16

    # I should Now be able to do whatever I want with r8 (2) and r9 (3)

    mov rdi,0
    mov rax,0x2000001
    syscall

我在GDB上进行了遍历,发现调用malloc失败,但对我来说似乎没有问题,因为malloc仅接受一个参数( rdi寄存器中分配字节。

Dump of assembler code for function cons:
   0x0000000100003f48 <+0>: push   %rbp
   0x0000000100003f49 <+1>: mov    %rsp,%rbp
   0x0000000100003f4c <+4>: mov    0x10(%rbp),%r8
   0x0000000100003f50 <+8>: mov    $0x8,%rdi
=> 0x0000000100003f57 <+15>:    callq  0x100003f96
   0x0000000100003f5c <+20>:    mov    %r8,(%rax)
   0x0000000100003f5f <+23>:    mov    (%rax),%r8
   0x0000000100003f62 <+26>:    mov    0x18(%rbp),%r9
   0x0000000100003f66 <+30>:    mov    $0x8,%rdi
   0x0000000100003f6d <+37>:    callq  0x100003f96
   0x0000000100003f72 <+42>:    mov    %r9,(%rax)
   0x0000000100003f75 <+45>:    mov    (%rax),%r9
   0x0000000100003f78 <+48>:    mov    %rbp,%rsp
   0x0000000100003f7b <+51>:    pop    %rbp
   0x0000000100003f7c <+52>:    retq   
End of assembler dump.
(gdb) ni

Thread 2 received signal SIGSEGV,Segmentation fault.

我正在像这样的Mac上组装:clang -masm=intel cell.asm

任何熟悉x86汇编的人都知道我的错误根源吗?

(此外,万一有人问,我知道在free之后调用malloc很重要,但这是证明我的问题的唯一代码。)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)