microprocesador 8085 (5) intel

28
Microprocesador 8085 de INTEL Microprocesador 8085 de INTEL Microprocesador 8085 de INTEL Microprocesador 8085 de INTEL LA PROGRAMACIÓN A PROGRAMACIÓN A PROGRAMACIÓN A PROGRAMACIÓN Algoritmo Algoritmo Algoritmo Algoritmo Pseudocódigos Pseudocódigos Pseudocódigos Pseudocódigos Estructuras de datos Estructuras de datos Estructuras de datos Estructuras de datos Diagramas de flujo Diagramas de flujo Diagramas de flujo Diagramas de flujo Ejemplos de algoritmos Ejemplos de algoritmos Ejemplos de algoritmos Ejemplos de algoritmos Ejercicios Ejercicios Ejercicios Ejercicios

Upload: celestino-benitez

Post on 09-Mar-2016

270 views

Category:

Documents


5 download

DESCRIPTION

En el desarrollo de este tema veremos la forma de llevar a cabo los organigramas básicos de los programas que deseemos diseñar

TRANSCRIPT

Page 1: Microprocesador 8085 (5)  INTEL

Microprocesador 8085 de INTELMicroprocesador 8085 de INTELMicroprocesador 8085 de INTELMicroprocesador 8085 de INTEL

LLLLA PROGRAMACIÓNA PROGRAMACIÓNA PROGRAMACIÓNA PROGRAMACIÓN

AlgoritmoAlgoritmoAlgoritmoAlgoritmo PseudocódigosPseudocódigosPseudocódigosPseudocódigos

Estructuras de datosEstructuras de datosEstructuras de datosEstructuras de datos Diagramas de flujoDiagramas de flujoDiagramas de flujoDiagramas de flujo

Ejemplos de algoritmosEjemplos de algoritmosEjemplos de algoritmosEjemplos de algoritmos EjerciciosEjerciciosEjerciciosEjercicios

Page 2: Microprocesador 8085 (5)  INTEL

microprocesadores microprocesador electronica instrucciones set direcciones datos bus 8085 intel foto macro olympus zuiko potencia direccionamiento decodificador salto bucle logicas aritmeticas condicionales programa ensamblador

http://micros.myblog.es/ http://issuu.com/microprocesadores/ © 2010 Celestino Benítez Vázquez Todos los contenidos e imágenes publicados en la revista “microprocesadores” tienen los derechos reservados quedando prohibida la reproducción total o parcial de esta publicación sin el consentimiento expreso de su autor.

Page 3: Microprocesador 8085 (5)  INTEL

5. LA PROGRAMACIÓN.

Después de haber tratado y examinado el repertorio de instrucciones del microprocesador, vamos a introducir algunas cuestiones básicas y primordiales sobre la metodología de la programación, que nos faciliten el desarrollo de programas aplicables a nuestro sistema físico.

Planteamos aquí la base de la programación estructurada que nos ayudará a construir programas

más o menos complejos, que se apoyarán en unidades o bloques más elementales para a partir de ellos obtener otros más largos y complicados. Se obtendrán algoritmos que no dependerán en absoluto de ningún lenguaje de programación en concreto y que posteriormente serán convertidos al lenguaje deseado en cada caso (para nosotros el ensamblador).

El proceso de programación debe desarrollarse partiendo de unas “ideas” que deben ser

perfectamente asimiladas, comprendidas y organizadas por la persona o personas que vayan a construir el programa en cuestión. Esto lleva implícita la disminución de errores durante el proceso programador, por lo que se facilita enormemente la tarea.

El objetivo final de la programación será, además de conseguir programas que funcionen

correctamente y sean eficientes, proporcionar sobre ellos toda la documentación necesaria. Debe tenerse en cuenta que un programa indebidamente documentado sería muy difícil de modificar en un futuro, o al menos podría resultar tan costoso que nos haría renunciar a tal propósito.

Page 4: Microprocesador 8085 (5)  INTEL

5.1 EL ALGORITMO.

Puede decirse que un “algoritmo” no es más que un método que vamos a utilizar para resolver un problema o mejor aún para resolver un tipo de problemas. Para afrontar la construcción de un programa determinado, resulta esencial conocer de un modo preciso el problema que se desea resolver y los datos iniciales de los que se dispone para, a través del algoritmo, describir exactamente y con la mayor precisión posible, la secuencia de pasos a seguir hasta llegar a la solución deseada.

El algoritmo debe ser construido mediante la especificación de un proceso que muestre de forma

clara la relación entre los estados iniciales y los estados o resultados finales. Los elementos que componen una especificación son fundamentalmente: 1. El nombre del algoritmo que se desarrolla. 2. La función o tarea que realiza lo más clara posible. 3. Las condiciones iniciales (precondiciones). 4. Los estados finales una vez ejecutado el algoritmo (postcondiciones). 5. La exposición de las variables que intervienen.

