You are on page 1of 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


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
tam
str1
str2
str3
str4
str5
str6
str7
str8
str9
str10
str11
str12
str13
declaración de variables a utilizar
str14
str15
str16
str17
str18
str19
str20
str21
str31
str32
str37
str38
str39
str40
str41
coef0
coef1
coef2 las sig variables nos servirán para
coef3 almacenar los coeficientes del polinomio
coef4
coef5
coefd4 las sig variables nos servirán para
coefd3 almacenar los coeficientes del polinomio
coefd2 derivado
coefd1
coefd0
xo
xn
tol
fx
fdx
n
str22
variables en donde se almacenaran los
str23
datos para el método de newton
str24
str25
str26
str27
str28
str29
str30
po
p1
p2
p3
str33
str34
str35 variables en donde se almacenaran los
str36 datos para el método de steffensen
a_coef0
a_coef1
a_coef2
a_coef3
a_coef4
a_coef5
mxo
mx1
mx2
mh1
mh2
mr1
variables en donde se almacenaran los
mr2
datos para el método de Muller
md
mb
md2
mfxo
mfx1
mfx2
maux
tmp1
tmp2
tmp3
me
mh
mx3
str42 – str55
op_mas
x4
variables que servirán para imprimir la
x3
derivada
x2
x1
pxx
pxy
pyx
pyy
px
variables que servirán para graficar
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

You might also like