【发布时间】:2021-02-05 22:21:23
【问题描述】:
我一直在写代码,整天都在尝试在 x86 汇编中获取链表。没有任何效果,而且非常令人沮丧。我正在尝试制作一个具有元素 1、2 和 3 的元素。GDB 告诉我它在 end 的 ret 语句中存在段错误,但没有提供更多信息。谁能帮我这个?我正在使用 Clang 在 Mac 上进行组装。
这是我的代码:
.global _main
.text
/*
r12: result
r14: number of elements left in list
r15: stack offset for accessing arguments
*/
make_list:
# # # # #
push rbp
mov rbp, rsp
# # # # #
mov rdi, [rbp + r15]
mov qword ptr [rax], rdi # assign first_node.head
lea r13, [rax + 8] # store address of first_node.tail
# # # # #
mov rdi, 16
sub rsp, 8
call _malloc
add rsp, 8
# # # # #
add r15, 8
sub r14, 1
# # # # #
mov rdi, [rbp + r15]
mov qword ptr [r13], rdi # assign second_node.head
# # # # #
cmp r14, 0
je end
# # # # #
mov rdi, 16
sub rsp, 8
call _malloc
add rsp, 8
# # # # #
jmp make_list # assign second_node.tail to an argument
# # # # #
end:
mov qword ptr [r13 + 8], 0 # second_node.tail = NULL
mov rsp, rbp
pop rbp
ret
# # # # #
_main:
# # # # #
mov rdi, 16
sub rsp, 8
call _malloc
add rsp, 8
lea r12, [rax]
# # # # #
mov r14, 3
mov r15, 16
# # # # #
push 3
push 2
push 1
# # # # #
call make_list
add rsp, 24
# # # # #
mov rdi, 0
mov rax, 0x2000001
syscall
# # # # #
【问题讨论】:
-
我看到了你的许多问题,想知道你是否考虑过在 LLDB 中使用
si命令来单步执行你的函数并单步执行每个指令以查看失败的地方。我认为学习充分利用您的调试器 LLDB 将是您推进代码生成的最佳选择。 -
@MichaelPetch 这不是生成的代码,这是我自己编写的——这是针对我正在编写的标准库的;我也去看看 LLDB 谢谢
标签: macos assembly return stack x86-64