Почему возникает ошибка сегментации в простой 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)
ошибка. Теперь я должен отметить, что этот вопрос дал довольно хорошее определение того, что является ошибкой сегментации, и чем она обычно вызывается, хотя было немного неясно. Что я ищу, так это:
- Правильное объяснение / определение сегментации с точки зрения памяти и сборки.
- Что вызвало ошибку в данном конкретном случае (Согласно первой и второй ссылкам, я подозреваю, что это как-то связано с переходами или вызовом процедур и стека. Однако я часами сидел здесь, пытаясь выяснить, что вызвало это без успеха).
- Как избежать такой ошибки и рекомендуемые будущие практики.