Académique Documents
Professionnel Documents
Culture Documents
LA PROGRAMACIN
Algoritmo
Pseudocdigos
Estructuras de datos
Diagramas de flujo
Ejemplos de algoritmos
Ejercicios
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/
Todos los contenidos e imgenes publicados en la revista microprocesadores tienen los derechos
reservados quedando prohibida la reproduccin total o parcial de esta publicacin sin el consentimiento
expreso de su autor.
5. LA PROGRAMACIN.
Planteamos aqu la base de la programacin estructurada que nos ayudar a construir programas
ms o menos complejos, que se apoyarn en unidades o bloques ms elementales para a partir de ellos
obtener otros ms largos y complicados. Se obtendrn algoritmos que no dependern en absoluto de
ningn lenguaje de programacin en concreto y que posteriormente sern convertidos al lenguaje deseado
en cada caso (para nosotros el ensamblador).
El proceso de programacin 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 cuestin. Esto lleva implcita la disminucin de errores durante el proceso programador, por
lo que se facilita enormemente la tarea.
El algoritmo debe ser construido mediante la especificacin de un proceso que muestre de forma
clara la relacin entre los estados iniciales y los estados o resultados finales. Los elementos que
componen una especificacin son fundamentalmente:
Las especificaciones que se realicen deben ser claras y precisas de forma que no quede lugar a
ambigedades y deben ser propuestas de la forma ms general posible. Puede suceder que en
determinados algoritmos no sea necesario exponer de forma explcita todos los elementos de la
especificacin.
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 ejecucin en otro punto del programa que nos interese.
Podremos tambin en circunstancias concretas, establecer determinados bloques o conjuntos de
instrucciones que se repitan cclicamente un estipulado nmero de veces, incluso determinadas partes del
programa podrn ejecutarse o no en funcin de que se cumplan ciertos condicionamientos.
Fundamentalmente debemos conseguir que todos los algoritmos construidos renan las
siguientes caractersticas:
En ocasiones puede ser interesante utilizar una mezcla de dos mtodos, siempre que nos facilite
la tarea de programar. Nosotros emplearemos los diagramas de flujo siempre que sea posible y el
pseudocdigo, todo ello con vistas al paso posterior, que ser la codificacin del algoritmo en lenguaje
ensamblador.
Hay que recordar que este procedimiento empleado en la creacin de los algoritmos no siempre
puede seguir una estructura rgida, debiendo adaptarnos al problema concreto que estemos tratando.
Al objeto de ir concretando algo ms sobre los aspectos que nosotros trataremos finalmente para
la puesta en funcionamiento de nuestro sistema, debemos indicar que:
Puede decirse, por tanto, que la estructura bsica de un algoritmo ser del tipo que a
continuacin se muestra:
NOMBRE:
FUNCION:
PRECONDICIONES:
POSTCONDICIONES:
VARIABLES:
..............................................
..............................................
..............................................
..............................................
FINAL
Sin embargo este proceso de composicin secuencial no proporciona los medios adecuados o
suficientes para desarrollar algoritmos que nos exijan un mnimo de complejidad. Disponemos entonces
de una serie de acciones o mecanismos que nos permiten variar o modificar el desarrollo de una secuencia
en funcin de alguna caracterstica determinada. Entre estas acciones destacan:
Las decisiones: Constituyen una nueva estructura que nos permite ejecutar o no, una parte del
programa, atendiendo a determinada condicin. Este tipo de estructura responde a la siguiente notacin:
SI condicin
Instruccin 1
Instruccin 2
Instruccin 3
....................
Instruccin N
FIN DE SI
Al ejecutar el programa, cuando se llega a este punto condicional, nuestro microprocesador
comprobar si se cumple la condicin. Si la respuesta es positiva se ejecutan las instrucciones
pertenecientes al condicional SI (Instruccin 1, Instruccin 2, ..., Instruccin N) y a continuacin prosigue
con el resto del programa que exista despus de FIN DE SI. En caso de que no se cumpla la condicin, no
se ejecutarn las instrucciones del condicional SI y el microprocesador continuar la ejecucin del
programa que sigue a FIN DE SI. (Debemos recordar ahora algunas de las instrucciones del 8085 y
fijarnos que la comprobacin de la condicin por parte del microprocesador est basada en la inspeccin
de los flags o sealizadores).
En ocasiones se necesita no solo elegir si vamos a desarrollar un proceso o no, sino que
deseamos realizar un proceso u otro segn una determinada condicin. Es decir, estamos ante estructuras
que nos permiten elegir entre dos procesos distintos. Dichas acciones responden a la siguiente notacin:
SI condicin
Instruccin 1
Instruccin 2
....................
Instruccin N
SI NO
Instruccin N+1
Instruccin N+2
......................
Instruccin 2N
FIN DE SI
Estas situaciones condicionales (tomas de decisin) pueden estar anidadas, es decir, entre las
instrucciones que hay dentro de estos lazos, puede haber otras instrucciones de tomas de decisin,
obteniendo estructuras cada vez ms complejas, pero que nos proporcionan mayor flexibilidad, del tipo:
SI condicion1
Instruccin 1
Instruccin 2
SI condicin2
Instruccin a
Instruccin b
Instruccin c
FIN DE SI
SI NO
Instruccin 3
Instruccin 4
FIN DE SI
Los bucles: Tambin denominados ciclos, son estructuras que nos permiten la ejecucin de una
serie de instrucciones un determinado nmero de veces que depende del estado o condicin inicial. Los
bucles constituyen lo que llamaremos composiciones iterativas. Estn compuestos bsicamente por una
condicin inicial y el cuerpo del bucle, respondiendo a la siguiente notacin:
MIENTRAS condicin
Instruccin 1
Instruccin 2
.....................
Instruccin N
FIN DE MIENTRAS
Cuando nos encontremos ante una estructura de este tipo, si se cumple la condicin inicial, se
ejecutar el cuerpo del bucle (Instruccin 1, Instruccin 2, ..., Instruccin N) hasta que deje de cumplirse
la condicin, momento en el que pasarn a ejecutarse las instrucciones que van despus de FIN DE
MIENTRAS. Si la condicin inicial no se cumple no se entra en el ciclo y se contina despus de FIN DE
MIENTRAS.
Para recorrer un array debemos conocer con anterioridad el nmero total de elementos que lo
componen y emplear un ciclo de repeticin que responda a la estructura siguiente:
Adems del array unidimensional, podemos hacer referencia tambin al array bidimensional, que
esta compuesto por un conjunto de datos homogneos sealados 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 nmero 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 expresin NOMBRE(f,c).
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 pseudocdigo, el diagrama
de flujo correspondiente, de forma que pueda verse el efecto ilustrativo de los mismos.
Los diagramas de flujo estarn constituidos por una serie de smbolos, en los que se indicar la
funcin que desempean. Estos smbolos que estn representados en la FIG.54A en su mayora, 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.
S1 S2 S3
S4 S5 S6
S7 S8 S9
FIG.54A
NOMBRE: MAYOR12
FUNCION: Leer dato memoria y almacenarlo en registro si es mayor que 12.
PRECONDICIONES: HL = Direccin de memoria.
POSTCONDICIONES: Resultado en el registro B.
INICIO
No
Dato>12
Si
B=Dato
FIN
FIG.55A
Ejemplo 2.- Leer un nmero de una direccin de memoria determinada, si es mayor que 12
cargarlo en el registro B y en caso contrario cargarlo en el registro C.
NOMBRE: MENOR12
FUNCION: Leer dato memoria y almacenarlo en B (>12) o en C
PRECONDICIONES: HL = Direccin memoria, B=0, C=0
POSTCONDICIONES: Dato en B o en C
No
Dato>12
Si
B=Dato C=Dato
FIN
FIG.55B
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 conversin de cdigo sin imponernos ningn tipo de
restriccin ni condicionamiento adicional.
Supondremos que el byte que contiene el dato decimal, se encuentra en una direccin de
memoria determinada, a la que apunta el valor asignado a DIREDAT. Adems, almacenaremos el
resultado tambin en memoria a partir de la direccin sealada por DIRERES.
Si observamos los cdigos binarios de los dgitos decimales y sus equivalentes ASCII (ver la
tabla de equivalencias que a continuacin se presenta), notaremos que nicamente se diferencian en los
cuatro bits ms significativos.
No tendremos ms 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 cdigo 0011, para que automticamente se
obtenga el equivalente ASCII buscado.
NOMBRE: ASCII1
FUNCION: Convertir byte decimal a ASCII
PRECONDICIONES: DIREDAT = Direccin Dato
DIRERES = Direccin resultado
POSTCONDICIONES: Resultado en DIRERES y DIRERES+1
INICIO
Dato=XXXX 0000
Dato=0000 XXXX
Dato=0011 XXXX
Dato=0000 YYYY
Dato=0011 YYYY
FIN
FIG.55C
(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)
En este ejercicio se nos plantea un simple proceso de conversin a cdigo ASCII, de un valor
escrito en un byte segn el cdigo hexadecimal. Puesto que las representaciones en hexadecimal se
realizan con los smbolos 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 estn contenidos dos dgitos
hexadecimales. Ser por tanto, preciso separar el byte del Dato en dos partes (parte ms significativa y
parte menos significativa) y buscar la representacin ASCII de cada una de ellas.
Supondremos adems que el byte que contiene el dato pertenece a una direccin de memoria
apuntada por DIREDAT. Y la solucin pedida, es decir, los dos caracteres ASCII pedidos, sern
almacenados en la memoria en las direcciones sealadas por DIRERES y DIRERES+1.
Por tratarse de valores hexadecimales, para efectuar la conversin a ASCII, tendremos que
aadir 0011 0000B si se trata de un valor menor que 10, o bien aadir 0011 0111B si se trata de un valor
mayor o igual que 10.
Teniendo en cuenta todas estas consideraciones, podemos obtener el siguiente pseudocdigo:
NOMBRE: ASCII2
FUNCION: Convertir byte hexadecimal a ASCII
PRECONDICIONES: DIREDAT = Direccin Dato
DIRERES = Direccin 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 ms 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
A continuacin se muestra el diagrama de flujo correspondiente al pseudocdigo propuesto
(FIG.55D). En l, destacan las llamadas a la subrutina ASCII, que se realizan en dos ocasiones.
INICIO
INICIO
Dato=XXXX 0000
Dato=0000 XXXX Si No
Dato<10
Ir a ASCII
SALT1
Dato=Dato+30H
Guardar Dato en DIRERES
Dato=Dato+37H
Leer Dato Memoria (HL)
Dato=0000 YYYY
Ir a ASCII
Volver
FIN
FIG.55D
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 lmites de la zona a tratar, nosotros
supondremos que el principio de la misma viene sealado por PRIRAM. Del mismo modo, supondremos
que el nmero 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 nmero de veces y mediante el cual realicemos las operaciones de
almacenaje adecuadas. Para ello, tendremos que emplear un contador que nos seale el final del bucle y
nos permita abandonar o finalizar el programa. Teniendo en cuenta todo lo anterior se desarrolla el
siguiente pseudocdigo:
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
INICIO
Contador = NUMDAT
No
Contador > 0
Si
FIN
Almacenar Dato
Contador = Contador - 1
FIG.55E
Ejemplo 6.- Realizar una suma decimal de varios dgitos.
Con este ejercicio se llevar a cabo la suma de dos nmeros decimales de varias cifras. Puesto
que no nos dicen nada en el enunciado, supondremos que se trata de nmeros de ocho cifras. Los nmeros
a sumar (los sumandos) se encuentran almacenados en la memoria RAM expresados segn 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 nmero se necesitarn cuatro
bytes por nmero.
La direccin donde se encuentra almacenado el primer byte del primer sumando, vendr dada
por SUM1 y el resto en direcciones consecutivas. La direccin del primer byte del segundo sumando,
estar dada por SUM2 y el resto en direcciones consecutivas. El resultado de la operacin 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 nmero.
Para realizar este proceso, es preciso iniciar un Contador que nos permita establecer el final del bucle.
NOMBRE: SUMA
FUNCION: Suma dos nmeros 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
Apuntar a SUM1
Apuntar a SUM2
Contador = 4
No
Contador > 0
Si
FIN
Sumar SUM1+SUM2
Ajuste decimal
Apuntar a SUM1+1
Apuntar a SUM2+1
Contador = Contador - 1
FIG.55F
En este caso nos piden desarrollar una subrutina o un programa de temporizacin. No se nos
indica cunto tiempo se debe permanecer en este estado, por lo que ser una caracterstica que
impondremos nosotros. Tampoco se dice nada acerca de qu debe hacer el microprocesador durante ese
tiempo.
El programa bsicamente consistir en desarrollar un bucle o ciclo que se repita durante un
tiempo, o un determinado nmero 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 seale el final del bucle y por tanto el final del tiempo de espera.
Iniciar el Contador
MIENTRAS Contador > 0
No hacer nada
Decrementar Contador
FIN DE MIENTRAS
Final del Programa
En la FIG.55G se muestra el diagrama de flujo.
INICIO
Iniciar Contador
No
Contador > 0
Si
FIN
No hacer nada
Contador = Contador - 1
FIG.55G
Ejemplo 8.- Mover un bloque de memoria RAM.
Con estos tres valores, ORIGEN, DESTINO y NUM, podremos saber si existe superposicin o
no. Para ello calcularemos la diferencia entre DESTINO y ORIGEN, para despus 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 superposicin se cambiarn 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.
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 superposicin
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
A continuacin se muestra el diagrama de flujo correspondiente FIG.55H
INICIO
Apuntar a ORIGEN
Apuntar a DESTINO
Contador = NUM
Si
Contador = 0
No
Si
ORIGEN=DESTINO
No
Si Superposicin No
ORIGEN=ORIGEN+NUM
DESTINO=DESTINO+NUM
No
Contador > 0
Si
ORIGEN=ORIGEN-1 ORIGEN=ORIGEN+1
DESTINO=RESTINO-1 DESTINO=DESTINO+1
Contador=Contador-1
FIN
FIG.55H
5.5 EJERCICIOS.
4. Los diagramas de flujo. Dibuja los smbolos que recuerdes indicando su significado.
9. Modificar el Ejemplo 1 desarrollado en este tema, de modo que el dato ledo quede almacenado en
una direccin de memoria, en el caso de que sea menor que 12.
10. Disear un algoritmo que almacene los nmeros consecutivos del 0 al 9 a partir de la direccin
8000H hacia arriba.
11. Disear un algoritmo que sume dos nmeros almacenados en dos direcciones de memoria
determinadas y guarde el resultado en otra direccin de la RAM.
12. Disear los diagramas de flujo correspondientes a los dos ejercicios anteriores.
En nuestro prximo nmero:
Desarrollo de programas bsicos.
El lenguaje ensamblador.
Instrucciones ejecutables en ensamblador.
Las directivas en ensamblador
ensamblador
Las subrutinas
Ejemplos de subrutinas
Errores corrientes programando en ensamblador
Ejercicios