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

    [Asm At&t] conversione binario decimale

    Buongiorno a tutti,
    ho provato a creare questo programma per la conversione da binario a decimale, ma all'esecuzione mi compare "Floating point exception" :

    Programma in C:
    codice:
    #include <stdio.h>
    
    int main(void)
    {
       int n, n2;     /* n2, numero binario */
       int cifra;
       int n10 = 0;   /* valore in base 10  */
       int peso = 1;  /* peso della cifra   */
    
       printf("Inserire il numero in base 2: ");
       scanf("%u", &n);
    
       n2 = n;
       while (n2 > 0) 
       {
          cifra = n2 % 10;       /* LSB, cifra a destra */
          
          /* controllo che la cifra appartenga alla base */
          
          if (cifra > 1) 
             printf("Numero non in base 2!\n");
    
          n10 = n10 + cifra * peso;
          peso = peso * 2;
    
          /* scarta la cifra piu` a destra */
          
          n2 = n2 / 10;
       }
    
       printf("(%u)_2 = (%u)_10\n", n, n10);
    
       return 0;
    }
    Funzione "converti" in asm che esegue il ciclo while:
    codice:
    .data
          errore:  .string "Numero non in base 2!\n"
          out:     .string "Il valore richiesto è (%d)_10\n"
          n2:      .int  0
          cifra:   .int  0
          n10:     .int  0
          peso:    .int  1
    .text
    .globl converti
    converti:
          pushl %ebp
          movl %esp, %ebp
          movl 8(%ebp), %ebx
          movl %ebx, (n2)
      
      inizio:
          xorl %ebx, %ebx
          movl (n2), %eax
          movl $10, %ebx
          divl %ebx
          movl %edx, (cifra)
          cmpl $1, (cifra)
          jg err
          xorl %eax, %eax
          movl (peso), %eax
          mull (cifra)
          addl %eax, (n10)
          xorl %eax, %eax
          movl $2, %eax
          mull (peso)
          addl %eax, (peso)
          xorl %eax, %eax
          movl (n2), %eax
          movl $10, %ebx
          divl %ebx
          addl %eax, (n2)
          xorl %eax, %eax
          cmpl (n2), %eax
          jl inizio
          jg risultato
          
      err:
          pushl $errore
          call printf
          addl $4, %esp
          jmp fine
    
      risultato:
          pushl (n10)
          pushl $out
          call printf
          addl $8, %esp
          popl %ebp
          ret
    
      fine:
          popl %ebp
          ret
    vi ringrazio per l'aiuto

  2. #2
    Ho modificato la funzione asm, ora non mi dà più quell'errore però nel confronto tra il valore 1 che si trova in %ecx e (cifra) mi riconosce quest'ultima sempre maggiore di 1 saltando così all'etichetta "err"...help me...

    codice:
    .data
          errore:  .string "Numero non in base 2!\n"
          out:     .string "Il valore richiesto è (%d)_10\n"
          n2:      .int  0
          cifra:   .int  0
          n10:     .int  0
          peso:    .int  1
    .text
    .globl converti
    converti:
          pushl %ebp
          movl %esp, %ebp
          movl 8(%ebp), %ebx
          movl %ebx, (n2)
          movl $10, %ebx
          movl $1, %ecx
      
      inizio:
          xorl %edx, %edx
          addl (n2), %eax
          divl %ebx
          movl %edx, (cifra)
          
          cmpl %ecx, (cifra)
          jg err
    
          xorl %eax, %eax
          movl (cifra), %eax
          mull (peso)
          addl %eax, (n10)
          
          xorl %eax, %eax
          movl $2, %eax
          mull (peso)
          addl %eax, (peso)
          
          xorl %eax, %eax
          movl (n2), %eax
          divl %ebx
          movl %eax, (n2)
     
          xorl %eax, %eax
          cmpl (n2), %eax
          jl inizio
          jg risultato
          
      err:
          pushl $errore
          call printf
          addl $4, %esp
          jmp fine
    
      risultato:
          pushl (n10)
          pushl $out
          call printf
          addl $8, %esp
          popl %ebp
          ret
    
      fine:
          popl %ebp
          ret

  3. #3
    Può essere che..
    Linea 16:
    codice:
    movl $1, %ecx
    Linea 24 - 25
    codice:
    cmpl %ecx, (cifra)
    jg err

  4. #4
    si infatti dovrebbe fare il confronto tra 1 e (cifra) e solo se quest'ultima è maggiore di 1 passare all'etichetta "err", invece lo fa sempre, anche quando questa condizione non si verifica!

  5. #5
    si infatti dovrebbe fare il confronto tra 1 e (cifra) e solo se quest'ultima è maggiore di 1 passare all'etichetta "err",
    Io guardando attraverso gdb ho notato che il valore di cifra era sempre maggiore di 1.. 7 o 3 se non mi sbaglio

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.