首页 > 解决方案 > NASM:分段错误(核心转储)

问题描述

我是组装新手,我一直在尝试通过随机问题学习。我在 linux 机器上使用 nasm 64 位。我一直在尝试生成斐波那契数列。但是,当我运行我的可执行文件时出现分段错误(核心转储)错误。

section .data

    input db 2

section .bss

    fib resb 128

section .text

_start:

    mov rax, 1
    mov rcx, 1
    mov rdx, fib
    mov rdx, 1
    inc rdx
    mov rbx, 0

    call _fibLoop
    call _fibPrint

    mov rax, 60
    mov rdi, 0
    syscall

_fibLoop:

    mov [rdx], rax
    inc rdx
    add rcx, rax
    push rcx
    mov rcx, [rax]
    pop rax
    inc rbx
    cmp rbx, [input]
    jne _fibLoop
    ret

我知道对 _fibPrint 的调用不是问题,因为它几乎什么也没做。我认为我写入保留内存的方式有缺陷。但是,我过去也能做到这一点,所以我不知道出了什么问题。

标签: assemblyx86-64nasm

解决方案


作为初始化的一部分,您有以下顺序:

mov rdx, fib
mov rdx, 1
inc rdx

这将留下rdxvalue 2,而不是保存数字的缓冲区的偏移量。然后,在开始时_fibLoop,你写给它

mov [rdx], rax

这将尝试访问您无法访问的内存,从而导致分段错误。

我认为删除额外的两行之后mov rdx,fib将修复该崩溃,让您继续使用 GDB 或您喜欢的任何其他调试器调试其他错误。

(就像这样只将指针推进 1inc rdx_fibLoop字节,但您正在执行 8 个字节的存储。这input也只有 1 个字节,但您也在此处执行 8 个字节的加载。)


推荐阅读