Las especificaciones que se realicen deben ser claras y precisas de forma que no quede lugar a ambigüedades y deben ser propuestas de la forma más general posible. Puede suceder que en determinados algoritmos no sea necesario exponer de forma explícita todos los elementos de la especificación.

Los programas que trataremos, en general, se desarrollaran de forma lineal o secuencial, es decir,

ejecutaremos las instrucciones en el orden programado, aunque dispondremos de los medios adecuados para “romper” esta secuencia y continuar la ejecución en otro punto del programa que nos interese. Podremos también en circunstancias concretas, establecer determinados bloques o conjuntos de

Page 5: Microprocesador 8085 (5)  INTEL

instrucciones que se repitan cíclicamente un estipulado número de veces, incluso determinadas partes del programa podrán ejecutarse o no en función de que se cumplan ciertos condicionamientos.

Cuando se pretende resolver un problema mediante la programación, lo normal es que se

encuentren distintas formas o modos de solucionarlo, es decir, distintos algoritmos que nos proporcionen el mismo resultado. Debe quedar claro, por tanto, que no hay una solución única en el momento de construir un algoritmo.

Fundamentalmente debemos conseguir que todos los algoritmos construidos reúnan las

siguientes características: • Que sean fácilmente comprensibles para quien pretenda leerlos. • Deben obtener el resultado deseado de forma rápida. • Deben ocupar el menor espacio posible. • Es conveniente que el programa se encuentre subdividido en programas más elementales, es decir, el

programa debe ser modular. • Además debe ser razonablemente fácil de modificar. A esto ayuda la modularidad y la

documentación que acompañe al programa (la información que suministra la documentación es muy importante en los procesos de modificaciones).

Existen diversas formas de abordar la construcción de un algoritmo, desde la realización de

“tablas de decisión” que nos señalan las distintas cuestiones planteadas y nos apuntan a las acciones a tomar, pasando por la realización de los “diagramas de flujo” que nos resuelven el problema gráficamente, las “especificaciones formales” que pretenden introducir un lenguaje más preciso y matemático que anule en lo posible las indefiniciones y los errores, hasta la utilización conjunta del lenguaje común y palabras clave, constituyendo lo que se llama el pseudocódigo.

Page 6: Microprocesador 8085 (5)  INTEL

Debe entenderse que cada uno de estos métodos de construcción de algoritmos tiene sus ventajas e inconvenientes. Por ejemplo, es claro que para resolver un problema pequeño, puede resultar muy sencillo e ilustrativo emplear el diagrama de flujo. Sin embargo, si el problema es mucho más complejo, este método podría resultar muy dificultoso, nos causaría muchos problemas si tuviéramos que realizar alguna modificación e incluso podría llegar a no ser utilizable dependiendo del nivel de dificultad.

En ocasiones puede ser interesante utilizar una mezcla de dos métodos, siempre que nos facilite

la tarea de programar. Nosotros emplearemos los diagramas de flujo siempre que sea posible y el pseudocódigo, todo ello con vistas al paso posterior, que será la codificación del algoritmo en lenguaje ensamblador.

5.2 LOS PSEUDOCÓDIGOS-

Como se ha mencionado anteriormente, al emplear el pseudocódigo para la construcción de un algoritmo, se utiliza una mezcla entre el lenguaje común y determinadas instrucciones cruciales que veremos a continuación.

Hay que recordar que este procedimiento empleado en la creación de los algoritmos no siempre puede seguir una estructura rígida, debiendo adaptarnos al problema concreto que estemos tratando. Al objeto de ir concretando algo más sobre los aspectos que nosotros trataremos finalmente para la puesta en funcionamiento de nuestro sistema, debemos indicar que: • Las condiciones iniciales (precondiciones) que normalmente observaremos harán referencia a

determinados registros o posiciones de memoria que contienen los datos precisos para ejecutar ese algoritmo.

• Las condiciones finales (postcondiciones) harán referencia al modo de obtención del resultado de la ejecución, dónde queda almacenado un dato o resultado, como se ejecuta una acción, registros modificados durante la ejecución, direcciones de memoria alteradas, etc.

Puede decirse, por tanto, que la estructura básica de un algoritmo será del tipo que a

continuación se muestra: NOMBRE:

FUNCION:

PRECONDICIONES:

POSTCONDICIONES: VARIABLES: .............................................. .............................................. CUERPO DEL PROGRAMA .............................................. .............................................. FINAL

La instrucción más elemental y básica que se emplea en el diseño de algoritmos es la de “asignación”, que consiste en dar un determinado valor a una variable. Esta operación se realiza simbólicamente mediante el signo “=”. Debe tenerse cuidado en las asignaciones con los tipos de datos que se está trabajando. En nuestro caso es imprescindible saber si se trata de palabras de 8 bits, 16 bits, valores decimales, hexadecimales, caracteres ASCII, etc.

Page 7: Microprocesador 8085 (5)  INTEL

