问题描述
我想为链表分配一些节点。我有一个alloc_pair
函数,它似乎可以正常工作。我添加了评论,以解释每一行有关链表的意图。我的代码在某处给我分段错误,但我不知道在哪里。如下所示,GDB无益:
Thread 2 hit Breakpoint 1,0x0000000100003f63 in main ()
(gdb) c
Continuing.
Thread 2 hit Breakpoint 2,0x0000000100003f4e in alloc_pair ()
(gdb) ni
0x0000000100003f55 in alloc_pair ()
(gdb) ni
0x0000000100003f59 in alloc_pair ()
(gdb) disassemble
Dump of assembler code for function alloc_pair:
0x0000000100003f4e <+0>: mov rdi,0x10
0x0000000100003f55 <+7>: sub rsp,0x8
=> 0x0000000100003f59 <+11>: call 0x100003f96
0x0000000100003f5e <+16>: add rsp,0x8
0x0000000100003f62 <+20>: ret
End of assembler dump.
(gdb) c
Continuing.
Thread 2 received signal SIGSEGV,Segmentation fault.
0x00007fff731d970a in ?? ()
(gdb) bt
#0 0x00007fff731d970a in ?? ()
#1 0x00007ffeefbff828 in ?? ()
#2 0x0000000100008008 in ?? ()
#3 0x0000000000000000 in ?? ()
(gdb)
如果您知道我犯的错误,请告诉我。
.global _main
.text
alloc_pair:
push rbp
mov rbp,rsp
mov rdi,16
sub rsp,8
call _malloc
add rsp,8
mov rsp,rbp
pop rbp
ret
_main:
call alloc_pair
mov r13,rax # r13 stores the initial pair allocated
mov qword ptr [rax],29 # the node 1 head contains 29
mov r12,[rax + 8] # r12 stores the memory location of the node 1 tail
call alloc_pair
mov qword ptr [rax],7 # the node 2 head contains 7
mov qword ptr [r12],rax # the node 1 tail points to the node 2 head
mov rdi,0
mov rax,0x2000001
syscall
解决方法
此行:
mov r12,[rax + 8] # r12 stores the memory location of the node 1 tail
不执行您的评论中所说的。该指令将[rax+8]
处的64位内存内容移至 R12 。不会将[rax+8]
的地址移到 R12 。您要Load Effective Address (LEA)将[rax+8]
的地址放入 R12 中。该指令如下所示:
lea r12,[rax + 8] # r12 stores the memory location of the node 1 tail