Почему возникает ошибка сегментации в простой 32-битной программе сборки Linux?

Прежде всего, я хочу начать с того, что я прочитал этот, этот и этот вопрос. Тем не менее, ни один из ответов на эти вопросы не был достаточным / имел достаточно подробной информации, чтобы ответить на мой вопрос. Более того, всем им 4 - 6 лет, что делает их устаревшими. С этими словами я открыл новый вопрос здесь.

Я пытаюсь сделать простую программу, которая отображает 1 - 4 матрицы в 32-битной сборке Linux с синтаксисом NASM, я сделал процедуру, которая должна печатать простую матрицу 1x1.

section .data
    msg1:       db 'output:', 10
    msg1len:    equ $-msg1

    endmsg:     db 10

    m1r1:       db '5'

    m2r1:       db '1', '4'
    m2r2:       db '2', '6'

    m3r1:       db '8', '3', '4'
    m3r2:       db '9', '2', '1'
    m3r3:       db '1', '5', '6'

    m4r1:       db '6', '3', '1', '7'
    m4r2:       db '1', '9', '8', '4'
    m4r3:       db '5', '0', '1', '2'
    m4r4:       db '2', '7', '1', '0'

section .bss
    output1:    resb 5
    output2:    resb 7*2
    output3:    resb 9*3
    output4:    resb 11*4


section .text
    global  _start

_start:
    mov eax, 1
    call printMatrix


_exit:
    mov eax, 0
    mov ebx, 1
    int 80h

;description:
;   displays a visual representation of
;   a matrix from size 1 through 4
;parameters:
;   eax - matrix size
printMatrix:
    push eax
    push ebx
    push ecx
    push edx
    push esi

    cmp eax, 1
    je .printMatrix1

    cmp eax, 2
    je .printMatrix2

    cmp eax, 3
    je .printMatrix3

    cmp eax, 4
    je .printMatrix4

.printMatrix1:
    mov eax, '[ '
    mov [output1], eax
    mov eax, m1r1
    mov [output1 + 2], eax
    mov eax, ' '
    mov [output1 + 3], eax
    mov eax, ']'
    mov [output1 + 4], eax

    mov eax, 4
    mov ebx, 1
    mov ecx, [output1]
    mov edx, 5
    jmp .exit

.printMatrix2:

    jmp .exit

.printMatrix3:

    jmp .exit

.printMatrix4:

    jmp .exit

.exit:
    pop esi
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

printEndl:
    push eax
    push ebx
    push ecx
    push edx
    mov eax, 4
    mov ebx, 1
    mov ecx, endmsg
    mov edx, 1
    int 80h
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

Тем не менее, когда я компилирую через:

nasm -f elf32 matrix.asm

И ссылка с помощью:

ld -m elf_i386 -s -o matrix matrix.o

Я не получаю никаких ошибок / предупреждений, но когда я запускаю программу, используя ./matrix я получил segmentation fault (core dumped) ошибка. Теперь я должен отметить, что этот вопрос дал довольно хорошее определение того, что является ошибкой сегментации, и чем она обычно вызывается, хотя было немного неясно. Что я ищу, так это:

  1. Правильное объяснение / определение сегментации с точки зрения памяти и сборки.
  2. Что вызвало ошибку в данном конкретном случае (Согласно первой и второй ссылкам, я подозреваю, что это как-то связано с переходами или вызовом процедур и стека. Однако я часами сидел здесь, пытаясь выяснить, что вызвало это без успеха).
  3. Как избежать такой ошибки и рекомендуемые будущие практики.

0 ответов

Другие вопросы по тегам