首页 > 解决方案 > x86 程序集中函数调用后的分段错误

问题描述

我目前正在编写一个编译器,并且我创建了一些测试,但其中只有一个失败并Segmentation fault (core dumped)显示错误消息。

这是被编译的代码

function main(): int {
    var f: int = 10;
    return func(f) - func(f / 2);
}

function func(a: int): int {
    return a;
}

这是生成的汇编代码(如您所见,它并没有真正优化)

section .text
global _start
_start:
    call function_main
    mov rdi, rax
    mov rax, 60
    syscall

global function_main
function_main:
    push rbp
    mov rbp, rsp
    sub rsp, 4
    mov rax, 10
    mov DWORD[rbp-0], eax
    mov eax, DWORD[rbp-0]
    mov rdi, rax
    call function_func
    push rax
    mov eax, DWORD[rbp-0]
    mov rbx, 2
    idiv rbx
    mov rdi, rax
    call function_func
    mov rbx, rax
    pop rax
    sub rax, rbx
    mov rsp, rbp
    pop rbp
    ret

global function_func
function_func:
    push rbp
    mov rbp, rsp
    sub rsp, 4
    mov DWORD[rbp-0], edi
    mov eax, DWORD[rbp-0]
    mov rsp, rbp
    pop rbp
    ret

汇编文件是用nasm -f elf64 ./test9.lv.asm -o ./test9.lv.asm.o和编译的ld -g ./test9.lv.asm.o a.out

我曾经gdb调试过二进制文件,似乎程序func(f)在第一次返回后立即收到 SIGSEGV 信号。

但现在我不知道为什么会在这种情况下发生这种情况。

标签: debuggingassemblyx86segmentation-faultgdb

解决方案


推荐阅读