Cześć, mam stosunkowo prosty problem, ale nie potrafię znaleźć rozwiązania.
Próbuję napisać program sumujący dwie liczby z pamięci, kawałek (32bit) po kawałku (z przeniesieniem). Niestety, nie do końca rozumiem czemu, licznik pętli nie zwiększa się z kolejnymi operacjami "inc".
Program pod architekturę Intela, ze składnią AT&T
.code32
SYSEXIT = 1
EXIT_SUCCESS = 0
SYSWRITE = 4
STDOUT = 1
SYSREAD = 3
STDIN = 0
.align 32
.data
liczba1:
.long 0xF0000111, 0x000B0000
# .long A1, A2
liczba2:
.long 0x10000333, 0x000A000F
# .long B1, B2
rozmiar:
.long 0x00000002
#Cel: wrzucenie na stos kolejno: A1+B1, A2+B2, +ewentualne "1" z przeniesienia
.text
.global _start
_start:
mov $0, %ecx #inicjalizacja licznika
movl rozmiar(,%ecx,4), %edi #przeniesienie rozmiaru do %edi (ilosc obrotow petli)
addition:
movl liczba1(,%ecx,4), %eax #przeniesienie 32bit kawalka liczby
movl liczba2(,%ecx,4), %ebx
adcl %ebx, %eax #dodawanie
push %eax wrzucenie wyniku na stacka
inc %ecx #inkrementacja licznika
cmp %edi, %ecx #porownanie rozmiaru (2) z licznikiem
je overflow # if %edi == %ecx
jmp addition # else powrot do petli
# ostatnia suma (==1) w przypadku gdy nastapilo przepelnienie po ostatnim dodawaniu w petli,
# lub wrzucenie 0 na stacka
overflow:
mov $0, %eax
adcl $0, %eax
push %eax
koniec:
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $0x80
Jeżeli ktoś przy okazji też wyjaśnił co robić/czego nie robić następnym razem korzystając z inc i w razie czego wskazał inne błędy to byłbym wdzięczny. Z góry dzięki za pomoc