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

hjqgdpho  于 5个月前  发布在  Linux
关注(0)|答案(1)|浏览(91)

我是x86_64程序集的新手,正在学习跳转条件。在我的代码中,当我使用jump if equal调用时,我得到了一个分段错误,但是如果我调用函数然后返回,就没有错误了,为什么会发生这种情况?我没有在堆栈上推送比我弹出更多的东西,或者只有当我调用另一个函数f. e.一个exit函数时才有可能退出跳转条件?

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

字符串

egmofgnx

egmofgnx1#

你只能从你调用的函数返回,而不能从你跳转到的函数返回。跳转指令不会在堆栈上存储返回地址,只有调用指令会。
当您跳转到print_juhu而不是调用函数时,ret指令从堆栈中弹出一些随机垃圾而不是返回地址,并继续跳转到某个地址,很可能导致崩溃。
要修复代码,请使用call指令来调用print_juhu。由于没有条件调用指令可用,您必须跳过call指令来有条件地调用函数:

jne     dont_call_print_juhu
        call    print_juhu

dont_call_print_juhu:
        ...

字符串

相关问题