Por otro lado, como ya se ha apuntado anteriormente, el desarrollo de un algoritmo está basado en la composición secuencial de instrucciones, es decir, en la ejecución de las instrucciones que lo componen de manera consecutiva. Esto quiere decir que cuando partimos de unas precondiciones determinadas (Pr1) y ejecutamos una serie de instrucciones, se obtendrán unas postcondiciones concretas (Po1). Si ahora estas postcondiciones nos sirven como precondiciones (Po1=Pr2) para ejecutar a continuación otra serie de instrucciones que nos proporcionen nuevas postcondiciones (Po2), quiere esto decir que es posible que no necesitemos explicar los estadios intermedios pudiendo limitarnos a partir de las precondiciones iniciales (Pr1) para obtener las postcondiciones finales (Po2), produciéndose de esta manera la asociación de instrucciones. Sin embargo este proceso de composición secuencial no proporciona los medios adecuados o suficientes para desarrollar algoritmos que nos exijan un mínimo de complejidad. Disponemos entonces de una serie de acciones o mecanismos que nos permiten variar o modificar el desarrollo de una secuencia en función de alguna característica determinada. Entre estas acciones destacan:

Las decisiones: Constituyen una nueva estructura que nos permite ejecutar o no, una parte del programa, atendiendo a determinada condición. Este tipo de estructura responde a la siguiente notación:

SI condición Instrucción 1 Instrucción 2 Instrucción 3 .................... Instrucción N FIN DE SI

Page 8: Microprocesador 8085 (5)  INTEL

Al ejecutar el programa, cuando se llega a este punto condicional, nuestro microprocesador comprobará si se cumple la condición. Si la respuesta es positiva se ejecutan las instrucciones pertenecientes al condicional SI (Instrucción 1, Instrucción 2, ..., Instrucción N) y a continuación prosigue con el resto del programa que exista después de FIN DE SI. En caso de que no se cumpla la condición, no se ejecutarán las instrucciones del condicional SI y el microprocesador continuará la ejecución del programa que sigue a FIN DE SI. (Debemos recordar ahora algunas de las instrucciones del 8085 y fijarnos que la comprobación de la condición por parte del microprocesador está basada en la inspección de los flags o señalizadores). En ocasiones se necesita no solo elegir si vamos a desarrollar un proceso o no, sino que deseamos realizar un proceso u otro según una determinada condición. Es decir, estamos ante estructuras que nos permiten elegir entre dos procesos distintos. Dichas acciones responden a la siguiente notación: SI condición Instrucción 1 Instrucción 2 .................... Instrucción N SI NO Instrucción N+1 Instrucción N+2 ...................... Instrucción 2N FIN DE SI Cuando se alcanza este condicional, el microprocesador comprueba la condición y en caso de que se cumpla ejecuta Instrucción 1, Instrucción 2, ..., Instrucción N, y a continuación pasan a ejecutarse las instrucciones del programa que van después de FIN DE SI. En caso de que la condición no se cumpla, se ejecutarán Instrucción N+1, Instrucción N+2, ..., Instrucción 2N, y a continuación las instrucciones que van después de FIN DE SI. Estas situaciones condicionales (tomas de decisión) pueden estar anidadas, es decir, entre las instrucciones que hay dentro de estos lazos, puede haber otras instrucciones de tomas de decisión, obteniendo estructuras cada vez más complejas, pero que nos proporcionan mayor flexibilidad, del tipo: SI condicion1 Instrucción 1 Instrucción 2 SI condición2 Instrucción a Instrucción b Instrucción c FIN DE SI SI NO Instrucción 3 Instrucción 4 FIN DE SI Los bucles: También denominados ciclos, son estructuras que nos permiten la ejecución de una serie de instrucciones un determinado número de veces que depende del estado o condición inicial. Los bucles constituyen lo que llamaremos composiciones iterativas. Están compuestos básicamente por una condición inicial y el cuerpo del bucle, respondiendo a la siguiente notación: MIENTRAS condición Instrucción 1 Instrucción 2 ..................... Instrucción N FIN DE MIENTRAS

Page 9: Microprocesador 8085 (5)  INTEL

Cuando nos encontremos ante una estructura de este tipo, si se cumple la condición inicial, se ejecutará el cuerpo del bucle (Instrucción 1, Instrucción 2, ..., Instrucción N) hasta que deje de cumplirse la condición, momento en el que pasarán a ejecutarse las instrucciones que van después de FIN DE MIENTRAS. Si la condición inicial no se cumple no se entra en el ciclo y se continúa después de FIN DE MIENTRAS. Debe tenerse especial cuidado en que después de un determinado número de iteraciones la condición deje de cumplirse, de otro modo entraríamos en un bucle sin fin. Las condiciones de los bucles, normalmente se establecen mediante contadores que son variables que contienen números enteros y que, en el interior del cuerpo del bucle, son incrementadas o decrementadas de forma constante en cada iteración que se realiza.

