Oppure

Loading
07/06/10 8:29
il-david
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.

/*----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 , %ecx
 ciclo:                              # calcolo quadrato di b
     addl %ecx, %eax
     addl , %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 , %ebx
     mull %ebx                       # calcolo 4*a*c
     subl %eax, (d)                  # d=(b*b)-4*a*c
     cmpl 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.

/*----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 , %ecx
 ciclo:                              # calcolo quadrato di b
     addl %ecx, %eax
     addl , %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 , %ebx
     mull %ebx                       # calcolo 4*a*c
     subl %eax, (d)                  # d=(b*b)-4*a*c
     cmpl {parsed_message}, (d)
     je realicoincidenti             # d=0 radici reali e coincidenti
     jl noreali                      # d<0 nessuna radice reale

 noreali:
     pushl $nsoluzione
     call printf
     addl , %esp
     popl %ebp
     ret

 realicoincidenti:
     xorl %eax, %eax
     movl 8(%ebp), %eax
     xorl %ebx, %ebx
     movl , %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 , %esp
     popl %ebp
     ret
, (d) je realicoincidenti # d=0 radici reali e coincidenti jl noreali # d<0 nessuna radice reale noreali: pushl $nsoluzione call printf addl , %esp popl %ebp ret realicoincidenti: xorl %eax, %eax movl 8(%ebp), %eax xorl %ebx, %ebx movl , %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 , %esp popl %ebp ret
aaa