问题描述
我试图在MacOS的x86_84程序集中制作Lisp函数cons
。下面,我尝试制作一对2
和3
,但是它不起作用;我遇到了细分错误。
.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 (将#修改为@)