# ¿Como desarrollar una calculadora basica en assembler?



## Jamrix (Mar 29, 2008)

bueno es como un proyecto, por no decir un trabajo en el cual necesito algo de ayuda 

para empezar, el tema trata sobre hacer un calculadora basica en assembler mas especifico en masm32
este pequeño trabajo debe contener algo como el siguiente menu:
[1] sumar numeros
[2] restar numeros
[3] multiplicar numeros
[4] dividir numeros
[5] modulo de (resto de una division)
[6] raiz cuadrada
[7] raiz cubica
[8] transformar grados sexagesimales
[9] hallar el area de un triangulo
[10] salir

opcion : (ej 1)
proceso sumar numeros
lee el numero A: 15
lee el numero B: 12
el resultado es: 27

mi nivel de conocimientos de electronica es amateur, yo estudio ingenieria de sistemas y en un curso estamos viendo la arquitectura de la computadoras, y parte de ello es saber crear programas en lenguaje maquina, osea en assembler, lo malo es que recienlo voy entendiendo 

este trabajo debe correr en DOS, algo que nos enseñaron es creamos el codigo en el win asembler por ejemplo, y con el tasm creamos el archivo .obj y con el tlink se crea el archivo ejecutable, creo que eso ya lo saben 

el profesor tmb nos habia mencionado que se podian desemsamblar los programas y ver su codigo en assembler, yo estaba pensando hacerlo en c++ -que es el primer lenguaje que aprendi- y desemsamblar el ejecutable pero lo malo es que no se como se desemsambla bueno no se si alguien es capo en assembler y se puede dar un tiempecito para hacer este simple menu , gracias


----------



## Eduardo (Mar 29, 2008)

Jamrix dijo:
			
		

> ....el profesor tmb nos habia mencionado que se podian desemsamblar los programas y ver su codigo en assembler, yo estaba pensando hacerlo en c++ -que es el primer lenguaje que aprendi- y desemsamblar el ejecutable pero lo malo es que no se como se desemsambla ..


No hace falta desensamblar el ejecutable,  compilas con la opcion -S y te genera directamente el codigo assembler con las instrucciones en C intercaladas como comentarios.
Por ejemplo, con el compilador de Borland (es libre) haces directamente: bcc32 -S mi_codigo_c.cpp y te genera  mi_codigo_c.asm .

Al principio no uses ninguna optimizacion para que te resulte mas legible.


----------



## pepechip (Mar 30, 2008)

hola
El micro lo unico que sabe hacer es sumar y restar, asi que con estas 2 funciones tendras que realizar el resto.
Para sumar y restar tienes comandos especificos para ello (ADD y DECF)
Si multiplicas o divides por 10 o multiplo de este, tienes que correr el dado a la izquierda o derecha.
Si la multiplicacion es con otro numero tendras que realizar sumas consecutivas.
Didivir consiste en restar un numero determinado de veces.

No lo tienes nada facil. Suerte.


----------



## Jamrix (Mar 30, 2008)

bueno, si entiendo ... lo del producto es con sumas sucesivas y de division es con restas sucesivas, sobre eso tengo el codigo para un simulador, la cuestion es la raiz cuadrada y cubica, el algoritmo que tengo es este:
*************************************
leer N
contador=1
emp:
  producto=contador * contador
  residuo = N - producto
  if (residuo <= 0)
    goto sol
  else
    contador = contador + 1
    goto emp
sol:
  if(residuo=0)
    resultado = contador
  else
    residuo = contador - 1
end
 *************************************
bueno espero que se entienda, lo "malo" de este algoritmo es que el resultado es entero, es decir, si qyuero sacar la raiz cuadrada de 38, la respuesta es 6 y  no 6,1644... y en lo que se refiere a hallar el area de un triangulo no va hallar el area exacta, con la formila de  
A=sqrt(p*(p-a)(p-b)(p-c))
no se si alguien me puede decir como establecer respuestas con punto flotante, osea con decimales, o es que no se puede hacer esto en assembler, que alguien me diga porfavor
y bueno lo de la  raiz cubica me imagino que es parecido no? 
producto=contador*contador*contador

tal vez alguien conosca otro algoritmo mas eficaz, que lo publique


----------



## Eduardo (Mar 30, 2008)

Jamrix dijo:
			
		

> ....no se si alguien me puede decir como establecer respuestas con punto flotante, osea con decimales, o es que no se puede hacer esto en assembler, que alguien me diga porfavor...


Usa las instrucciones del coprocesador matematico.

Suma: A + B = C   (A,B y C numeros en punto flotante)
    asm{ fld A ;   fld B ;  faddp ; fstp C ; }        <<-  esto es dentro del codigo C 

Multiplicacion: A * B = C 
    asm{ fld A ; fld B ; fmulp ; fstp C ; }

Raiz cuadrada: sqrt(A) = B
    asm{ fld A ; fsqrt ; fstp B ; }

etc....


----------

