PDA

Visualizza la versione completa : [ASSEMBLY] Conversione binario decimale


il-david
03-07-2010, 12:12
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:


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


.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 ;)

il-david
03-07-2010, 16:38
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...



.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

simo_us
04-07-2010, 06:00
Può essere che..
Linea 16:

movl $1, %ecxLinea 24 - 25

cmpl %ecx, (cifra)
jg err

il-david
04-07-2010, 10:49
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!

simo_us
04-07-2010, 15:49
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

Loading