Page 10: Microprocesador 8085 (5)  INTEL
Page 11: Microprocesador 8085 (5)  INTEL

5.3 LAS ESTRUCTURAS DE DATOS.

Hasta el momento hemos visto algunos aspectos de las herramientas disponibles para desarrollar algoritmos. Sin embargo cuando se presenta la necesidad de manejar un elevado número de datos, es preciso agruparlos y organizarlos atendiendo a unas características concretas que sean comunes a todos ellos, constituyendo de este modo las estructuras de datos.

La estructura más sencilla y con la que trabajaremos nosotros es el array unidimensional,

constituido por un conjunto de datos de idénticas propiedades, colocados por un orden dentro de un conjunto. El lugar que ocupan dentro de ese conjunto o array es señalado o marcado por la variable índice que puede tomar valores enteros de tal forma que apunte desde el primer dato al último del array. Por tanto un array (también llamado lista) estará representado por un nombre y un índice que apunta a todos los elementos del array. Un elemento será señalado por el nombre del array seguido del lugar que ocupa, es decir, del índice. Por ejemplo VALOR(3) se refiere al elemento 3 del array que lleva el nombre de VALOR.

Para recorrer un array debemos conocer con anterioridad el número total de elementos que lo

componen y emplear un ciclo de repetición que responda a la estructura siguiente: REPETIR DESDE I=1 HASTA N Instrucción 1 Instrucción 2 ..................... Instrucción x

FIN DE REPETIR DESDE Además del array unidimensional, podemos hacer referencia también al array bidimensional, que esta compuesto por un conjunto de datos homogéneos señalados por dos índices. Podremos asimilar los elementos de un array bidimensional a los elementos de una tabla que disponga de varias filas y varias columnas, es decir, el número de elementos será (filas x columnas). Por tanto para referirse a un elemento situado en la fila f y en la columna c, emplearemos la expresión NOMBRE(f,c).

5.4 LOS DIAGRAMAS DE FLUJO.

Emplear para la construcción de algoritmos, los diagramas de flujo, puede resultar muy ilustrativo, incluso podría decirse que hasta conveniente. Sin embargo hay que tener en cuenta que para determinadas cuestiones o bien cuando intentamos abordar la construcción de algoritmos complejos, el método de los diagramas de flujo pueden incluso resultar comprometedores en el sentido de llevarnos a más confusión y añadir cierta rigidez en los diseños.

Por este motivo no se procederá aquí a un estudio pormenorizado del empleo de los diagramas

de flujo, aunque intentaremos siempre incluir junto a nuestros desarrollos de pseudocódigo, el diagrama de flujo correspondiente, de forma que pueda verse el efecto ilustrativo de los mismos.

Los diagramas de flujo estarán constituidos por una serie de símbolos, en los que se indicará la

función que desempeñan. Estos símbolos que están representados en la FIG.54A en su mayoría, van unidos entre sí por flechas que nos indican el sentido en que se desarrolla el programa. Sobre ellas podemos hacer las anotaciones que consideremos precisas.

Page 12: Microprocesador 8085 (5)  INTEL

A continuación se indica el significado de cada uno de los símbolos representados en la

mencionada figura:

• S1 Representa un proceso a ejecutar. • S2 Almacenamiento de datos interno. • S3 Es un conector empleado para cambiar de página. • S4 Proceso alternativo. • S5 Indicador de comienzo o fin. • S6 Datos almacenados. • S7 Toma de decisión. • S8 Entrada de datos manual. • S9 Producir un retraso. • S10 Datos. • S11 Operación realizada manualmente. • S12 Operación lógica Y. • S13 Acceso a un proceso ya definido. • S14 Conector de diagrama de flujo. • S15 Operación lógica O.

S1 S2 S3

S4 S5 S6

S7 S8 S9

S10 S11 S12

S13 S14 S15

FIG.54A

Page 13: Microprocesador 8085 (5)  INTEL

5.5 EJEMPLOS DE ALGORITMOS.

Ahora desarrollaremos algunos algoritmos sencillos, que nos permitirán llevar a la práctica las normas hasta ahora apuntadas. Estos algoritmos desarrollados a través de pseudocódigo serán complementados con sus correspondientes diagramas de flujo. Debemos decir que éstos no son imprescindibles en la confección de programas.

Ejemplo 1.- Leer un número de una dirección determinada y si es mayor que 12 cargarlo en un registro.

En primer lugar debemos analizar el problema detenidamente hasta entenderlo de forma correcta y poder así realizar las especificaciones y acotaciones que consideremos oportunas. Se hace referencia a una dirección de memoria, por tanto se trata de un byte que contiene el Dato buscado. Se supone que buscamos un número positivo (no dicen nada en contra). Y además añadimos que la dirección de memoria en la que se encuentra el Dato, la tenemos en el registro par HL. Además, podemos intuir que se trata de una toma de decisión sencilla ya que establece una acción a ejecutar si se cumple una condición determinada y en caso contrario no se debe hacer nada.

