elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1]
1  Programación / ASM / Calculadora en Lenguaje Ensamblador - Linux x86 & NASM en: 24 Febrero 2012, 02:46 am
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
  1. section .data
  2.  
  3.   ; Mensajes
  4.  
  5.   msg1      db      10,'-Calculadora-',10,0
  6.   lmsg1     equ      $ - msg1
  7.  
  8.   msg2      db      10,'Numero 1: ',0
  9.   lmsg2     equ      $ - msg2
  10.  
  11.   msg3      db      'Numero 2: ',0
  12.   lmsg3     equ      $ - msg3
  13.  
  14.   msg4      db      10,'1. Sumar',10,0
  15.   lmsg4     equ      $ - msg4
  16.  
  17.   msg5      db      '2. Restar',10,0
  18.   lmsg5     equ      $ - msg5
  19.  
  20.   msg6      db      '3. Multiplicar',10,0
  21.   lmsg6     equ      $ - msg6
  22.  
  23.   msg7      db      '4. Dividir',10,0
  24.   lmsg7     equ      $ - msg7
  25.  
  26.   msg8      db      'Operacion: ',0
  27.   lmsg8     equ      $ - msg8
  28.  
  29.   msg9      db      10,'Resultado: ',0
  30.   lmsg9     equ      $ - msg9
  31.  
  32.   msg10      db      10,'Opcion Incorrecta',10,0
  33.   lmsg10     equ      $ - msg10
  34.  
  35.   nlinea      db      10,10,0
  36.   lnlinea     equ      $ - nlinea
  37.  
  38. section .bss
  39.  
  40.   ; Espacios reservados para almacenar los valores proporcionados
  41.   ; por el usuario.
  42.  
  43.   opc         resb    2
  44.   num1      resw   2
  45.   num2      resw    2
  46.   result      resw    2
  47.  
  48. section .text
  49.  
  50.   global _start
  51.  
  52. _start:
  53.  
  54.   ; Imprimimos en pantalla el mensaje 1
  55.   mov eax, 4
  56.   mov ebx, 1
  57.   mov ecx, msg1
  58.   mov edx, lmsg1
  59.   int 80h
  60.  
  61.   ; Imprimimos en pantalla el mensaje 2
  62.   mov eax, 4
  63.   mov ebx, 1
  64.   mov ecx, msg2
  65.   mov edx, lmsg2
  66.   int 80h
  67.  
  68.   ; Obtenemos el valor de numero1
  69.   mov eax, 3
  70.   mov ebx, 0
  71.   mov ecx, num1
  72.   mov edx, 2
  73.   int 80h
  74.  
  75.   ; Imprimimos en pantalla el mensaje 3
  76.   mov eax, 4
  77.   mov ebx, 1
  78.   mov ecx, msg3
  79.   mov edx, lmsg3
  80.   int 80h
  81.  
  82.   ; Obtenemos el valor de numero2
  83.   mov eax, 3
  84.   mov ebx, 0
  85.   mov ecx, num2
  86.   mov edx, 2
  87.   int 80h
  88.  
  89.   ; Imprimimos en pantalla el mensaje 4
  90.   mov eax, 4
  91.   mov ebx, 1
  92.   mov ecx, msg4
  93.   mov edx, lmsg4
  94.   int 80h
  95.  
  96.   ; Imprimimos en pantalla el mensaje 5
  97.   mov eax, 4
  98.   mov ebx, 1
  99.   mov ecx, msg5
  100.   mov edx, lmsg5
  101.   int 80h
  102.  
  103.   ; Imprimimos en pantalla el mensaje 6
  104.   mov eax, 4
  105.   mov ebx, 1
  106.   mov ecx, msg6
  107.   mov edx, lmsg6
  108.   int 80h
  109.  
  110.   ; Imprimimos en pantalla el mensaje 7
  111.   mov eax, 4
  112.   mov ebx, 1
  113.   mov ecx, msg7
  114.   mov edx, lmsg7
  115.   int 80h
  116.  
  117.   ; Imprimimos en pantalla el mensaje 8
  118.   mov eax, 4
  119.   mov ebx, 1
  120.   mov ecx, msg8
  121.   mov edx, lmsg8
  122.   int 80h
  123.  
  124.   ; Obtenemos la opcion deseada por el usuario
  125.   mov ebx,0
  126.   mov ecx,opc
  127.   mov edx,2
  128.   mov eax,3
  129.   int 80h
  130.  
  131.   mov ah, [opc]   ; Movemos la opcion seleccionada al registro ah
  132.   sub ah, '0'      ; Convertimos de ascii a decimal
  133.  
  134.   ; Comparamos el valor ingresado por el usuario para saber que
  135.   ; operacion desea realizar.
  136.   cmp ah, 1
  137.   je sumar
  138.   cmp ah, 2
  139.   je restar
  140.   cmp ah, 3
  141.   je multiplicar
  142.   cmp ah, 4
  143.   je dividir
  144.  
  145.   ; Si el valor ingresado por el usuario no cumple ninguna de las
  146.   ; condiciones anteriores entonces mostramos un mensaje de error y
  147.   ; finalizamos el programa.
  148.   mov eax, 4
  149.   mov ebx, 1
  150.   mov ecx, msg10
  151.   mov edx, lmsg10
  152.   int 80h
  153.  
  154.   jmp salir
  155.  
  156. sumar:
  157.   ; Guardamos los numeros en los registros eax y ebx
  158.   mov eax, [num1]
  159.   mov ebx, [num2]
  160.  
  161.   ; Conversion de ascii a decimal
  162.   sub eax, '0'
  163.   sub ebx, '0'
  164.  
  165.   ; Suma
  166.   add eax, ebx
  167.  
  168.   ; Conversion de decimal a ascii
  169.   add eax, '0'
  170.  
  171.   ; Movemos el resultado
  172.   mov [result], eax
  173.  
  174.   ; Imprimimos el mensaje 9
  175.   mov eax, 4
  176.   mov ebx, 1
  177.   mov ecx, msg9
  178.   mov edx, lmsg9
  179.   int 80h
  180.  
  181.   ; Imprimimos el resultado
  182.   mov eax, 4
  183.   mov ebx, 1
  184.   mov ecx, result
  185.   mov edx, 1
  186.   int 80h
  187.  
  188.   ; Finalizamos el programa
  189.   jmp salir
  190.  
  191. restar:
  192.   ; Guardamos los numeros en los registros eax y ebx
  193.   mov eax, [num1]
  194.   mov ebx, [num2]
  195.  
  196.   ; Conversion de ascii a decimal
  197.   sub eax, '0'
  198.   sub ebx, '0'
  199.  
  200.   ; Resta
  201.   sub eax, ebx
  202.  
  203.   ; Conversion de decimal a ascii
  204.   add eax, '0'
  205.  
  206.   ; Movemos el resultado
  207.   mov [result], eax
  208.  
  209.   ; Imprimimos el mensaje 9
  210.   mov eax, 4
  211.   mov ebx, 1
  212.   mov ecx, msg9
  213.   mov edx, lmsg9
  214.   int 80h
  215.  
  216.   ; Imprimimos el resultado
  217.   mov eax, 4
  218.   mov ebx, 1
  219.   mov ecx, result
  220.   mov edx, 1
  221.   int 80h
  222.  
  223.   ; Finalizamos el programa
  224.   jmp salir
  225.  
  226. multiplicar:
  227.   ; Guardamos los numeros en los registros ax y bx
  228.   mov ax, [num1]
  229.   mov bx, [num2]
  230.  
  231.   ; Conversion de ascii a decimal
  232.   sub ax, '0'
  233.   sub bx, '0'
  234.  
  235.   ; Multiplicacion. AL = AX x BX
  236.   mul bx
  237.  
  238.   ; Conversion decimal a ascii
  239.   add al, '0'
  240.  
  241.   ; Movemos el resultado
  242.   mov [result], al
  243.  
  244.   ; Imprimimos el mensaje 9
  245.   mov eax, 4
  246.   mov ebx, 1
  247.   mov ecx, msg9
  248.   mov edx, lmsg9
  249.   int 80h
  250.  
  251.   ; Imprimimos el resultado
  252.   mov eax, 4
  253.   mov ebx, 1
  254.   mov ecx, result
  255.   mov edx, 1
  256.   int 80h
  257.  
  258.   ; Finalizamos el programa
  259.   jmp salir
  260.  
  261. dividir:
  262.   ; Guardamos los numeros en los registros ax y bl
  263.   mov ax, [num1]
  264.   mov bl, [num2]
  265.  
  266.   ; Conversion de ascii a decimal
  267.   sub ax, '0'
  268.   sub bl, '0'
  269.  
  270.   ; Division. AL = AX / BL
  271.   div bl
  272.  
  273.   ; Conversion decimal a ascii
  274.   add al, '0'
  275.  
  276.   ; Movemos el resultado
  277.   mov [result], al
  278.  
  279.   ; Imprimimos el mensaje 9
  280.   mov eax, 4
  281.   mov ebx, 1
  282.   mov ecx, msg9
  283.   mov edx, lmsg9
  284.   int 80h
  285.  
  286.   ; Imprimimos el resultado
  287.   mov eax, 4
  288.   mov ebx, 1
  289.   mov ecx, result
  290.   mov edx, 1
  291.   int 80h
  292.  
  293.   ; Finalizamos el programa
  294.   jmp salir
  295.  
  296. salir:
  297.   ; Imprimimos dos nuevas lineas
  298.   mov eax, 4
  299.   mov ebx, 1
  300.   mov ecx, nlinea
  301.   mov edx, lnlinea
  302.   int 80h
  303.   ; Finalizamos el programa
  304.   mov eax, 1
  305.   mov ebx, 0
  306.   int 80h
  307.  

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
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines