Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - nicoobe

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

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