我是x86_64汇编语言的新手,正在try 学习跳转条件. 在我的代码中,当我使用JUMP IF EQUAL调用时,我得到一个分段错误, 但如果我调用函数然后返回没有错误,为什么会发生这种情况? 我在堆栈上推的并不比我弹出的更多,或者它只可能退出 skip 如果我调用另一个函数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

推荐答案

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

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

要修复该代码,请使用Call指令呼叫print_juhu.由于没有条件调用指令可用,您必须跳过调用指令来有条件地调用函数:

        jne     dont_call_print_juhu
        call    print_juhu

dont_call_print_juhu:
        ...

Linux相关问答推荐

C++17/Linux:信号未解锁单独线程中被阻止的网络套接字调用

为什么我们不能使用${$#}来获取传递给shell 脚本的最后一个参数?

Docker 守护进程安装在 ubuntu jenkins docker 容器代理权限被拒绝

如何修复 script(1) 实用程序输出的换行符?

如何将一个变量的 2 行添加到另一个变量的特定行?

如何在充满 csv 的目录中获得不同的值计数

为什么 liburing 写入性能低于预期?

用于替换 struct 文档中文本的 Bash 脚本

Rust unix 进程

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

如何使用 shell 脚本将文本文件转换为 JSON 文件

Linux上Kvaser数据库编辑器的等效工具

你如何在 CentOS9 上使用 C++ fmt?

如何在 Linux 中获取 C/C++ 中的用户名?

如何让 GNU 屏幕读取 .bash_profile/.bash_rc 更改?

在文件夹中的 gzip 文件中查找字符串

rename() 是原子的吗?

如何让我的 Golang Web 服务器在后台运行?

如何安装python开发者包?

通过 linux x86-64 函数调用保留了哪些寄存器