El algoritmo puede ser de la forma:

NOMBRE: MAYOR12 FUNCION: Leer dato memoria y almacenarlo en registro si es mayor que 12. PRECONDICIONES: HL = Dirección de memoria. POSTCONDICIONES: Resultado en el registro B.

Leer Dato de la memoria SI Dato > 12 B = Dato FIN DE SI

Fin del Programa

Page 14: Microprocesador 8085 (5)  INTEL

A continuación se muestra en la FIG.55A el diagrama de flujo correspondiente, en el que podemos ver paso a paso la ejecución del pseudocódigo. Para el seguimiento de dicho diagrama de flujo no se requiere ninguna indicación especial. Ejemplo 2.- Leer un número de una dirección de memoria determinada, si es mayor que 12 cargarlo en el registro B y en caso contrario cargarlo en el registro C. Debemos hacer un análisis de principio similar al anterior, estableciendo consideraciones similares resultando en este caso el siguiente pseudocódigo: NOMBRE: MENOR12 FUNCION: Leer dato memoria y almacenarlo en B (>12) o en C PRECONDICIONES: HL = Dirección memoria, B=0, C=0 POSTCONDICIONES: Dato en B o en C Leer Dato de la memoria SI Dato > 12 B = Dato SI NO C = Dato FIN DE SI Fin del Programa A continuación se muestra el diagrama de flujo correspondiente a este pseudocódigo, FIG.55B, donde se puede comprobar el desarrollo del programa.

INICIO

Leer Dato memoria (HL)

Dato>12

B=Dato

FIN

Si

No

FIG.55A

Page 15: Microprocesador 8085 (5)  INTEL

INICIO

Leer Dato memoria (HL)

Dato>12

B=Dato

FIN

Si

No

FIG.55B

C=Dato

Page 16: Microprocesador 8085 (5)  INTEL

Ejemplo 3.- Convertir un byte decimal en ASCII

Para desarrollar este ejemplo, analizamos como siempre todos los datos que nos proporcionan en el enunciado. Vemos que en principio nos piden una conversión de código sin imponernos ningún tipo de restricción ni condicionamiento adicional. Como sabemos, los dígitos decimales son 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 siendo su representación en binario realizada con 4 bits. Como en cada byte disponemos de 8 bits, suponemos que el byte decimal contiene dos dígitos decimales, el primero en los cuatro bits menos significativos y el segundo en los cuatro bits más significativos. Por consiguiente, tendremos que separar el byte en dos partes para tratarlas independientemente y construir las equivalencias a código ASCII de cada una de ellas. Como las representaciones ASCII se realizan con palabras de ocho bits, el resultado será obtenido en dos bytes. Supondremos que el byte que contiene el dato decimal, se encuentra en una dirección de memoria determinada, a la que apunta el valor asignado a DIREDAT. Además, almacenaremos el resultado también en memoria a partir de la dirección señalada por DIRERES. Si observamos los códigos binarios de los dígitos decimales y sus equivalentes ASCII (ver la tabla de equivalencias que a continuación se presenta), notaremos que únicamente se diferencian en los cuatro bits más significativos. DIGITO BINARIO ASCII 0 0000 0011 0000 1 0001 0011 0001 2 0010 0011 0010 3 0011 0011 0011 4 0100 0011 0100 5 0101 0011 0101 6 0110 0011 0110 7 0111 0011 0111 8 1000 0011 1000 9 1001 0011 1001

No tendremos más que, dejar los cuatro bits que representan la cifra decimal, en la parte baja del nuevo byte a construir y en la parte alta de dicho byte situar el código 0011, para que automáticamente se obtenga el equivalente ASCII buscado. Basándose en estas consideraciones previas obtendremos el pseudocódigo siguiente:

NOMBRE: ASCII1 FUNCION: Convertir byte decimal a ASCII PRECONDICIONES: DIREDAT = Dirección Dato

DIRERES = Dirección resultado POSTCONDICIONES: Resultado en DIRERES y DIRERES+1 Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits menos significativos de DATO Intercambiar los 4 bits de mayor peso con los 4 de menor peso del Dato Agregar 0011 a la parte alta del Dato Guardar Dato en memoria apuntada por DIRERES Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits más significativos de Dato Agregar 0011 a la parte alta del Dato Guardar Dato en memoria apuntada por DIRERES+1 Fin del Programa

Page 17: Microprocesador 8085 (5)  INTEL

A continuación se muestra en la FIG.55C, el diagrama de flujo correspondiente a este ejercicio. En él pueden apreciarse con claridad la forma de llevar a cabo todas las operaciones de modo secuencial. Suele ser corriente expresar varias operaciones dentro de un mismo bloque de operación. (Como vemos, cuando en el diagrama de flujo no se hace referencia a DIREDAT sino al registro par HL, se está haciendo la equivalencia HL=DIREDAT)

Ejemplo 4.- Convertir un byte hexadecimal a ASCII. En este ejercicio se nos plantea un simple proceso de conversión a código ASCII, de un valor

