i'm new to assembly language and I have a problem. Recently i wrote program which is simply just adding two numbers. Here is my problem: when I run and debug the program using SASM IDE (it uses gcc), or link it using gcc - program works fine, but when I try to link it using ld - when I run it, I get message "Segmentation fault (core dumped)". Here is my program (AT&T syntax, pls don't mind the comments - they're in polish):
.global main
.data
#zakładam że liczba1 jest dłuższa lub tak samo długa jak liczba2
#zakładam również że żadna z liczb nie jest mniejsza niż 4B
liczba1:
.long 0x10304008, 0x701100FF, 0x45100020, 0x08570030
liczba1_len = (.-liczba1)/4
liczba2:
.long 0xF040500C, 0x00220026, 0x321000CB, 0xFFFFFFFF
liczba2_len = (.-liczba2)/4
wynik:
.space (liczba1_len+1)
.text
main:
movl %esp, %ebp #for correct debugging
movl $0, %ecx
movl $liczba1, %ebx # adres liczba1 (dłuższa liczba) w ebx
movl $wynik, %esi # adres wyniku w ebx
clc
pushf
loop_1:
popf # dla ułatwienia słowo = 32b część liczby (double-word)
movl (%ebx, %ecx, 4), %eax # kopiowanie słowa liczba1 do akumulatora
adcl 4*liczba1_len(%ebx,%ecx,4), %eax # dodawanie odpowiadającego słowa liczba2 do wcześniej skopiowanego z liczba1
movl %eax, (%esi, %ecx, 4) # zapisanie wyniku
inc %ecx
pushf
cmp $liczba2_len, %ecx # pętla loop_1 wykonuje tą część dodawania, w której dodajemy odpowiadające sobie słowa
jb loop_1 # z liczba1 i liczba2
cmp $liczba1_len, %ecx # sprawdzany jest przypadek kiedy liczby mają tą samą długość
je end # w takim przypadku nie jest potrzebne dalsze odczytywanie liczb
# pozostaje tylko ewentualna propagacja przeniesienia na ostatnią
# pozycję wyniku wykonywana za etykietą end:
loop_2:
popf
movl (%ebx, %ecx, 4), %eax # przenoszenie do eax dalszych słów liczba1 dla których nie ma już odpowiedników
# w liczba 2 - zdarza się to kiedy liczba2 jest krótsza od liczba1
adcl %eax, (%esi, %ecx, 4) # przenoszenie wcześniej przenoszonych do eax słów do wyniku wraz z ewentualną
inc %ecx # propagacją przeniesień
pushf
cmp $liczba1_len, %ecx
jb loop_2
end:
popf
adcl $0, (%esi, %ecx, 4) # ostatnia propagacja przeniesień - w przypadku kiedy po dodaniu najstarszych
# słów liczb występuje przepełnienie
ret
Here is makefile with options that I use. This doesn't work - i get message "Segmentation fault (core dumped)" when I try to run the program.
all: dodawanie
dodawanie: dodawanie.o
ld -e main -o dodawanie -m elf_i386 dodawanie.o
dodawanie.o: dodawanie.asm
as dodawanie.asm -o dodawanie.o --32
Here is how I link it using gcc ("as" options the same as above). This works.
gcc dodawanie.o -o dodawanie -m32 -no-pie
User contributions licensed under CC BY-SA 3.0