First of all I want to start off by saying that I've read this, this and this question. Yet none of the answers provided on these questions were sufficient/had detailed enough information in order to answer my question. Moreover, they are all 4 - 6 years old which makes them outdated. With that being said, I opened a new question here.
I am trying to make a simple program that displays 1 - 4 matrices in Linux 32-bit assembly with NASM syntax, I've made a procedure that should print the simple 1x1 matrix.
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
Yet when I compile via:
nasm -f elf32 matrix.asm
And link using:
ld -m elf_i386 -s -o matrix matrix.o
I get no errors/warnings whatsoever, but when I run the program using ./matrix I get segmentation fault (core dumped) error.
Now I must note that this question provided a rather well definition for what is a segmentation fault and what it's usually caused by, it was a bit unclear though. What I seek is:
- A proper explanation/definition of a segmentation in terms of memory and assembly.
- What have caused the fault in this particular case (According to the first and second links, I suspect it has something to do with the jumps or calling procedures and the stack. However I've been sitting here for hours trying to figure out what caused it with no success).
- How to avoid such a fault and recommended future practices.
gdb) to run your code and tell you where the segmentation fault. Segmentation fault (or segfault) is a general condition where you are accessing memory in a way that the hardware doesn't allow. you are likely using a pointer that is invalid.-soption. that strips off all the symbols, so if you do use a debugger you make your life incredibly difficult.int 80hdoesn't exit the program and falls through into the rest of your code a second time. The issue in your case is that the syscall number is suppose to be placed into EAX before doingint 80h(in your case the syscall for sys_exit = 1), the return value for sys_exit is suppose to be in EBX. You have them backwards. A syscall table for 32-bit Linux is here: docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.htmlmov [output1], eaxyou are moving the entire 4 bytes that make up a 32-bit register and moving them to memory.Output1is allocated 5 bytes. Imagine what will happen when 4 bytes is written withmov [output1 + 4], eax- you will clobber the first few bytes of memory thatoutput2was allocated.