escrito en un byte según el código hexadecimal. Puesto que las representaciones en hexadecimal se realizan con los símbolos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F, siendo sus equivalentes binarios obtenidos con cuatro bits, suponemos que en un byte hexadecimal están contenidos dos dígitos hexadecimales. Será por tanto, preciso separar el byte del Dato en dos partes (parte más significativa y parte menos significativa) y buscar la representación ASCII de cada una de ellas.

Supondremos además que el byte que contiene el dato pertenece a una dirección de memoria

apuntada por DIREDAT. Y la solución pedida, es decir, los dos caracteres ASCII pedidos, serán almacenados en la memoria en las direcciones señaladas por DIRERES y DIRERES+1.

Por tratarse de valores hexadecimales, para efectuar la conversión a ASCII, tendremos que

añadir 0011 0000B si se trata de un valor menor que 10, o bien añadir 0011 0111B si se trata de un valor mayor o igual que 10.

INICIO

Leer Dato Memoria (HL)

Dato=XXXX 0000

Dato=0000 XXXX

Dato=0011 XXXX

Guardar Dato en DIRERES

Leer Dato Memoria (HL)

Dato=0000 YYYY

Dato=0011 YYYY

Guardar Dato en DIRERES+1

FIN

FIG.55C

Page 18: Microprocesador 8085 (5)  INTEL

Teniendo en cuenta todas estas consideraciones, podemos obtener el siguiente pseudocódigo: NOMBRE: ASCII2

FUNCION: Convertir byte hexadecimal a ASCII PRECONDICIONES: DIREDAT = Dirección Dato DIRERES = Dirección resultado POSTCONDICIONES: Resultado en DIRERES y DIRERES+1 Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits menos significativos de DATO Intercambiar los 4 bits de mayor peso con los 4 de menor peso del Dato Ir a ASCII Guardar Dato en memoria apuntada por DIRERES Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits más significativos de Dato Ir a ASCII Guardar Dato en memoria apuntada por DIRERES+1 Fin del Programa

NOMBRE: ASCII FUNCION: Calcula el equivalente ASCII PRECONDICIONES: Dato está disponible POSTCONDICIONES: Dato = Valor en ASCII SI Dato<10 Dato=Dato+30H SI NO Dato=Dato+37H FIN DE SI

Volver

Page 19: Microprocesador 8085 (5)  INTEL
Page 20: Microprocesador 8085 (5)  INTEL

A continuación se muestra el diagrama de flujo correspondiente al pseudocódigo propuesto (FIG.55D). En él, destacan las llamadas a la subrutina ASCII, que se realizan en dos ocasiones.

Ejemplo 5.- Llenar una zona de memoria RAM con el mismo dato. La tarea que debemos resolver en este caso, consiste en llenar una zona de la memoria RAM con

un mismo Dato. Puesto que no nos indican nada acerca de los límites de la zona a tratar, nosotros supondremos que el principio de la misma viene señalado por PRIRAM. Del mismo modo, supondremos que el número de elementos de la RAM a tratar está marcado por NUMDAT.

Hechas estas consideraciones iniciales, debemos fijarnos que tendremos que realizar un bucle que se repita un determinado número de veces y mediante el cual realicemos las operaciones de almacenaje adecuadas. Para ello, tendremos que emplear un contador que nos señale el final del bucle y nos permita abandonar o finalizar el programa. Teniendo en cuenta todo lo anterior se desarrolla el siguiente pseudocódigo:

NOMBRE: LLENARAM

FUNCION: Almacenar en una zona de RAM el mismo Dato PRECONDICIONES: Conocemos PRIRAM, NUMDAT y Dato POSTCONDICIONES: Zona de RAM con mismo Dato

Tomar Dato a almacenar Iniciar Contador = NUMDAT Apuntar al principio de la zona de RAM (PRIRAM) MIENTRAS Contador>0 Almacenar Dato en RAM Apuntar a la siguiente dirección de RAM Decrementar Contador FIN DE MIENTRAS Fin de Programa

INICIO

Leer Dato Memoria (HL)

Dato=XXXX 0000

Dato=0000 XXXX

Ir a ASCII

Guardar Dato en DIRERES

Leer Dato Memoria (HL)

Dato=0000 YYYY

Ir a ASCII

Guardar Dato en DIRERES+1

FIN

FIG.55D

ASCII

INICIO

Dato<10

Volver

Si No

Dato=Dato+30H

Dato=Dato+37H

SA

LT1

Page 21: Microprocesador 8085 (5)  INTEL

A continuación se presenta, como en los ejercicios anteriores, el diagrama de flujo, que nos puede orientar sobre el desarrollo del programa. (FIG.55E).

INICIO

Tomar Dato a almacenar

Contador = NUMDAT

Apuntar a dirección de RAM (PRIRAM)

Contador > 0

Si

No

FIN

Almacenar Dato

