PDA

Visualizza la versione completa : [Asm At&t] equazioni secondo grado


il-david
07-06-2010, 10:30
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 $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

linoma
07-06-2010, 12:26
scusami ma il calcolo del quadrato ti sembra giusto? Nn era meglio una semplice moltiplicazione?
Ma stai usando un RISC? Giuro nn ho capito cs ? :dott:

Se continui cs nn ti bastano una decina di alu, un tempo di latenaz che tende ad infinito :)
Poi stai usando numeri senaz virgola?

il-david
07-06-2010, 12:48
Onestamente non so cosa sia un RISC, comunque sto programmando con sintassi At&t in ambiente linux. In che senso numeri senza virgola? Le variabili le ho dichiarate float. Ho sostituito il ciclo del prodotto ma ora mi d radici sballate e vede il discriminante sempre uguale a 0:



/*----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
h: .float 0
i: .int 0
.text
.globl g2eqsolutions
g2eqsolutions:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax # coefficiente b in eax
mull 12(%ebp)
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

linoma
07-06-2010, 12:52
Stai usano istruzioni che lavorano su numeri interi, o usi la FPU o le nuove unita SSE. Cmq ancora manca la mull di b*b che diventerebbe fmul se usi la FPU.

il-david
07-06-2010, 13:00
Allora forse non mi chiaro il funzionamento di mull, il primo termine del prodotto deve stare in %eax ed infatti ho spostato 12(%ebp) in %eax, ed l'ho moltiplicato a sua volta per 12(%ebp), il risultato viene posto in %eax e l'ho spostato in (d)....

linoma
07-06-2010, 13:15
la sintassi AT&T diversa da quella Intel in particolare per l'ordine dei parametri delle istruzioni ASM. Credo che nel tuo prg questo ordine da qualche parte salta. E controlla che l'offset per i valori che leggi dallo stack siano giusti.

Cmq stai usando numeri interi, (se cerchi trovi una discussione sul formato in virgola mobile) per i numeri in virgola mobile devi usare la FPU.

Loading