practica1_200819105

14
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

Upload: giancareina

Post on 30-Jun-2015

275 views

Category:

Documents


0 download

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: 200819105

TRANSCRIPT

Page 1: Practica1_200819105

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

Page 2: Practica1_200819105

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.

Page 3: Practica1_200819105

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

Page 4: Practica1_200819105
Page 5: Practica1_200819105

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.

Page 6: Practica1_200819105

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

Page 7: Practica1_200819105

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

Page 8: Practica1_200819105

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)

Page 9: Practica1_200819105

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

Page 10: Practica1_200819105

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

Page 11: Practica1_200819105

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:

Page 12: Practica1_200819105

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

Page 13: Practica1_200819105

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.

Page 14: Practica1_200819105

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