Incrementar dirección de RAM

Contador = Contador - 1

FIG.55E

Page 22: Microprocesador 8085 (5)  INTEL

Ejemplo 6.- Realizar una suma decimal de varios dígitos. Con este ejercicio se llevará a cabo la suma de dos números decimales de varias cifras. Puesto

que no nos dicen nada en el enunciado, supondremos que se trata de números de ocho cifras. Los números a sumar (los sumandos) se encuentran almacenados en la memoria RAM expresados según el sistema decimal (BCD). Puesto que en cada byte disponemos de ocho bits, podemos tener representadas dos cifras decimales en cada byte, por lo que para completar las ocho cifras de cada número se necesitarán cuatro bytes por número.

La dirección donde se encuentra almacenado el primer byte del primer sumando, vendrá dada

por SUM1 y el resto en direcciones consecutivas. La dirección del primer byte del segundo sumando, estará dada por SUM2 y el resto en direcciones consecutivas. El resultado de la operación será almacenado en las direcciones del primer sumando, por tanto, éste se perderá.

Necesitamos desarrollar un bucle que sume los cuatro bytes representativos de cada número.

Para realizar este proceso, es preciso iniciar un Contador que nos permita establecer el final del bucle. El pseudocódigo propuesto es el siguiente: NOMBRE: SUMA

FUNCION: Suma dos números decimales de 8 cifras cada uno PRECONDICIONES: Primer sumando en SUM1

Segundo sumando en SUM2 POSTCONDICIONES: El resultado se almacena en lugar de SUM1

Apuntar a SUM1 Apuntar a SUM2 Iniciar Contador = 4 MIENTRAS Contador > 0 Sumar bytes SUM1+SUM2 Ajuste decimal Guardar resultado en SUM1

Apuntar a SUM1+1 Apuntar a SUM2+1 Contador = Contador – 1 FIN DE MIENTRAS Fin del Programa En la FIG.55F se representa el diagrama de flujo correspondiente a este pseudocódigo y en él

puede apreciarse el desarrollo o flujo de las órdenes a ejecutar por la computadora o sistema.

Page 23: Microprocesador 8085 (5)  INTEL

Ejemplo 7.- Desarrollar una temporización. En este caso nos piden desarrollar una subrutina o un programa de temporización. No se nos

indica cuánto tiempo se debe permanecer en este estado, por lo que será una característica que impondremos nosotros. Tampoco se dice nada acerca de qué debe hacer el microprocesador durante ese tiempo.

El programa básicamente consistirá en desarrollar un bucle o ciclo que se repita durante un tiempo, o un determinado número de veces, y en el que el microprocesador “no haga nada”. Es decir, estableceremos un tiempo de espera. Como se ha hecho en otras ocasiones se establecerá un Contador que nos señale el final del bucle y por tanto el final del tiempo de espera.

Según las condiciones expresadas, tendremos el siguiente pseudocódigo: NOMBRE: TEMPORIZ

FUNCION: Realiza un tiempo de espera PRECONDICIONES: Conocemos el dato del Contador POSTCONDICIONES: Ninguna

Iniciar el Contador MIENTRAS Contador > 0 No hacer nada Decrementar Contador FIN DE MIENTRAS Final del Programa

INICIO

Apuntar a SUM1Apuntar a SUM2

Contador = 4

Contador > 0

FIN

No

Si

Sumar SUM1+SUM2

Ajuste decimal

Almacenar resultado en SUM1

Apuntar a SUM1+1Apuntar a SUM2+1

Contador = Contador - 1

FIG.55F

Page 24: Microprocesador 8085 (5)  INTEL

En la FIG.55G se muestra el diagrama de flujo.

INICIO

Iniciar Contador

Contador > 0

Si

No

FIN

No hacer nada

Contador = Contador - 1

FIG.55G

Page 25: Microprocesador 8085 (5)  INTEL

Ejemplo 8.- Mover un bloque de memoria RAM. En este ejercicio se llevará a cabo la traslación de un bloque o conjunto de datos almacenados en

una zona de memoria RAM, que llamaremos zona ORIGEN, hacia otra zona de memoria RAM que llamaremos zona DESTINO. Los datos de la zona ORIGEN, deben ser trasladados y situados en el mismo orden. Los datos que se encuentren almacenados en la zona DESTINO, se perderán. Debemos tener en cuenta que existe la posibilidad de que las zonas ORIGEN y DESTINO se encuentren superpuestas. Esto planteará un problema añadido que debe ser resuelto, de lo contrario, podrían perderse determinados datos de la zona ORIGEN. Para ello tendremos que conocer de forma precisa el número de elementos de la zona ORIGEN que deseamos mover. A este número le llamaremos NUM.

Con estos tres valores, ORIGEN, DESTINO y NUM, podremos saber si existe superposición o

