代码之家  ›  专栏  ›  技术社区  ›  green tea

在程序集x86_64中跳转后调用ret时出现分段错误

  •  1
  • green tea  · 技术社区  · 1 年前

    我是组装x86_64的新手,正在尝试学习跳跃条件。 在我的代码中,当我使用jump if equal调用时,我会遇到分段错误, 但如果我调用函数然后返回,那就没有错了,为什么会发生这种情况? 我不会在堆栈上推得比我弹出的更多,还是只有退出跳跃才有可能 如果我调用另一个函数,例如出口函数,条件是什么?

        section .data
        success db "yeah"
    
    section .text
        global _start
    
    print_juhu:
        push rsi
        push rdx
        push rax
        push rdi
    
        mov rax,1
        mov rsi,success
        mov rdx,4
        syscall
    
        pop rdi
        pop rax
        pop rdx
        pop rsi
    
        ret
    
    _start:
        mov r12,3
        mov r14,3
        cmp r12,r14
        je print_juhu
    
        ; Exit the program
        mov rax, 60
        mov rdi, 0
        syscall
    
    1 回复  |  直到 1 年前
        1
  •  4
  •   fuz    1 年前

    您只能从您 被调用, 不是来自那些你 跳跃 跳转指令不在堆栈上存储返回地址,只有调用指令存储。

    当你跳到 print_juhu 不是调用函数,而是 ret 指令从堆栈中弹出一些随机垃圾,而不是返回地址,然后跳转到某个地址,很可能导致崩溃。

    要修复代码,请使用调用指令调用 打印_juhu 。由于没有可用的条件调用指令,您必须跳过调用指令才能有条件地调用函数:

            jne     dont_call_print_juhu
            call    print_juhu
    
    dont_call_print_juhu:
            ...