practica1_200819105
DESCRIPTION
Este documento es una Documentacion sobre la practica 1 del curso Arquitectura de Computadores y Ensambladores 1, del primer semestre 2011. Referente a los Metodos Numericos en Assembler.Realizado Por:Giancarlo Guila ReinaCarnet: 200819105TRANSCRIPT
UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS Curso: Arq. De Computadoras y Ensambladores 1 Catedrático: Ing. Marlon Orellana Auxiliar: Josué Pirir
DOCUMENTACION – PRACTICA 1 – METODOS NUMERICOS EN ENSAMBLADOR
(Newton-Raphson, Steffensen, Muller)
Realizado Por: Giancarlo Guila Reina Carnet: 200819105
1er Semestre 2011
INTRODUCCION
El lenguaje ensamblador, es un lenguaje que se ejecuta a bajo nivel del microprocesador, actualmente se utiliza cuando se quiere manipular directamente dispositivos de hardware, o cuando se quiere obtener un alto rendimiento al manipular el uso de recursos del computador, por lo cual es muy utilizado para la ejecución de cálculos matemáticos complejos. La práctica consistió en realizar un programa en donde se pudieran utilizar los métodos numéricos de Newton-Raphson, Steffensen, o Muller para poder encontrar la raíz aproximada de un polinomio deseado. También se requería que se pudiera graficar la grafica del polinomio. Este documento pretende ser un recurso de ayuda, para aquel que quiera adentrarse en la programación en assembler, así como una orientación para realizar cálculos matemáticos en el mismo, ya que esto era la base de la practica. Se presentan las definiciones de macros utilizados, se explica el modo de video 13h, así como muchas otras cosas que se utilizaron para la realización de la práctica. También se da una especificación del software que se utilizo para trabajar la práctica, con el fin de que el lector pueda orientarse sobre que plataformas usar, y que software utilizar cuando trabaja assembler.
OBJETIVOS
1. Orientar al lector en la programación en assembler utilizando el set de
instrucciones del procesador 8086. 2. Dar a conocer las diferentes técnicas de programación en assembler
para manejar cálculos matemáticos complejos. 3. Dar a conocer como implementar el modo de video 13h en los
programas en assembler. 4. Documentar y explicar el código final de la práctica, para que sirva de
ayuda a las personas que les pueda interesar.
CONTENIDO
Acerca del Software Utilizado El software utilizado para programar la práctica es Emu8086. Está disponible para descargar desde la siguiente página: http://www.emu8086.com/ .
Este programa es sumamente útil para aquellos que quieran aprender lenguaje ensamblador, ya que incorpora un editor avanzado, un ensamblador, una Pc virtual y tutoriales paso a paso. También incluye dispositivos virtuales como impresoras, displays de Led’s, termómetros, etc. De esta manera, es posible ejecutar código fuente sobre un emulador 8086, siendo el código de maquina totalmente compatible con las generaciones siguientes de microprocesadores intel. Otro software utilizado para la realización de la práctica, es un emulador de DOS llamado DosBox, el cual se puede descargar de la siguiente página: http://www.dosbox.com/.
Set de instrucciones del procesador 8086
Detalle de etiquetas y macros utilizados en la práctica:
esccarac este macro imprime un carácter en al, y corre el cursor
vga este macro setea la tarjeta de video hacia la posición que se quiere graficar
colocaCaracter macro que coloca un carácter en pantalla el carácter que coloca es el que recibe como parámetro "char"
inicio esta será mi etiqueta inicial, aquí muestro el encabezado del programa y el menú del mismo
bienvenida escribe en pantalla el encabezado
menu escribe en pantalla el menú de la aplicación
opc_metodos este método muestra un menú con los diferentes métodos numéricos que se pueden utilizar en la aplicación
metodo_newton Esta etiqueta realiza las operaciones necesarias en el algoritmo del método de newton.
itera_newton itera newton es el que se encarga de buscar la raíz aproximada del polinomio
fin_newton Cuando se ha llegado a un error menor que la tolerancia, el método para de iterar y se llama a la siguiente etiqueta en donde se muestra el resultado de la raíz, y se pregunta si se desea graficar.
evalua_polinomio Esta etiqueta evalúa un polinomio de grado 5, todos los coeficientes están inicializados a 0, pero en la etiqueta "pide_polinomio" se cambiaron estos valores. la etiqueta evalúa f(xo), es decir que en xo debe de estar el valor a evaluar.
evalua_derivada Esta etiqueta deriva un polinomio de grado 5, todos los coeficientes están inicializados a 0, pero en la etiqueta "pide_polinomio" se cambiaron estos valores. la etiqueta evalúa f'(xo), es decir que en xo debe de estar el valor a evaluar.
deriva_polinomio esta etiqueta se encarga de derivar un polinomio de grado 5, los valores de los coeficientes resultantes se almacenan en las variables coefd4, coefd3, coefd2, coefd1, coefd0. el polinomio resultante siempre es de grado 4.
pide_gx esta etiqueta se encarga de pedir al usuario que despeje una x del polinomio ingresado, y ingrese la función resultante.
pide_polinomio esta etiqueta se encarga de pedir al usuario el polinomio que se desea evaluar, los coeficientes del polinomio ingresado se almacenan en coef5, coef4, coef3, coef2, coef1 y coef0, del termino de grado 5 al de grado 0, respectivamente.
graficar esta etiqueta se encarga de graficar el plano cartesiano en pantalla
recorrer Esta etiqueta se encarga de recorrer el intervalo [-159,159] que son los límites del eje x en el plano cartesiano (en nuestro caso), y por cada punto evalúa su f(x), y llama a la etiqueta plotear que se encarga de graficar el pixel, si ya se ha recorrido todo el intervalo, se llama a la etiqueta esperar que se encarga de esperar que se presione una tecla para continuar con el programa.
plotear Plotear se encarga de revisar que los rangos estén dentro de los límites del plano cartesiano, y si si lo están, de cambiar el valor del punto, a su equivalente relativo al plano cartesiano.
rango1 rango1 se encarga de revisar el valor px, del lado negativo, si se sale, no grafica, de lo contrario sigue revisando en los otros limites.
rango2 rango2 se encarga de revisar el valor px, del lado positivo, si se sale, no grafica, de lo contrario sigue revisando en los otros limites.
rango3 rango3 se encarga de revisar el valor py, del lado negativo, si se sale, no grafica, de lo contrario sigue revisando en los otros limites.
rango4 rango4 se encarga de revisar el valor py, del lado negativo, si se sale no grafica, de lo contrario (ya que se han revisado que el punto este dentro del margen permitido), se componen las coordenadas
relativas al plano cartesiano (etiqueta signados).
signados Esta etiqueta verifica si px, es positivo o negativo, dependiendo de cuál sea, se envía a la etiqueta correspondiente donde se compone el valor a su equivalente en el plano cartesiano.
valnegativox esta etiqueta cambia el valor de px, lo cambia a su equivalente en el eje negativo de las x (en el plano cartesiano)
valpositivox esta etiqueta cambia el valor de px, lo cambia a su equivalente en el eje positivo de las x (en el plano cartesiano)
comparay Esta etiqueta verifica si py, es positivo o negativo, dependiendo de cuál sea, se envía a la etiqueta correspondiente donde se compone el valor a su equivalente en el plano cartesiano.
valnegativoy esta etiqueta cambia el valor de py, lo cambia a su equivalente en el eje negativo de las y (en el plano cartesiano)
valpositivoy esta etiqueta cambia el valor de py, lo cambia a su equivalente en el eje positivo de las y (en el plano cartesiano)
esperar Esta etiqueta se encarga de esperar a que el usuario presione una tecla, cuando esto se realiza, se cambia el modo de video 13h, a modo de texto, para continuar con la ejecución del programa.
limpiarpantalla Cambia el modo de video 13h, al modo texto devuelve el valor -159 al intervalo que se recorre para graficar y muestra el menú del programa de nuevo.
dibujapunto Esta etiqueta se encarga de preparar el pixel que se dibujara en pantalla.
init esta etiqueta se encarga de setear el modo de video 13h
dibuja esta etiqueta se encarga de poner un pixel en pantalla
metodo_steffensen Esta etiqueta se encarga de realizar el algoritmo necesario para el método de steffensen.
itera_steffensen Esta etiqueta se encarga de realizar las iteraciones correspondientes para el método de steffensen.
fin_steffensen Cuando se ha encontrado que error<tolerancia, se deja de iterar, se muestra la raíz aproximada, y se pregunta si se desea graficar.
metodo_muller Esta etiqueta se encarga de realizar el algoritmo necesario para el método de Muller.
itera_muller Esta etiqueta se encarga de realizar las iteraciones correspondientes para el método de Muller.
itera_muller2 Esta etiqueta se encarga de buscar el valor d necesario para seguir realizando la iteración del método de Muller.
error_metodo Si se ha encontrado un error, se le indica al usuario
y se muestra el menú del programa.
busca_raiz esta etiqueta se encarga de buscar la raíz de un numero
incrementa Se encarga de incrementar el valor de "tmp", variable que nos va a indicar cuándo se ha encontrado la raíz de un numero (ver busca_raiz).
decrementa En esta etiqueta se encuentra el valor de d (el resultado de la raíz), y se continúa con las iteraciones del método.
itera_muller3 Esta etiqueta realiza el paso 2 en las iteraciones del método de Muller.
valabs busca el valor absoluto de un numero
itera_muller4 Realiza la operación |b+d| y continua con las iteraciones.
valabs2 busca el valor absoluto de un numero
itera_muller5 Realiza la operación |b-d|<|b+d| y continua con las iteraciones.
itera_muller6 Busca el valor de e, en el método de Muller.
itera_muller7 continua con el paso 2 del método de Muller
itera_muller8 Realiza la operación h=(-2*f(x2))/e, y verifica el error del método.
verifica_muller Verifica el error del método.
itera_muller9 Muestra el resultado del error, y continúa iterando.
fin_muller si se ha encontrado que error<tolerancia, se muestra el resultado de la raíz aproximadamente, y se pregunta si se desea graficar.
fin etiqueta para detener la ejecución
escribe imprime una cadena en pantalla
caracter Toma la cadena escrita en pantalla. El carácter enter, es el carácter de escape
escribe2 imprime una cadena en pantalla (sin salto de línea)
imprimir_numero Imprime un numero en pantalla (con signo)
leeNumero Lee el numero ingresado
Imprimir_sin_signo Imprime un numero en pantalla (sin signo)
Descripción de Variables y Declaraciones utilizadas:
ejex eje x, es un arreglo de datos que contiene una cantidad de pixeles a graficar
ejey eje y, es un arreglo de datos que contiene una cantidad de pixeles a graficar
punto punto sera el pixel que se va a graficar
buff
declaración de variables a utilizar
tam
str1
str2
str3
str4
str5
str6
str7
str8
str9
str10
str11
str12
str13
str14
str15
str16
str17
str18
str19
str20
str21
str31
str32
str37
str38
str39
str40
str41
coef0
las sig variables nos servirán para almacenar los coeficientes del polinomio
coef1
coef2
coef3
coef4
coef5
coefd4 las sig variables nos servirán para almacenar los coeficientes del polinomio coefd3
coefd2 derivado
coefd1
coefd0
xo
variables en donde se almacenaran los datos para el método de newton
xn
tol
fx
fdx
n
str22
str23
str24
str25
str26
str27
str28
str29
str30
po
variables en donde se almacenaran los datos para el método de steffensen
p1
p2
p3
str33
str34
str35
str36
a_coef0
a_coef1
a_coef2
a_coef3
a_coef4
a_coef5
mxo
variables en donde se almacenaran los datos para el método de Muller
mx1
mx2
mh1
mh2
mr1
mr2
md
mb
md2
mfxo
mfx1
mfx2
maux
tmp1
tmp2
tmp3
me
mh
mx3
str42 – str55
op_mas
variables que servirán para imprimir la derivada
x4
x3
x2
x1
pxx
variables que servirán para graficar
pxy
pyx
pyy
px
py
puntoxo
puntox1
aux
aux2
Algoritmo utilizado para el método de Newton:
Algoritmo Utilizado para el Método de Steffensen:
Algoritmo Utilizado para el Método de Muller: Código Fuente del Programa Dicho código puede ser descargado desde el siguiente link: http://www.4shared.com/file/R-BIg64z/Practica1_200819105.html El programa ejecutable puede ser descargado del siguiente link: http://www.4shared.com/file/xVPfPSHc/MetodosNumericos_Assembler.html
CONCLUSIONES
1. Los programas realizados en assembler presentan una rapidez
inigualable con los que son programados en lenguajes de alto nivel, ya que las instrucciones se ejecutan a nivel del procesador, obteniendo así, el máximo del rendimiento.
2. Es de gran importancia conocer todas las instrucciones que presentan los distintos procesadores, para la realización de buenas prácticas en assembler.
3. En esta práctica no se logro implementar el uso de números flotantes para las aproximaciones de las raíces de los polinomios, pero se investigo bastante sobre ello, obteniendo así conocimiento acerca del FPU, el cual es un set de instrucciones para el co-procesador 8087. Aun así no se logro implementar, pero se exhorta a cualquiera que quiera utilizarlo a investigar sobre ello.
RECOMENDACIONES
A la hora de escribir código es aconsejable seguir unas ciertas reglas para facilitarnos la vida. Téngase en cuenta, por ejemplo, que incluso al mismo desarrollador, al cabo de poco tiempo, le puede costar entender lo que ha programado anteriormente. No hablemos ya de otra persona que vaya a leerlo. Para minimizar este impacto se dan los siguientes consejos:
Lo primero, sin duda, es no empeñarse en escribir código optimizado desde el principio, es decir, deberíamos empezar escribiendo el código como nos resulte más cómodo, ya nos encargaremos después de embellecerlo, porque sino nos estaremos complicando la vida bastante.
Otro consejo fundamental es: divide y vencerás. Es decir, no escribas todo el código como una novela, divídela en subrutinas, de esta forma, cuando leamos las zonas principales entenderemos mejor qué queremos hacer cuando veamos a qué rutinas estamos llamando. Es más fácil leerlo en una línea que pretender entender cien. Por otro lado divide los problemas en subproblemas, es más fácil de arreglar un gran problema en 100 subproblemas pequeños que el grande de un solo golpe.
Empieza por algo sencillo.
Intenta usar un código lo más estilizado y homogéneo posible. Por ejemplo, no escribas código en sitios y con estilos diferentes, porque perderás al que lo lea. Si ya sabemos lo que nos espera, siempre será más sencillo.
Haz copias de seguridad.
Utiliza nombres de variables con un prefijo indicativo de lo que son, de esta manera sabrás de un rápido vistazo qué tienes entre manos. Son muy comunes los fallos tratando a una variable de un tipo diferente al que realmente es, imagínate escribir un word en una variable de tipo byte. Por ejemplo en Windows podríamos usar "lblNombre" para las etiquetas o vbValor para indicar variable de tipo byte.
BIBLIOGRAFIA
8088-8086/8087 Programación ENSAMBLADOR en entorno MS DOS Autor: Miguel Angel Rodríguez-Roselló Editorial: Anaya Junio de 1993 Flat Assembler Programmers Manual Autor: Tomasz Grysztar http://www.flatassembler.net/ Lenguaje Ensamblador de los 80x86 Autor: Jon Beltrán de Heredia junio 2001 Cómo programar en ensamblador Autor: Tomás Tejón 1998