【问题标题】:Why is my x86 linked-list function throwing a segfault?为什么我的 x86 链表函数会引发段错误?
【发布时间】:2021-02-05 22:21:23
【问题描述】:

我一直在写代码,整天都在尝试在 x86 汇编中获取链表。没有任何效果,而且非常令人沮丧。我正在尝试制作一个具有元素 1、2 和 3 的元素。GDB 告诉我它在 endret 语句中存在段错误,但没有提供更多信息。谁能帮我这个?我正在使用 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


【解决方案1】:

jmp make_list 指令不正确。你不想跳到函数的开头,你又是rbp,而是在你完成所有设置之后跳到函数的中途。

ret 之前没有弹出的多个push rbp 指令会导致指令指针在其中获得无效值,从而导致您的设置错误。

【讨论】:

  • 谢谢,删除了段错误。如果我的代码按预期工作,我仍然没有,但我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多