Buongiorno a tutti voi,
ho elaborato una funzione asm, per un progetto universitario, che prendendo in input i tre coefficienti a,b,c dell'equazione di secondo grado colcolando poi le radici. La funzione è esterna ad un main.c che non posto ma che chiede solo di inserire i tre coefficienti.
Una volta calcolato il discriminante però esso risulta sempre minore di 0 e quindi si sposta sull'etichetta "noreali". La parte del discriminante maggiore di 0 la devo ancora elaborare. Vi ringrazio anticipatemente per l'aiuto.
codice:
/*----g2eqsolutions.s----*/
.bss
x1: .float 0
x2: .float 0
.data
psoluzione: .string "\nIl valore della x1 è : %.2f"
ssoluzione: .string "\nIl valore della x2 è : %.2f"
csoluzioni: .string "\nLe soluzioni sono : +/- %.2f"
nsoluzione: .string "\nNessun valore di x"
d: .float 0 # discriminante
h: .float 0
i: .int 0
.text
.globl g2eqsolutions
g2eqsolutions:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ebx # coefficiente b in ebx
xorl %eax, %eax
addl %ebx, %ebx
movl $1, %ecx
ciclo: # calcolo quadrato di b
addl %ecx, %eax
addl $2, %ecx
cmpl %ecx, %ebx
jg ciclo
movl %eax, (d) # b*b in d
xorl %ebx, %ebx
movl 8(%ebp), %ebx # coefficiente a in ebx
movl 16(%ebp), %edx # coefficiente c in edx
movl %ebx, %eax
mull %edx
movl $4, %ebx
mull %ebx # calcolo 4*a*c
subl %eax, (d) # d=(b*b)-4*a*c
cmpl $0, (d)
je realicoincidenti # d=0 radici reali e coincidenti
jl noreali # d<0 nessuna radice reale
noreali:
pushl $nsoluzione
call printf
addl $4, %esp
popl %ebp
ret
realicoincidenti:
xorl %eax, %eax
movl 8(%ebp), %eax
xorl %ebx, %ebx
movl $2, %ebx
mull %ebx
xorl %ebx, %ebx
movl %eax, %ebx
movl 12(%ebp), %eax
divl %ebx # calcolo b/(2*a)
movl %eax, (x1)
pushl (x1)
pushl $csoluzioni
call printf
addl $8, %esp
popl %ebp
ret