no. Para ello calcularemos la diferencia entre DESTINO y ORIGEN, para después compararla con NUM. Si no existe este problema, se procederá a mover datos de la zona ORIGEN a la zona DESTINO hasta completar el proceso. En caso de que sí exista superposición se cambiarán los punteros de ORIGEN y DESTINO a las posiciones finales de sus respectivas zonas para comenzar a mover los datos partiendo del final hacia el principio hasta completar todos el proceso.

Debemos considerar además la posibilidad de que las posiciones de ORIGEN y DESTINO

coincidan, en este caso daremos por finalizado el proceso ya que no será necesario mover ningún dato. El pseudocódigo que debemos plantear puede ser el siguiente: NOMBRE: MOVERDAT

FUNCION: Traslada datos de una zona de RAM a otra zona de RAM PRECONDICIONES: Conocemos ORIGEN, DESTINO y NUM POSTCONDICIONES: Datos cambiados de ORIGEN a DESTINO Datos iniciales de DESTINO perdidos

Apuntar a ORIGEN Apuntar a DESTINO Contador = NUM SI Contador = 0 Final del Programa FIN DE SI SI DESTINO = ORIGEN Final del Programa FIN DE SI Diferencia entre DESTINO y ORIGEN Comparar Diferencia con NUM SI no hay superposición MIENTRAS Contador > 0 Leer Dato de ORIGEN Almacenar Dato en DESTINO ORIGEN = ORIGEN + 1 DESTINO = DESTINO + 1 Contador = Contador – 1 FIN DE MIENTRAS Final del Programa FIN DE SI ORIGEN = ORIGEN + NUM DESTINO = DESTINO + NUM MIENTRAS Contador > 0 ORIGEN = ORIGEN – 1 DESTINO = DESTINO – 1 Leer Dato de ORIGEN Almacenar Dato en DESTINO Contador = Contador –1 FIN DE MIENTRAS Final del Programa

Page 26: Microprocesador 8085 (5)  INTEL

A continuación se muestra el diagrama de flujo correspondiente FIG.55H

INICIO

Apuntar a ORIGENApuntar a DESTINO

Contador = NUM

Contador = 0Si

No

ORIGEN=DESTINO

Si

No

Diferencia entre DESTINO y ORIGENComparar Diferencia con NUM

Superposición NoSi

Contador > 0

Si

No

Leer Dato de ORIGENAlmacenar Dato en DESTINO

ORIGEN=ORIGEN+1DESTINO=DESTINO+1

Contador=Contador-1

ORIGEN=ORIGEN+NUMDESTINO=DESTINO+NUM

Contador>0 No

Si

ORIGEN=ORIGEN-1DESTINO=RESTINO-1

Leer Dato de ORIGENAlmacenar Dato en DESTINO

Contador=Contador-1FIN

FIG.55H

Page 27: Microprocesador 8085 (5)  INTEL

5.5 EJERCICIOS. 1. Definir el algoritmo. Elementos que lo componen. Características de los algoritmos. 2. ¿Cuáles pueden ser las principales características de un buen algoritmo?. 3. Definir las distintas acciones del pseudocódigo. 4. Los diagramas de flujo. Dibuja los símbolos que recuerdes indicando su significado. 5. ¿Qué son las precondiciones y las postcondiciones?. 6. Expresar la estructura básica de un algoritmo. 7. ¿Qué son las estructuras de datos?. 8. Definir las decisiones y los bucles mostrando sus estructuras. 9. Modificar el Ejemplo 1 desarrollado en este tema, de modo que el dato leído quede almacenado en

una dirección de memoria, en el caso de que sea menor que 12. 10. Diseñar un algoritmo que almacene los números consecutivos del 0 al 9 a partir de la dirección

8000H hacia arriba. 11. Diseñar un algoritmo que sume dos números almacenados en dos direcciones de memoria

determinadas y guarde el resultado en otra dirección de la RAM. 12. Diseñar los diagramas de flujo correspondientes a los dos ejercicios anteriores.

Page 28: Microprocesador 8085 (5)  INTEL

En nuestro próximo número:En nuestro próximo número:En nuestro próximo número:En nuestro próximo número: Desarrollo de programas básicos.Desarrollo de programas básicos.Desarrollo de programas básicos.Desarrollo de programas básicos. El lenguaje ensamblador.El lenguaje ensamblador.El lenguaje ensamblador.El lenguaje ensamblador. Instrucciones ejecutables en ensamblador.Instrucciones ejecutables en ensamblador.Instrucciones ejecutables en ensamblador.Instrucciones ejecutables en ensamblador. Las directivas en ensLas directivas en ensLas directivas en ensLas directivas en ensambladorambladorambladoramblador Las subrutinasLas subrutinasLas subrutinasLas subrutinas Ejemplos de subrutinasEjemplos de subrutinasEjemplos de subrutinasEjemplos de subrutinas Errores corrientes programando en ensambladorErrores corrientes programando en ensambladorErrores corrientes programando en ensambladorErrores corrientes programando en ensamblador EjerciciosEjerciciosEjerciciosEjercicios