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

问题描述 投票:0回答:1

我是汇编 x86_64 的新手,正在尝试学习跳转条件。 在我的代码中,当我使用“jump if equal”调用时,出现分段错误, 但是如果我调用该函数然后返回就没有错误,为什么会发生这种情况? 我在堆栈上压入的内容并不比弹出的内容多,或者只能退出跳转 条件如果我调用另一个函数 f.e.退出功能?

    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
linux assembly x86-64 windows-subsystem-for-linux
1个回答
0
投票

您只能从您调用的函数返回,不能从您跳转的函数返回。跳转指令不会在堆栈上存储返回地址,只有调用指令才会在堆栈上存储返回地址。

当您跳转到

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

要修复代码,请使用调用指令来调用

print_juhu
。由于没有可用的条件调用指令,因此您必须跳过调用指令才能有条件地调用该函数:

        jne     dont_call_print_juhu
        call    print_juhu

dont_call_print_juhu:
        ...
© www.soinside.com 2019 - 2024. All rights reserved.