[assembler]Silnia problem

0
arg = 7
.data
BuforWynikowy:
.skip 100
Buf_size =.- BuforWynikowy

BuforWynikowyP:
.skip 100
Buf_sizeP =.- BuforWynikowyP


.text
.globl _start
_start:

movl $arg, %ecx

movl $1, %eax
xorl %ebx, %ebx

factorial:
mull %ecx
cmpl $0, %ecx
decl %ecx
jne factorial



print:

xorl %edx, %edx
xorl %ecx, %ecx

dziel:
movl $10, %ebx
xorl %edx, %edx
divl %ebx
pushl %eax
movl %edx, %eax
addl $48, %eax 
movb %al, BuforWynikowy(,%ecx,1)
incl %ecx 
popl %eax
cmpl $0, %eax
jne dziel


movl $0, %edx
incl %ecx
poprawnyNapis:
decl %ecx
movb BuforWynikowy(,%ecx, 1), %al
movb %al, BuforWynikowyP(, %edx, 1)
incl %edx

cmpl $0, %ecx
jnz poprawnyNapis


movl $4, %eax
movl $1, %ebx
movl $BuforWynikowyP , %ecx
movl $Buf_sizeP , %edx
int $0x80

movl %eax, %ebx
movl $1, %eax
int $0x80 

Witam, mam problem z programem liczącym silnie, a mianowicie liczy tylko liczb < 15 jak go naprawić aby liczył dla większych liczb oraz jak zrobić wprowadzanie liczb z klawiatury?

Pozdrawiam

0

nie czytałem kodu ale problem z ograniczeniem liczb już kiedyś spotkałem w podobnej rzeczy w pascalu.
z tego co pobierznie zauważyłem do przechowywania wyniku używasz 32-bitowego rejestru. to właśnie powoduje problem. przy mnożeniu rejesrt się przekręca i dostajesz zły wynik. pierwszy sposób na jaki wpadłem to zastosowanie FPU. drugi to przechowywanie liczb w tablicy znaków (tj. łańcuch znaków). polecam drugie rozwiązanie (u mnie oblicza prawidłowo dla liczb które mają w wyniku 2064 cyfr!) jednak pod assemblerem będzie to trudne do zrobienia bo musisz samodzielnie napisać procedury mnożenia liczb w postaci tekstowej...

0

co do wprowadzania liczb z klawiatury proponuję przyjżeć się standardowym algorytmom jak np.:
1.wyzeruj wynik
2.odczytaj znak
3.jeżeli znak=cyfra to wynik=wynik*10+(kod_cyfry-48)
4.jeżeli znak=enter to 6.
5.idź do 2.
6.zwróć wynik

zakładam, że "cyfra" to znak ASCII a "kod_cyfry" to kod tego znaku

1 użytkowników online, w tym zalogowanych: 0, gości: 1