Hola,
Mi nombre es Nicolás y me acabo de registrar en el foro. Estoy haciendo en una calculadora la cual primero le pide al usuario que ingrese dos números y después le pide que indique que operación desea realizar con estos dos números. Mi calculadora suma, resta y multiplica correctamente pero no es capaz de dividir. Al intentar realizar una división recibo el error "Excepción de coma flotante".
A continuación les dejo mi código:
El problema se encuentra dentro de la etiqueta dividir. Es la unica operacion que devuelve un error.
Espero que algun usuario me pueda ayudar a resolver este error.
Muchas Gracias
Mi nombre es Nicolás y me acabo de registrar en el foro. Estoy haciendo en una calculadora la cual primero le pide al usuario que ingrese dos números y después le pide que indique que operación desea realizar con estos dos números. Mi calculadora suma, resta y multiplica correctamente pero no es capaz de dividir. Al intentar realizar una división recibo el error "Excepción de coma flotante".
A continuación les dejo mi código:
Código (asm) [Seleccionar]
section .data
; Mensajes
msg1 db 10,'-Calculadora-',10,0
lmsg1 equ $ - msg1
msg2 db 10,'Numero 1: ',0
lmsg2 equ $ - msg2
msg3 db 'Numero 2: ',0
lmsg3 equ $ - msg3
msg4 db 10,'1. Sumar',10,0
lmsg4 equ $ - msg4
msg5 db '2. Restar',10,0
lmsg5 equ $ - msg5
msg6 db '3. Multiplicar',10,0
lmsg6 equ $ - msg6
msg7 db '4. Dividir',10,0
lmsg7 equ $ - msg7
msg8 db 'Operacion: ',0
lmsg8 equ $ - msg8
msg9 db 10,'Resultado: ',0
lmsg9 equ $ - msg9
msg10 db 10,'Opcion Incorrecta',10,0
lmsg10 equ $ - msg10
nlinea db 10,10,0
lnlinea equ $ - nlinea
section .bss
; Espacios reservados para almacenar los valores proporcionados
; por el usuario.
opc resb 2
num1 resw 2
num2 resw 2
result resw 2
section .text
global _start
_start:
; Imprimimos en pantalla el mensaje 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h
; Imprimimos en pantalla el mensaje 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h
; Obtenemos el valor de numero1
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h
; Imprimimos en pantalla el mensaje 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h
; Obtenemos el valor de numero2
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h
; Imprimimos en pantalla el mensaje 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h
; Imprimimos en pantalla el mensaje 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h
; Imprimimos en pantalla el mensaje 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h
; Imprimimos en pantalla el mensaje 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h
; Imprimimos en pantalla el mensaje 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h
; Obtenemos la opcion deseada por el usuario
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h
mov ah, [opc] ; Movemos la opcion seleccionada al registro ah
sub ah, '0' ; Convertimos de ascii a decimal
; Comparamos el valor ingresado por el usuario para saber que
; operacion desea realizar.
cmp ah, 1
je sumar
cmp ah, 2
je restar
cmp ah, 3
je multiplicar
cmp ah, 4
je dividir
; Si el valor ingresado por el usuario no cumple ninguna de las
; condiciones anteriores entonces mostramos un mensaje de error y
; finalizamos el programa.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h
jmp salir
sumar:
; Guardamos los numeros en los registros eax y ebx
mov eax, [num1]
mov ebx, [num2]
; Conversion de ascii a decimal
sub eax, '0'
sub ebx, '0'
; Suma
add eax, ebx
; Conversion de decimal a ascii
add eax, '0'
; Movemos el resultado
mov [result], eax
; Imprimimos el mensaje 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Imprimimos el resultado
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; Finalizamos el programa
jmp salir
restar:
; Guardamos los numeros en los registros eax y ebx
mov eax, [num1]
mov ebx, [num2]
; Conversion de ascii a decimal
sub eax, '0'
sub ebx, '0'
; Resta
sub eax, ebx
; Conversion de decimal a ascii
add eax, '0'
; Movemos el resultado
mov [result], eax
; Imprimimos el mensaje 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Imprimimos el resultado
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; Finalizamos el programa
jmp salir
multiplicar:
; Guardamos los numeros en los registros ax y bx
mov ax, [num1]
mov bx, [num2]
; Conversion de ascii a decimal
sub ax, '0'
sub bx, '0'
; Multiplicacion. AL = AX x BX
mul bx
; Conversion decimal a ascii
add al, '0'
; Movemos el resultado
mov [result], al
; Imprimimos el mensaje 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Imprimimos el resultado
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; Finalizamos el programa
jmp salir
dividir:
; Guardamos los numeros en los registros ax y bl
mov ax, [num1]
mov bl, [num2]
; Conversion de ascii a decimal
sub ax, '0'
sub bl, '0'
; Division. AL = AX / BL
div bl
; Conversion decimal a ascii
add al, '0'
; Movemos el resultado
mov [result], al
; Imprimimos el mensaje 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h
; Imprimimos el resultado
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h
; Finalizamos el programa
jmp salir
salir:
; Imprimimos dos nuevas lineas
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; Finalizamos el programa
mov eax, 1
mov ebx, 0
int 80h
El problema se encuentra dentro de la etiqueta dividir. Es la unica operacion que devuelve un error.
Espero que algun usuario me pueda ayudar a resolver este error.
Muchas Gracias