assembly - 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 的调用不是问题,因为它几乎什么也没做。我认为我写入保留内存的方式有缺陷。但是,我过去也能做到这一点,所以我不知道出了什么问题。
解决方案
作为初始化的一部分,您有以下顺序:
mov rdx, fib
mov rdx, 1
inc rdx
这将留下rdx
value 2
,而不是保存数字的缓冲区的偏移量。然后,在开始时_fibLoop
,你写给它
mov [rdx], rax
这将尝试访问您无法访问的内存,从而导致分段错误。
我认为删除额外的两行之后mov rdx,fib
将修复该崩溃,让您继续使用 GDB 或您喜欢的任何其他调试器调试其他错误。
(就像这样只将指针推进 1inc rdx
个_fibLoop
字节,但您正在执行 8 个字节的存储。这input
也只有 1 个字节,但您也在此处执行 8 个字节的加载。)