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