Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Asm At&t] equazioni secondo grado

    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

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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 è?

    Se continui cs nn ti bastano una decina di alu, è un tempo di latenaz che tende ad infinito
    Poi stai usando numeri senaz virgola?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    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:

    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
         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

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    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)....

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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.
    Per gli Spartani e Sparta usa spartan Il mio github

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.