NASM: ошибка сегментации (ядро сброшено) - PullRequest
0 голосов
/ 28 июня 2019

Я новичок в сборке, и я пытался учиться через случайные проблемы. Я использую NASM 64 бит на машине Linux. Я пытался создать последовательность Фибоначчи. Однако при запуске моего исполняемого файла я получаю сообщение об ошибке сегментации (дамп памяти).

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 не проблема, потому что он практически ничего не делает. Я предполагаю, что способ, которым я пишу в свою зарезервированную память, несовершенен. Однако я был в состоянии сделать это аналогичным образом в прошлом, поэтому я заблудился в том, что случилось.

1 Ответ

3 голосов
/ 28 июня 2019

Как часть вашей инициализации, у вас есть эта последовательность:

mov rdx, fib
mov rdx, 1
inc rdx

Это оставит rdx со значением 2, а не смещение буфера для хранения ваших чисел.Затем в начале _fibLoop вы пишете в него с помощью

mov [rdx], rax

Это попытается получить доступ к памяти, к которой у вас нет доступа, что приведет к ошибке сегментации.

Я думаю, что удалениедве дополнительные строки после mov rdx,fib исправят этот сбой, позволив вам перейти к отладке других ошибок с помощью GDB или любого другого отладчика, который вам нравится.

(Например, inc rdx в _fibLoop только продвигаетуказатель на 1 байт, но вы делаете 8-байтовые хранилища. И это input также только 1 байт, но вы также делаете 8-байтовую загрузку там.)

...