guia de microprocesadores ujap

70
1 Prof. Yomarvys Osorio GUÍA Nº 1 GENERALIDADES SOBRE MICROPROCESADORES Sistemas Digitales Un sistema digital puede definirse como un conjunto de componentes interconectados que procesan información en forma digital. La mayoría de dispositivos que encontramos en nuestra vida diaria son sistemas digitales: calculadoras, computadores, relojes, máquinas de oficina, etc. Un sistema digital genérico puede esquematizarse como en la figura 1, este consta de una serie de elementos para la entrada, salida, procesamiento, control y almacenamiento de información. Los enlaces o relaciones entre estos elementos se establecen a través de caminos de señal, por ejemplo cables, que llevan o transmiten información digital entre un punto y otro. Entrada Almacena -miento Procesa- miento Almacena -miento Salida CONTROL Transmisión Figura 1. Estructura de un Sistema Digital Sistema Digital con Microprocesador Un sistema digital con microprocesador, está formado por tres bloques funcionalmente independientes como se muestra en la figura 2. Una unidad de entrada y salida, una unidad central de procesamiento (CPU) y una memoria.

Upload: luis-jeronimo-teran-yajurez

Post on 01-Dec-2015

79 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Guia de Microprocesadores Ujap

1 Prof. Yomarvys Osorio

GUÍA Nº 1

GENERALIDADES SOBRE MICROPROCESADORES

Sistemas Digitales

Un sistema digital puede definirse como un conjunto de componentes interconectados que procesan

información en forma digital. La mayoría de dispositivos que encontramos en nuestra vida diaria son sistemas

digitales: calculadoras, computadores, relojes, máquinas de oficina, etc.

Un sistema digital genérico puede esquematizarse como en la figura 1, este consta de una serie de

elementos para la entrada, salida, procesamiento, control y almacenamiento de información. Los enlaces o

relaciones entre estos elementos se establecen a través de caminos de señal, por ejemplo cables, que llevan o

transmiten información digital entre un punto y otro.

Entrada Almacena

-miento

Procesa-

miento

Almacena

-miento Salida

CONTROL

Transmisión Figura 1. Estructura de un Sistema Digital

Sistema Digital con Microprocesador

Un sistema digital con microprocesador, está formado por tres bloques funcionalmente independientes

como se muestra en la figura 2. Una unidad de entrada y salida, una unidad central de procesamiento (CPU) y

una memoria.

Page 2: Guia de Microprocesadores Ujap

2 Prof. Yomarvys Osorio

Unidad

de

Entrada

Unidad

de

Salida

Unidad de E/S

Memoria

RAM

Memoria

ROM

Unidad de Memoria

Unidad

de

Control

Unidad

Aritmética

Lógica

CPU

Figura 3. Estructura General de un Sistema Digital con Microprocesador

A su vez, la unidad de entrada y salida se divide en un bloque de entrada y un bloque de salida. Del mismo

modo, la CPU se divide en una unidad de control y una unidad aritmético-lógica (ALU), y la memoria en ROM

y RAM, obteniéndose seis bloque o unidades con funciones muy específicas.

Unidad de Entrada: Esta parte del circuito recibe información del mundo exterior, procedente de un

operador humano o un fenómeno físico (temperatura, velocidad, etc.)

Unidad de Salida: La función de esta parte del circuito, es entregar la información binaria, ya procesada,

al mundo exterior.

Unidad de memoria: En la unidad de memoria se almacenan programas y datos, es una de las partes más

importantes del sistema. Se distinguen dos tipos: La memoria de solo lectura (ROM), es donde se escribe el

programa o lista de instrucciones del sistema. La memoria de lectura y escritura (RAM), en esta se almacena

información como datos o resultados que utiliza el sistema, y si es necesario se puede cambiar en cualquier

momento.

Unidad Central de Procesamiento (CPU): Es la que reúne a la unidad de control y la unidad aritmético-

lógica (ALU) en un solo bloque. En la práctica la CPU se encuentra en forma de un circuito integrado llamado

microprocesador. La unidad de control se encarga de la interpretación y ejecución de las instrucciones del

programa, también controla todos los componentes del sistema por medio de líneas de conexión, enviando

señales de coordinación a estos. La unidad aritmético-lógico como su nombre lo indica está encargada de

realizar solo las operaciones lógicas y aritméticas.

El Microprocesador

Fueron creados en 1975. Es un circuito integrado que procesa o manipula la información almacenada en la

memoria datos y/o instrucciones. Sus ccaracterísticas principales son:

Page 3: Guia de Microprocesadores Ujap

3 Prof. Yomarvys Osorio

• Es un sistema digital abierto, es decir se tiene acceso a sus buses.

• Requiere de RAM externa de gran capacidad (Mbytes).

• Memoria de programa muy extensa.

• Requiere un decodificador por dispositivo y por puerto externo.

• Velocidades de operación de hasta Giga/Tera MIPS.

• Son de uso y propósito general.

• Costo de desarrollo e implementación elevado.

• Gran dificultad para el desarrollo / implementación.

• Tendencia a la centralización de las tareas.

• Capacidad de realizar multitareas no limitadas.

• Muchos modos de direccionamiento.

• Casi todos tiene un set de instrucciones complejo (CISC).

Desde el punto de vista conceptual, un microprocesador ideal es un dispositivo digital que lee datos

aplicados a N líneas de entrada, los procesa de acuerdo a las instrucciones secuenciales de un programa

almacenado en su memoria y escribe los resultados del proceso en M líneas de salidas. En la figura 3 se

representa el modelo idealizado de un microprocesador.

1

2

3

.

.

.

N

1

2

3

.

.

.

M

P

r

o

g

r

a

m

a

Figura 3. Microprocesador Ideal

Los datos de entrada provienen de interruptores, sensores, teclados, A/D, etc. Los datos de salida

dirigidos a actuadores, pantallas, impresoras, D/A, etc. El programa almacenado determina como deben

ser procesados los datos de entradas y que información debe ser enviadas a las salidas. El programa se

auxilia de una memoria que almacena los datos que procesa, ya que, en ciertas partes del programa su

lógica no depende solo de los datos de entradas si no también del historial de las entradas hasta ese

momento.

Mientras que en un microprocesador ideal no hay limitaciones de entradas/salidas en un microprocesador

real el número de entradas/salidas es limitado, incluso utilizan las mismas líneas para las entradas/salidas de

Page 4: Guia de Microprocesadores Ujap

4 Prof. Yomarvys Osorio

datos. Adicionalmente un microprocesador real tiene una cantidad de memoria limitada para datos e

instrucciones por lo que requiere comunicarse con una memoria externa, esto por medio de unas líneas

adicionales llamadas de direccionamiento. Finalmente el microprocesador real requiere sincronizar su operación

con los elementos externos, como la memoria, por lo tanto necesita de líneas de control.

Estructura de Buses de un Microprocesador

En electrónica digital, un bus, es simplemente un conjunto de conductores en paralelo que llevan una

información común (instrucciones, datos, direcciones, señales de control, etc.) de un lugar a otro del sistema.

En la figura 4 se indica la forma de representar los dos tipos de buses más comunes en electrónica digital,

como lo son el unidireccional que solo puede llevar o solo puede traer información y el bidireccional que puede

llevar y traer información. El número de líneas se escribe al inicio, al final o dentro del mismo. El

microprocesador requiere de los Buses para conectarse con los elementos externos.

Bus de 8 líneas

[8]

Sistema

Digital

Sistema

Digital

[8]

Sistema

Digital ó

8

ó

8

y

Bus unidireccional Bus bidireccional Figura 4. Representación de Buses

Estructura de Buses de un microprocesador: En la figura 5 se muestra la estructura de buses generalizada

de un microprocesador, externamente este cuenta con un bus de datos, un bus de direcciones y un bus de control,

además de estos tres buses principales también dispone de un bus de alimentación, el cual hace llegar la

corriente de la fuente a sus distintos componentes.

Bus de Direcciones

Bus de Datos E/S

Entradas de Control

Salidas de Control

Bus de Control

Fuente de Alimentación

Figura 5. Estructura de Buses de un Microcontrolador Generalizado

Page 5: Guia de Microprocesadores Ujap

5 Prof. Yomarvys Osorio

Bus de Datos: Lleva datos e instrucciones en forma bidireccional, es decir, desde y hacia el

microprocesador. Las instrucciones provienen siempre de la memoria, los datos pueden provenir o ir a la

memoria o a los dispositivos de entrada/salida. En general el número de entradas es igual al número de salidas,

este número define la “longitud de palabra” de datos del microprocesador, las longitudes de palabra mas

comunes son de 4, 8, 16, 32 y 64 bits. En la figura 6, se muestra un microprocesador de ocho bits (1 byte),

representado como unidireccional con entradas y salidas independientes (a) y como bidirecional, las mismas

líneas como entradas y salidas controladas por dos señales (b), lo que reduce el número de pines de datos a la

mitad.

a) Bus unidireccional

8 8

ó

8

IN D7-D0

OUT D7-D0

S1

S0

S1 S0

0 0

0 1 1 0

1 1

Impedir transferencia al Bus

Salida hacia el Bus Entrada desde el Bus

No hacer

ACCIÓN

a) Bus bidireccional Figura 6. Microprocesador con un Bus de Datos de Ocho Bits

Bus de Direcciones: Contiene la información necesaria para seleccionar la posición de una memoria o de

una unidad de entrada/salida o un registro particular de la misma. El número disponible de estas líneas determina

el “tamaño máximo de memoria” o “espacio de memoria” que puede manejar un microprocesador.

Ejemplos:

1) Si un microprocesador tiene una longitud de palabra de 8 bits (1 byte) y un bus de direcciones de 16

bits, entonces el espacio de memoria que es capaz de manejar el microprocesador será de:

216

bytes = 65536 bytes = 64 Kbyte. (1 K = 1024)

Es decir puede manejar una memoria de 65536 direcciones de 8 bits cada una.

2) Si un microprocesador tiene una longitud de palabra de 16 bits (1 word) y un bus de direcciones de 20

bits, entonces el espacio de memoria que es capaz de manejar el microprocesador será de:

220

word = 1048576 word = 1 Mword.

Es decir puede manejar una memoria de 1048576 direcciones de 16 bits cada una.

En resumen para un microprocesador de 8 bits, con un bus de direcciones de 16 bits, el espacio de

memoria puede visualizarse como un mapa de 65536 recintos, que son las direcciones, y cada uno contiene 1

byte, siendo la más baja 0000H y la mas alta FFFFH, como se muestra en la figura 7a.

Page 6: Guia de Microprocesadores Ujap

6 Prof. Yomarvys Osorio

Adicionalmente la memoria puede dividirse de varias forma, en la figura 7b se muestra el mapa de una

memoria dividida en segmentos, los cuales se incrementan en 1000H cada 4k (4096) recintos de espacio de

memoria.

La memoria puede dividirse también en páginas como se muestra en la figura 7c, cada pagina tiene 256

recintos y cubre 100H direcciones de memoria, es decir que tiene 4 páginas en 1 k de memoria. La página menos

significativa iria desde 0000H hasta 00FFH, la siguiente desde 0100FH a 01FFH y así sucesivamente.

1000 0000

3000 2000

5000 4000

7000 6000

9000 8000

B000 A000

E000 C000

a) Mapa de Memoria

FFFF

FFFE

FFFD

0002

0001

0000

64 K

FFFF F000

b) Segmentación

4 K

1000

0C00

0800

0400

0000

0100 1 Página

1 K

c) Paginación Figura 7. Espacio de Memoria

Bus de Control: Contienen la información que envía o recibe el microprocesador hacia o desde los

elementos del sistema para sincronizar sus operaciones. El número de líneas del bus de control es variable y

depende del microprocesador en particular. En la figura 8 se muestra un conjunto típico de líneas de control

disponibles en la mayoría de los microprocesadores.

CLK OUT CLK IN

RESET OUT RESET IN

INTP OUT INTP IN

HOLDA HOLD

WRITE

READ

Figura 8. Señales Típicas de un Bus de Control en un Microprocesador

Page 7: Guia de Microprocesadores Ujap

7 Prof. Yomarvys Osorio

CLK IN: Entrada de reloj, pulsos de reloj para producir secuencias de tiempo y control para las funciones

internas del microprocesador.

CLK OUT: Salida de reloj, es usado por los módulos externos para sincronizar sus operaciones con el

microprocesador.

RESET IN: Petición de reset, es usado para reiniciar al microprocesador.

RESET OUT: Reconocimiento de reset, informa al resto de los módulos que el P esta en reset.

INTP IN: Petición de interrupción, el dispositivo externo conectado solicita al microprocesador que

sea atendido.

INTP OUT: Reconocimiento de interrupción, el microprocesador indica por esta señal, que va a

atender la interrupción.

HOLD: Petición de Bus, se utiliza para suspender la operación del microprocesador y llevarlo a un

estado llamado hola donde todos sus buses se colocan en alta impedancia

HOLDA: Garantía de Bus, informa que la petición de bus ha sido atendida.

READ: Lectura, informa que el bus de datos está en modo de entrada y entonces el microprocesador

aceptara datos del bus.

WRITE: Escritura, informa que el bus de datos está en modo de salida y entonces el microprocesador

suministrará datos al bus.

Organización de un Sistema Basado en Microprocesador

En la figura 9 se muestra la estructura organizativa de un sistema típico basado en microprocesador. Note

que consta de cuatro elementos principales: una memoria, un microprocesador o CPU, un puerto de entrada y un

puerto de salida. Estos elementos pueden estar incluidos en una misma pastilla “microcontroladora”. Sin

embargo, para este curso, asumiremos que todos ellos son componentes separados.

El microprocesador está conectado a todos los otros componentes a través del bus de datos. Las señales

del bus de control, conjuntamente con las del bus de direcciones determinan que elementos se comunican con el

microprocesador en un momento dado. Estos tres buses configuran el bus del sistema y el gobierno del mismo es

responsabilidad del microprocesador.

La secuencia de instrucciones que constituyen el programa que debe ejecutar el microprocesador están

almacenadas en un área de la memoria. En el momento de arrancar el sistema, el microprocesador sitúa en el bus

de direcciones la dirección de la posición de memoria donde se encuentra la primera instrucción. Como

resultado, la memoria sitúa esta información en el bus de datos.

Page 8: Guia de Microprocesadores Ujap

8 Prof. Yomarvys Osorio

Después de interpretar y ejecutar la primera instrucción, el microprocesador busca la siguiente instrucción,

la ejecuta y así sucesivamente. La generación de la serie de instrucciones necesarias para que el microprocesador

realice una tarea determinada es lo que se denomina su “programación”.

El “puerto de entrada” constituye el puente de comunicación entre el microprocesador y los datos

suministrados por teclados, sensores, conversores A/D, interruptores y otros dispositivos de entrada similares.

Normalmente, cuando un puerto de entrada tiene en su poder un dato válido, se lo hace saber al microprocesador

a través de una línea de control destinada para este propósito.

El “puerto salida” le permite al microprocesador transferir datos hacia dispositivos de salida como

pantallas, impresoras, conversores D/A, relés, solenoides, motores, lámparas, etc.

Figura 9. Diagrama de Bloque de un Sistema Basado en Microprocesador

MEMORIA DE

PROGRAMA

MICRO

PROCESADOR

PUERTO

DE

ENTRADA

PUERTO

DE

SALIDA

DISPOSITIVOS

DE ENTRADA

DISPOSITIVOS

DE SALIDA

BUS DE DATOS

PUERTO

DE

SALIDA

BUS DE DIRECCIONES

BUS DE CONTROL Y SINCRONIZACIÓN DEL SISTEMA

Page 9: Guia de Microprocesadores Ujap

9 Prof. Yomarvys Osorio

Comparación de la Arquitectura de un Microprocesador con la de un Microcontrolador

Arquitectura

Sus partes principales son:

Bloque de control: Encargado de seleccionar la secuencia de acciones de cada elemento del

micro. Tiene circuitos para generar sincronismo, reloj, señales de control, entradas de interrupción, etc.

ALU: Unidad encargada de todas las operaciones lógicas-aritméticas. Es un circuito

combinacional sin capacidad de almacenamiento. Consta de dos entradas, donde se le presentan los

operandos, y dos salida, una para el resultado y la otra de indicadores de la clase de resultado. Para

poder operar a la ALU se le asocia el Acumulador, las Banderas y líneas de control.

Memoria de programa: Es el área de memoria donde se almacenan, ordenadas, las instrucciones

a seguir. Es una memoria ROM, PROM, EPROM, etc.

Memoria de trabajo es el área de memoria donde se puede escribir y leer, para guardar

cualquier dato variable durante la ejecución del programa. Es una memoria RAM.

Banco de Registros para guardar información o datos importantes, de mayor frecuencia de uso o

Memoria de

Programa

ROM

Memoria de

Dato

RAM

Reg. Bandera

Banco de Registros Reg, Acumulador

ALU

Registro de Instrucciones

Contador de Programa

Bloque de Control

Decodificador de

Instrucciones

Generador de

Sincronismo Reg. de Direcciones

Periféricos

Page 10: Guia de Microprocesadores Ujap

10 Prof. Yomarvys Osorio

para guardar la configuración de funcionamiento. Pueden o no formar parte del mapa de memoria

RAM.

Bus de Datos DB. Todos los elementos que manejan datos están interconectados por estas líneas

físicas que recorren todo el sistema.

Bus de Control CB. Son señales que se encargan de comandar el funcionamiento de cada

elemento. Aunque cada bit del bus tiene diferente significado o destino, igual comparten la finalidad de

controlar.

Bus de Direcciones AB. Son las líneas que seleccionan, con que registro de la memoria se va a

trabajar o cual puerto periférico activar

Acumulador es el registro que actúa en conjunto con la ALU. Le suministra uno de los

operandos o es destino del resultado. La mayoría de las instrucciones lo usan como destino o fuente de

datos.

Bandera es el registro que guarda la información sobre la clase de resultado. También puede

guardar información sobre el estado del programa.

Registro de Instrucciones en el se guarda la instrucción mientras se la interpreta e implementa la

secuencia de acciones a realizar.

Contador de Programa es un registro que guarda la posición de la próxima instrucción a

ejecutar.

Registro de Direcciones es el registro para guardar la información sobre la posición de memoria

con la cual se esta trabajando. De el nace el AB.

Puertos o Periféricos son dispositivos que comunican el sistema con el mundo exterior.

Se toma de una instrucción a la vez, desde la memoria de programa, y se guarda en el registro de

instrucciones. Esta acción se llama FETCH.

Desde ahí el bloque de control la decodifica y ejecuta los pasos indicados por ese comando.

Genera la secuencia indicada por la instrucción. El bloque de control se une a todos los elementos del

sistema mediante el bus de control. Sincroniza todas las acciones de los componentes del micro.

También dirige las acciones de los dispositivos del sistema. Por comodidad solo se dibuja la sección

más relevante.

Page 11: Guia de Microprocesadores Ujap

11 Prof. Yomarvys Osorio

Mediante el contador de programa (PC) se sabe que instrucción ejecutara a continuación. Este

contador es seteable. El bloque de control, si la instrucción lo exige, varía el valor del PC.

La memoria es direccionada por el registro de direcciones, que se le conecta por el bus de

direcciones, e intercambia datos mediante el bus de datos.

La conexión hacia el exterior ya sea para tomar o entregar datos se realiza a través de los puertos

o periféricos. Estos sirven de acopladores entre el sistema y el exterior.

Según cuantas partes estén dentro de un solo chip se habla de procesador, microprocesador o

microcontrolador.

Características

Son dispositivos electrónicos digitales sincrónicos programables:

Son digitales por que manejan señales discretas. Es decir con solo dos valores posibles, 1 o 0.

Por lo tanto, la escritura de una salida o lectura de una entradas solo se realiza en forma

pulsante.

Son sincrónicos debido a que todas sus acciones están acompasadas por una oscilación de

referencia o señal de RELOJ (CK).

Son programables pues para funcionar además de la alimentación y señales externas necesitan

de un programa que dirija sus acciones.

Ejecutan una instrucción por vez, pero algunos procesan más de una al mismo tiempo.

Superponen la ejecución de una instrucción con la búsqueda y almacenaje en el Reg de

Instrucciones de la siguiente.

Pueden verificar una condición y determinar entre dos posibles respuestas. Ahí es donde se

presenta la supuesta inteligencia de un micro.

Trabajan con baja tensión y corriente. De ahí la necesidad de periféricos para interactuar con

el exterior.

Clasificación

Según la cantidad de bit de los datos que maneja el micro u opera su ALU. Pueden ser de

micros 8, 10, 16, 32, 64, etc bits.

Según la organización de la memoria del sistema puede ser:

Page 12: Guia de Microprocesadores Ujap

12 Prof. Yomarvys Osorio

VON NEWMAN se usa un solo bus de datos y direcciones para la memoria de datos y

programa.

HARVARD cada área de memoria tiene su bus de datos y direcciones.

Según la arquitectura del sistema que pueden formar se dicen de:

ARQUITECTURA CERRADA su sistema solo se puede tener lo que el fabricante suministra.

No es posible agregarle RAM, ROM, u otros periféricos.

ARQUITECTURA ABIERTA pueden formar sistemas de varias configuraciones de RAM,

ROM o periféricos.

La diferencia esta en si el micro tiene o no los buses accesibles al usuario. Eso esta relacionado

con el número de pines del chip. Por cada línea de los buses necesitan un pin.

Según el set de instrucciones, puede ser:

SET EXTENDIDO, las instrucciones pueden ser de una o varias palabras. Y va a tener

instrucciones muy complejas, potentes o redundantes.

SET REDUCIDO, las instrucciones serán básicas. Para compensar una instrucción potente se

necesitan varias básicas.

El set de instrucciones es determinado por el fabricante, el cual usa las mismas para cada familia

de dispositivos y le hace pequeñas variaciones según cada elemento.

Según la cantidad de memoria del sistema. La cantidad de memoria ROM nos habla de lo

complejo que podrá ser el programa y la cantidad de memoria RAM de la capacidad de manejar

variables.

Ejemplo:

ROM

RAM

CPU

ROM RAM

CPU

Page 13: Guia de Microprocesadores Ujap

13 Prof. Yomarvys Osorio

El PIC16F84A, Es un microcontrolador con CPU de 8 bit, arquitectura Harvard cerrada y un set

de instrucciones reducido (RISC).

Sistemas con Microcontroladores

Dispositivos

de

Entrada

Dispositivos

de

Salida

Microcontrolador

Programa

Diagrama general de un Sistema Microcontrolado

Interruptores Microcontrolador

Programa

Algunos dispositivos que pueden formar parte de un sistema microcontrolado

Teclados

Sensores

Transductores

Led’s

Displays

Relés

Parlantes

Dispositivos de Entrada Dispositivos de Salida

Page 14: Guia de Microprocesadores Ujap

14 Prof. Yomarvys Osorio

CPU

Idea General de un Microcontrolador

RAM

ROM

Puerto

IN

Puerto

OUT

Entradas Salidas

+5 V

Circuito

externo de

reloj

Gnd

Componentes Especiales de un Microcontrolador

Microcontrolador

Interrupciones

Salida PWM

Interrupciones

Comunicación

serial RS-232

Temporizador

/ Contador

Memoria

EEPROM

Funciones adicionales en los Microcontroladores

Principales Familias de Microcontroladores

Referencia Memoria RAM Memoria ROM Timers

8051 4 K 128 2

8052 8 K 256 3

8031 Externa 128 2

8032 Externa 256 3

8751 4 K (Eprom) 128 2

Familia 80XX de INTEL

Page 15: Guia de Microprocesadores Ujap

15 Prof. Yomarvys Osorio

Referencia Memoria RAM Memoria ROM Timers Otros

68HC05C4 4 K 176 1

68HC0508 8 K 176 1

68HC05C2 2 K 176 1

68HC705C4 4 K (Eprom) 176 1

68HC705K1 504 32 y 64 1

68HC05BM 2 K 176 1_mejorado Convertidor_A/D

Familia 68XX de MOTOROLA

Referencia Memoria RAM Memoria ROM Pines O/I Otros

16C54 512 32 12

16C57 2 K 80 20

16C61 1 K 48 12 Interrupción

16C71 1 K 48 12 Convertidor_A/D

16C84 1 K (EEprom) 48 12

12C509 1 K 48 6

Familia PIC16CXX de MICROCHIP

Page 16: Guia de Microprocesadores Ujap

16 Prof. Yomarvys Osorio

EL MICROPROCESADOR 8085

Distribución De Pines Del 8085

El 8085 es un potente microprocesador paralelo de 8 bits fabricado por INTEL con tecnología NMOS

(MOS de anal N). En la figura 1, se muestra la distribución de pines de este chip, disponible en dos versiones:

estándar y de alta velocidad.

Figura 1. Distribución de Pines del 8085

La primera se designa como 8085A y opera a 3 MHz. La segunda se designa 8085A-2 y opera a 5 MHz.

La frecuencia de operación se establece mediante un cristal, una red RC o un reloj externos.

Externamente, el 8085 cuenta con un bus de datos de 8 bits y un bus de direcciones de 16 bits

parcialmente multiplexado sobre el bus de datos, Esta última característica le permite direccionar hasta 216

=

65536 bytes de memoria.

En la figura 2 se muestra la agrupación de los 40 pines del 8085 en las siguientes categorías:

Un bus de datos/direcciones multiplexado de (8) líneas (AD7-AD0).

Un bus de direcciones de ocho (8) líneas (Al5-A8).

Un bus de control de interrupciones de seis (6) líneas (INTR, TRAP, RST 5.5, RST 6.5, RST 7.5,

INTA).

Un bus de comunicación serie de dos (2) líneas (SID, SOD).

Un bus de señales de control de once (11) líneas (ALE, RD, WR, IO/M, SO, S1, READY, HOLD,

HLDA, RESET IN, RESET OUT).

Un bus de señales de reloj de tres (3) líneas (Xl, X2, CLK).

Un bus de alimentación de dos (2) líneas (VCC, GND).

Page 17: Guia de Microprocesadores Ujap

17 Prof. Yomarvys Osorio

8 Bus de direcciones

8 Bus de datos/dirección

Control de direcciones

Selección de lectura

Selección de escritura

Habilitación de M – E/S

Estado ciclo máquina

Posición de DMA

Conformidad en DMA

Posición de espera

2 Alimentación y tierra

Puesta a cero

2

Reloj

5 Control de

interrupciones

Puerta de E/S serial

µP

8085 Bus de control

Figura 2. Diagrama Funcional del 8085

Las líneas Vcc (positivo, pin 40) y Vss ó GND (negativo, pin 20) constituyen el bus de alimentación. El

8085 puede operar con tensiones de alimentación entre 4,75 V y 5,25V. El voltaje nominal de trabajo es 5 V. El

consumo máximo de corriente es del orden de 170 mA.

Las líneas de entrada X1 (pin 1) y X2 (pin 2) son los terminales de conexión del cristal de cuarzo o la red

RC externa que maneja el generador interno de pulsos de reloj. La señal de reloj resultante se obtiene en la línea

de salida CLK (pin 37). La entrada Xl puede ser también controlada por una señal de reloj externa. En este caso,

la frecuencia de salida es la mitad de la frecuencia de entrada. En la figura 3 se muestran algunas

configuraciones típicas de circuitos de reloj para el 8085.

a) Cristal de Cuarzo b) Red RC (3 MHz) c) Reloj Externo (1 – 6 MHz)

Figura 3. Configuraciones Típicas de Circuitos de Reloj para el 8085

Las líneas tri-state unidireccionales de salida A8 (pin 21) hasta A15 (pin 28) constituyen la parte alta del

bus de direcciones. Transportan los 8 bits más significativos de la dirección de memoria. Estas líneas se pueden

conectar directamente al bus de direcciones del sistema sin necesidad de circuitería adicional.

Las líneas tri-state AD0 (pin 12) hasta AD7 (pin 19) constituyen el bus multiplexado de datos y

direcciones. Durante el primer ciclo de una instrucción, estas líneas son unidireccionales y transportan los 8 bits

menos significativos (A0-A7) de la dirección de memoria o de entrada/salida seleccionada. Durante el segundo y

tercer ciclos, estas líneas son bidireccionales y se convierten en el bus de datos de 8 bits del sistema.

La salida ALE (Address Latch Enable: habilitador del registro de direcciones, pin 30) informa a la

circuitería externa la naturaleza de la información presente en el bus de datos y direcciones. Específicamente,

ALE se hace alta cuando el microprocesador envía través de las líneas AD0-AD7 los 8 bits menos significativos

de la palabra de dirección. Esto sucede durante el primer ciclo de reloj de una instrucción. La información

respectiva (los 8 bits menos significativos de la palabra de dirección) puede almacenarse en un o registro

externo, como se muestra en la figura 4. En este caso, la señal ALE habilita el registro, permitiendo que el dato

de las líneas AD7-AD0 se transfiera a las salidas A7-A0. Durante el segundo y tercer ciclos, la línea ALE

Page 18: Guia de Microprocesadores Ujap

18 Prof. Yomarvys Osorio

permanece inactiva, es decir en bajo, y por tanto el registro ignora la información de datos (D0-D7) que circula

por el bus común.

Figura 4. Separación de los Buses de Datos y Direcciones en el 8085

Las salidas S0 (pin 29), Sl (pin 33) e IO/M (pin 34) informan sobre el estado (status) de las operaciones

realizadas por el microprocesador. Específicamente, un alto en la línea IO/M indica una operación de lectura o

escritura desde o hacia un puerto de entrada/salida y un bajo en la misma línea indica una operación de lectura o

escritura desde o hacia una posición de memoria.

Del mismo modo, S1 y S0 informan sobre el tipo de ciclo en progreso. Específicamente, S1S0=00 indica

que el microprocesador se encuentra en estado halt, es decir detenido, S1S0=01 indica que está realizando una

operación de lectura, S1S0=10 indica que esta realizando una operación de escritura y S1S0=11 indica que

está realizando la búsqueda de un op-code o código de instrucción.

La salida tri-state RD (read: lectura, pin 32), activa en bajo, indica que el microprocesador está realizando

una operación de lectura desde la posición de memoria o el puerto de entrada seleccionado por el bus de

direcciones y que el bus de datos esta disponible para la transferencia de información.

La salida tri-state WR (write: escritura, pin 31), activa en bajo, indica que el microprocesador está

escribiendo la información presente en el bus de datos en la posición de memoria o el puerto de salida

seleccionado por el bus de direcciones.

La entrada READY (listo, pin 35) se utiliza para comunicar el 8085 con dispositivos de entrada/salida o

de memoria relativamente lentos, es decir con tiempos de acceso inferiores a los de trabajo del microprocesador.

Normalmente, con dispositivos rápidos la línea READY se mantiene activa todo el tiempo para indicar que el

microprocesador está preparado para enviar o recibir datos. Si READY se hace alta durante un ciclo de lectura o

escritura, el microprocesador entiende que la memoria o el periférico está listo para enviar o recibir datos. Si

READY es de nivel bajo, el microprocesador entra en un estado de espera hasta que las señales del dispositivo

externo indiquen que este ultimo está listo para transmitir o recibir datos.

La entrada HOLD (pin 39) le indica al 8085 que un dispositivo externo solicita los buses de datos,

direcciones y control. Al recibir la señal HOLD, el microprocesador completará las transferencias de datos

actuales en los buses y situará las líneas de datos, direcciones, lectura, escritura e IO/M en estado de alta

impedancia, permitiendo que el dispositivo externo asuma el control del bus del sistema.

La salida HLDA (Hold Acknowledge: reconocimiento de hold, pin 38) indica a la circuitería externa que

el microprocesador ha recibido una petición de HOLD y que los buses quedarán liberados en el siguiente ciclo

de reloj. La señal HLDA se desactiva luego de haberse removido la señal de HOLD. Medio ciclo después el

microprocesador retorna el control de los buses.

Page 19: Guia de Microprocesadores Ujap

19 Prof. Yomarvys Osorio

La entrada INTR (Interrupt Request: petición de interrupción, pin 10) se usa como línea de interrupción

de propósito general. Puede ser enmascarada (ignorada) por software y posee la más baja prioridad. En

combinación con la salida INTA (lnterrupt Acknowledge: reconocimiento de interrupción, pin 11) y el bus de

datos, puede atender varios dispositivos periféricos.

La línea TRAP (pin 6) se utiliza como entrada para una señal de interrupción llamada trap, la cual obliga

al microprocesador a parar la ejecución de su programa para atender los requerimientos del dispositivo externo

que activa dicha señal. Su prioridad es la más alta y no puede ser enmascarada por el microprocesador. Esta línea

se utiliza principalmente en situaciones de emergencia, por ejemplo una falla en el sistema de alimentación.

Las líneas RST 7.5 (pin 7). RST 6.5 (pin 8) y RST 5.5 (pin 9) son las entradas de las llamadas

interrupciones enmascarables. Su función es idéntica a la de la interrupción TRAP pero, a diferencia de ésta,

pueden ser enmascaradas por el software que ejecuta la CPU. Cada una de estas líneas están asociadas a un flip-

flop habilitador de interrupciones interno que se puede inspeccionar y alterar utilizando instrucciones especiales.

El enmascaramiento se refiere a esta circunstancia. Las cinco líneas de interrupción anteriores tienen una

prioridad fija de atención. Esto significa que si en un momento dado hay dos o más de estas señales activas,

solamente será atendida la que tenga la más alta prioridad. El orden de prioridad, de mayor a menor, de estas

líneas es TRAP, RST 7.5, RST 6.5, RST 5.5 e INTR. Cada uno de estos pines sólo puede ser utilizado por un

dispositivo externo.

La línea RESET IN (entrada de reset, pin 36), activa en bajo, inicializa el contador de programa en 0’s y

borra los flip-flops internos de habilitación de interrupciones y de reconocimiento de hold. Sitúa también los

buses de datos y direcciones y las líneas tri-s tate del microprocesador en estado de alta impedancia. Esta

situación se mantiene mientras la línea de entrada RESET IN sea baja.

Figura 5. Circuito de Reset para el 8085

La línea RESET OUT (salida de reset, pin 3), activa en alto, informa a la circuitería externa que el

microprocesador se encuentra en estado de reset. Se utiliza generalmente como señal general de reset del sistema

y está sincronizada con la señal de reloj (CLK OUT) del microprocesador.

Las líneas SOD (Serial Output Dala: salida serie de datos, pin 4) y SID (Serial Input Data: entrada serie de

datos, pin 5) se utilizan para transferir información binaria desde y hacia dispositivos externos de comunicación

serie. Estos terminales se controlan por software utilizando dos instrucciones denominadas RIM y SIM.

Características Eléctricas

Es importante conocer las características eléctricas de un microprocesador para garantizar que trabaje

dentro de límites seguros. En la figura se resumen algunos parámetros eléctricos notables del 8085 según

especificaciones de su fabricante (INTEL).

La exposición a condiciones máximas durante períodos prolongados puede afectar seriamente la

confiabilidad del dispositivo o causar daños irreversibles en su estructura interna.

+ 5

Vcc

Reset

1 µF

75

1N91

4 RESET

IN

Page 20: Guia de Microprocesadores Ujap

20 Prof. Yomarvys Osorio

Símbolo Parámetro Mínimo Máximo Unidad Condiciones

de prueba

TA Temperatura 0 70 ºC

Vcc Alimentación 4,75 5,25 Volt

VIL Voltaje de entrada bajo -0,5 +0,8 Volt

VIH Voltaje de entrada alto 2,0 Vcc +0,5 Volt

VOL Voltaje de salida bajo 0,45 Volt IOL = 2 mA

VOH Voltaje de salida alto 2,4 Volt IOL=400 uA

Icc Corriente de alimentación 170 mA

IOL Corriente máxima en bajo 2 mA

IHL Corriente máxima en alto 400 uA

Arquitectura Interna Del 8085

La organización interna (arquitectura) del microprocesador 8085 se encuentra representada en la

figura 1. El 8085 es una CPU de 8 bits porque su bus de datos es de 8 bits y su unidad aritmético-lógica (ALU)

esta diseñada para operar con palabras de 8 bits. La ALU, entre otras funciones, puede incrementar o

decrementar una cantidad binaria, realizar operaciones lógicas corno AND, OR y XOR y aritméticas como

adición, sustracción o comparación con palabras de 8 bits.

Page 21: Guia de Microprocesadores Ujap

21 Prof. Yomarvys Osorio

Figura 1. Arquitectura del 8085

El bus interno de datos sirve como medio de comunicación entre los diferentes bloques y está conectado

por medio del acoplador o buffer tri-state de datos y direcciones al bus externo del mismo nombre.

Conectados a este bus interno se encuentran 6 registros de propósito general designados como B, C, D, E,

H y L, los cuales pueden operar individualmente como registros de 8 bits o como registros pares de 16 bits. En

este último caso, B y C conforman el registro BC, D y E el registro DE y H y L el registro HL. Existen

instrucciones diferentes para manejar los registros en forma individual o por parejas. El registro B, por ejemplo,

puede utilizarse solo para almacenar un byte de datos y acompañado del registro C para almacenar una palabra

de datos o de dirección de 16 bits.

El más importante registro de uso general es el acumulador (A), un registro especial de 8 bits que retiene

una de las cantidades a ser operada por la ALU y recibe el resultado de una operación realizada por la misma. La

información del acumulador (A) junto con la suministrada por los cinco flip-flops de banderas constituyen la

llamada “palabra de estado del procesador o PSW” (Processor Status Word). Estos flip-flops se consideran

como parte de un registro de 8 bits llamado “registro de estado”, mostrado en detalle en la figura 2. Después de

la ejecución de cada instrucción aritmética o lógica, los flip-flops del registro de estado se cargan con un 0

(reset) o un 1 (set) para indicar condiciones propias de la operación realizada.

Banderas (Flag)

S Z AC P CY

De Acarreo De Paridad De Auxiliar de acarreo

Page 22: Guia de Microprocesadores Ujap

22 Prof. Yomarvys Osorio

De Cero De Signo

Figura 2. Registro de Estados del 8085

La función de las banderas se puede resumir en los siguientes términos:

La bandera de acarreo (CY) se coloca en 1 cuando al realizar una suma se produce un acarreo (carry) de

los dos bits más significativos o cuando en una resta se produce un préstamo (borrow) al efectuar la diferencia

de los dos bits de más peso.

La bandera indicadora de paridad (P) se coloca en 1 si el dato almacenado en el acumulador es de

paridad par, es decir tiene un número par de 1’s, y en 0 si es de paridad impar, es decir tiene un número impar de

l’s.

La bandera auxiliar de acarreo (AC) se hace alta (1) para indicar que se produjo un acarreo desde el bit 3

del acumulador, de la misma manera que CY indica un acarreo desde el bit 7. El flag AC se conoce también

como bandera señalizadora de arrastre BCD puesto que indica, en una operación de adición o sustracción de

cantidades BCD, que debe hacerse un ajuste decimal con el fin de mantener el resultado en formato BCD.

La bandera de cero (Z) se hace alta para indicar que la operación previamente ejecutada es igual a cero,

es decir, el acumulador o el registro que guarda el resultado ha quedado cargado con 0’s. Mientras esto no

suceda, la bandera Z permanece en 0.

La bandera de signo (S) es una copia del bit 7 del acumulador, es decir adopta la condición del MSB

después de la ejecución de una instrucción aritmética lógica. Una bandera de signo alta (1) representa un

numero negativo, mientras que una bandera de signo baja (0) representa un número positivo.

Cualquiera de estas banderas puede ser usada para informarle al microprocesador que salte o bifurque el

curso normal del programa a otro programa o a otra parte del mismo. Por ejemplo, si el resultado de una

operación es cero, la bandera Z puede utilizarse para que el control del programa se transfiera a una subrutina

encargada de generar un mensaje de error.

Además del acumulador y el registro de estado, otro circuito asociado a la ALU es el registro temporal,

encargado de recibir un dato desde el bus interno de datos y retenerlo para ser procesado por la ALU. Este

registro interviene en la ejecución de mayor parte de las instrucciones aritméticas y lógicas asignadas al

microprocesador.

El apuntador de la pila (SP) es un registro de 16 bits de propósito especial que se emplea usualmente para

almacenar una dirección que da acceso a una región de la memoria conocida como pila, definida por el

programador. En la pila, el microprocesador guarda temporalmente los contenidos de todos sus registros cuando

debe transferir el control del programa a una subrutina. El manejo de la pila se discutirá en lecciones posteriores.

El contador de programa (PC) es un registro de 16 bits de propósito especial que indica la dirección

donde se encuentra almacenada el próximo byte de la instrucción a ejecutar. El contador de programa se

comunica con el exterior a través del seguro de direcciones, conectado a los acopladores de buses tal como se

indica en la figura1.

El seguro o latch de direcciones cumple dos funciones. En primer lugar, selecciona una dirección a ser

enviada desde el puntero de la pila, el contador de programa o cualquiera de los registros pares de 16 bits BC,

DE o HL. En segundo lugar, conserva esta dirección hasta que sea requerida por el bus de direcciones. Un

incrementador/decrementador incorporado permite aumentar o reducir en 1 el contenido de cualquiera de los

registros de 16 bits.

El registro de instrucciones (IR) es el encargado de retener el código de operación de la instrucción a

ejecutar con el fin de que sea interpretado por el decodificador de instrucciones y codificador de ciclos de

máquina. Una vez interpretada la instrucción, este último circuito produce, a través del bloque de control y

tiempos, la secuencia de microinstrucciones necesarias para su ejecución. En otras palabras, el código de

operación almacenado en el registro de instrucciones se convierte por medio de la circuitería interna del

Page 23: Guia de Microprocesadores Ujap

23 Prof. Yomarvys Osorio

microprocesador en una serie de señales en el bus de control externo y de operaciones internas, formando el

llamado ciclo de instrucción de la CPU. Por ejemplo, si después de capturar e interpretar el código de operación

de una instrucción esta le ordena al microprocesador una operación de suma, el decodificador reconocerá que

necesita buscar en la memoria el dato que debe ser sumado al acumulador y dirigirá la circuitería de control para

enviar otro pulso de lectura, transferir el dato al bus de datos y llevarlo al registro temporal. Una vez que se

completa la suma, la circuitería de control dirige el resultado al acumulador. A continuación incrementa el

contador de programa y envía otro pulso de lectura con el fin de conseguir el código de operación de la próxima

instrucción del programa. En la siguiente sección describiremos más en detalle la forma como el 8085 ejecuta

una instrucción.

Ejemplo de Ejecución de una Instrucción con 8085

Para comprender cabalmente el proceso seguido por el microprocesador 8085 para ejecutar una ins-

trucción debemos aclarar primero el significado de algunos términos. Inicialmente, es importante recordar que

todas las operaciones de una CPU están coordinadas y sincronizadas por una señal maestra de reloj. En el 8085,

la frecuencia de la señal de reloj es igual a la mitad de la frecuencia de oscilación del cristal colocado entre los

terminales X1 y X2. Por ejemplo, para operar un 8085A a su máxima frecuencia de trabajo (3 MHz) debe

utilizarse un cristal de 6 MHz. La unidad básica de tiempo es el estado (T), equivalente a un ciclo completo de

reloj. En el 8085 un ciclo máquina puede durar entre 3 y 6 estados. Un ciclo de instrucción del 8085, que es el

proceso de captar una instrucción de memoria y ejecutarla, consta de 2 a 5 ciclos máquina. Hay unos 10 tipos

diferentes de ciclos máquina, la mayoría de los cuales implican la transferencia de un byte a través del bus del

sistema (es decir, una operación de lectura o escritura) y algunas operaciones internas de la CPU. El número y

los tipos de ciclos de máquina utilizados dependen de la instrucción de que se trate. Aclarados estos términos,

mostraremos, mediante un ejemplo sencillo, la forma como el microprocesador 8085 busca y ejecuta sus

instrucciones. Para tal fin, consideremos la instrucción <<sumar al acumulador el byte 88>>, la cual se especifica

en lenguaje de máquina del 8085 como C6 88 y en ensamblador como ADI 88. El código de operación es,

naturalmente, C6 y él operando es 88. Para comprender cabalmente el proceso vamos a suponer que la

instrucción se encuentra almacenada a partir de la posición de memoria 2A00H. Esto implica que, al comenzar

la ejecución de la instrucción, el contador del programa se encuentra señalando a la posición 2A00H. De este

modo, el listado en lenguaje de máquina de la instrucción sería:

Dirección Contenido

2A00 C6

2A01 88

Son dos los ciclos de máquina (MC) requeridos por la instrucción ADI, tal como se muestra gráficamente

en la figura 3. El proceso se puede resumir a grandes rasgos así:

Ciclo de Instrucción

MC1

MC2

Captación de Op-Code Lectura de Memoria

T1 T2 T3 T4 T1 T2 T3

Page 24: Guia de Microprocesadores Ujap

24 Prof. Yomarvys Osorio

Leer y decodificar el Byte

del código de operación.

Incrementar el PC

Leer el Byte siguiente y

sumarlo al acumulador.

Incrementar el PC

Figura 3. Ciclo de Instrucción con 8085

En el primer ciclo de máquina (MC1) se suceden la captación del código de operación y la decodificación

de la instrucción. Durante este ciclo, la señal IO/M se hace baja (0) para indicar que se trata de una operación

realizada en la memoria. Las señales S0 y S1 se hacen altas, indicando en forma completa que el

microprocesador procederá a leer un código de operación. El contenido del registro contador de programa se

lleva a los buses a través del seguro de direcciones y los dos acopladores o buffers. La parte alta de la dirección

permanece durante tres estados en el bus de direcciones. La parte baja se mantiene durante un solo estado en el

bus de datos/direcciones. En este tiempo se activa la señal ALE, para retener la información por medio del latch

externo. Una vez presentes los 16 bits en el bus de direcciones, se activa la señal RD para indicar a la memoria

que ya puede transferir el byte direccionado al bus de datos (AD0-AD7). El código obtenido (C6) se transmite a

través del bus interno hacia el registro de instrucciones. Esto sucede durante el tercer estado (T3). En el estado

T4 se decodifica el código de operación y se incrementa en uno el contador del programa, señalando entonces el

dato a sumar. El resultado de la decodificación le indica al microprocesador el número y tipo de ciclos de

máquina que siguen a continuación (en nuestro caso un solo ciclo de lectura).

En el segundo ciclo máquina (MC2), la CPU lee el byte siguiente y lo suma al acumulador. Las señales de

control indican una lectura simple de memoria (IO/M=0; S1=1; S0=0). El contenido del contador del programa

(ya incrementado) se coloca en el bus de direcciones mediante el método descrito anteriormente y se activa

entonces la señal RD para captar el byte siguiente de la instrucción (88H). El dato es transferido, por medio del

bus interno, hacia el registro temporal. La unidad aritmético-lógica (ALU) suma los contenidos del acumulador

y el registro temporal, almacenando el resultado en el acumulador (el dato anterior se pierde). El registro de

estado se modifica de acuerdo con el resultado de la operación. El contador del programa se incrementa de

nuevo.

En algunas versiones del 8085, durante el segundo ciclo máquina sólo se completa la transferencia de

datos hacia la CPU. Para realizar la suma son necesarios uno o dos ciclos más. Sin embargo, estos ciclos de reloj

extra se solapan con el ciclo máquina de captación del código de operación de la siguiente instrucción, de forma

que la instrucción ADI sólo utiliza efectivamente dos ciclos máquina con siete estados.

Circuitos de Soporte del 8085. Sistema Mínimo

Existe un número bastante grande de circuitos de apoyo para el microprocesador 8085, entre los que se

incluyen memorias RAM, ROM y circuitos integrados de interface de entrada/salida.

Entre los más útiles circuitos de soporte del 8085 se encuentra la interface programable de periféricos

(PPI) 8255. En la figura 4 se muestran la distribución de pines y la organización interna de este chip, el cual

contiene tres puertos programables de entrada/salida de ocho bits (A, E y C). El 8255 permite la programación

independiente de sus tres puertos para que actúen como entradas, salidas o en forma bidireccional. Además, es

posible utilizar el puerto C como dos bloques de líneas de control para la transmisión asíncrona de datos por los

puertos A y E. Los modos de operación se consiguen mediante una palabra de control que se envía desde la

CPU al 8255 a través del bus dé datos.

Page 25: Guia de Microprocesadores Ujap

25 Prof. Yomarvys Osorio

a) Distribución de Pines

b) Diagrama Funcional

8 Bus de

Datos

8285

A0

A1

Selección de registro interno

WR

CS

RD

D0-D7

8

4

4

8

Puerto A

Puerto C (H)

Puerto C (L)

Puerto B

PA0-PA7

PC4-PC7

PC0-PC3

PB0-PB7

Al Mundo Exterior Al Microprocesador

Figura 4. Internas Programable (PPI) 8255

Como vimos en una sección anterior, es necesario un biestable externo para leer los bytes desde el bus

multiplexado de datos y direcciones del 8085. Se han diseñado varios circuitos de apoyo para el 8085 que

incluyen internamente el biestable de dirección. Un ejemplo de lo anterior es el circuito integrado de soporte

8155, el cual incorpora en una misma cápsula tres puertos de entrada/salida en paralelo (dos de 8 bits y uno de 6

bits). 256 bytes de memoria RAM y un temporizador programable. Dado que el 8155 puede demultiplexar

internamente sus buses de datos y direcciones, puede ser conectado directamente al bus de datos y direcciones

del 8085.

En la figura 5 se muestra el diagrama de bloques y la configuración de pines del 8155. Los puertos A, B y

C son similares en su configuración y funcionamiento a sus homólogos en el 8255. Se pueden utilizar como tres

puertos de entrada/salida independientes o con las seis líneas del puerto C como señales de petición de

interrupción y de preparación/conformidad para la transmisión de datos por los puertos A y B.

a) Distribución de Pines

b) Diagrama Funcional

Figura 5. Circuito de Soporte 8155

Page 26: Guia de Microprocesadores Ujap

26 Prof. Yomarvys Osorio

El temporizador programable del 8155 es básicamente un contador direccionable de 14 bits que cuenta

hacia abajo en respuesta a los pulsos recibidos por la línea TIMER IN (pin 3). Genera varios tipos de señales

por la línea TIMER OUT (pin 6) cuando el contador llega a algún valor definido por el programador. Las

señales generadas por el temporizador pueden ser utilizadas en el control de dispositivos de entrada/salida o para

interrumpir a la CPU. La gran ventaja que ofrece el 8155 es la posibilidad de conformar un pequeño

microcomputador sin necesidad de acudir a otros circuitos de apoyo, fuera de una unidad de programación por

medio de la cual se introducen los programas en la memoria. El sistema de la figura 6 es un claro ejemplo de

ello, en esta, muestra un sistema mínimo basado en el 8085 que nos permitirá realizar los experimentos y

ejercicios desarrollados y planteados a lo largo del presente curso.

I C 1

8 0 8 5

I C 2

8 1 5 5

Figura 6. Circuito de Soporte 8155

Un circuito de soporte similar al 8155 es el 8355, el cual combina una memoria ROM de 2048 (2K) bytes

y dos puertos de entrada/salida de 8 bits. Al igual que el 8155, el 8355 puede demultiplexar los ocho bits del bus

de datos/direcciones. Sin embargo, el 8355 debe utilizar tres líneas extra de dirección para acceder a los 2

kilohytes de memoria disponibles en su interior. En el 8355 no se dispone de las señales de conformidad o de

interrupción con que cuentan el 8155 y el 8255.

Page 27: Guia de Microprocesadores Ujap

27 Prof. Yomarvys Osorio

INTRODUCCIÓN A LA PROGRAMACIÓN DE MICROPROCESADORES

Un programa es una lista completa de instrucciones que se le proporciona al microprocesador

para que realice operaciones simples en un orden determinado. Las instrucciones que constituyen un

programa se almacenan en el sistema como patrones de 1’s y 0’s, organizados en grupos de 8, 16, 32,

etc. bits, dependiendo de la longitud de palabra de datos del microprocesador.

Para realizar las operaciones indicadas por una instrucción, el microprocesador debe comenzar

por direccionar la posición o las posiciones de memoria donde se encuentra la instrucción, captar o leer

la instrucción y decodificarla o interprétala por medio de sus circuitos internos, con el objeto de

determinar la secuencia de micro operaciones necesarias para ejecutarla, todos estos pasos constituyen

el denominado “ciclo de instrucción”.

Lenguaje de Máquina

El programa que puede ejecutar un microprocesador debe estar almacenado en forma binaria, o

sea patrones de 0’s y 1’s, en posiciones consecutivas de la memoria del sistema. El programa en forma

binaria es lo que se denomina “Lenguaje de Máquina” siendo este el único lenguaje que entiende el

microprocesador.

Estas instrucciones en código binarios pueden representarse en forma hexadecimal creando lo

que se llama “Programa o Código Objeto”, en la figura 1 se muestra un programa en lenguaje de

máquina y su código objeto equivalente, para el microprocesador INTEL 8085.

Lenguaje de Máquina Código Objeto

Direcciones Instrucciones o Datos Direcciones Instrucciones

o Datos

0000 0000 0000 0000 1011 1101 00 00 BD

0000 0000 0000 0001 0000 0001 00 01 01

0000 0000 0000 0010 1110 0110 00 02 E6

0000 0000 0000 0011 0000 1111 00 03 0F

0000 0000 0000 0100 0011 0010 00 04 32

Page 28: Guia de Microprocesadores Ujap

28 Prof. Yomarvys Osorio

0000 0000 0000 0101 0100 0000 00 05 40

0000 0000 0000 0110 0010 0000 00 06 20

0000 0000 0000 0111 0111 0110 00 07 76

Figura 1. Ejemplo de Programa en Lenguaje de Maquina y Código Objeto

La segunda columna del ejemplo, denominada “Instrucciones o Datos” consta de los códigos

tanto instrucciones ejecutables como datos o direcciones, utilizadas por el programa. Los códigos

correspondientes a las instrucciones se denominan “Códigos de Operación” o “op codes”, cada código

de operación le indica directa o indirectamente, al microprocesador, la dirección de memoria donde se

encuentra almacenado el siguiente código de operación o instrucción ejecutable, además le permite

identificar la naturaleza de las occisiones siguientes al op-code, es decir, si son datos o direcciones.

En el ejemplo anterior “BD” es el op-code correspondiente a la instrucción “CMP L” que es

comparar un registro denominado acumulador “A” y un registro denominado “L” (que forman parte de

la arquitectura del 8085), como esta instrucción no requiere de un dato directo el siguiente código del

ejemplo, “01”, corresponde a otro op-code. El op-code “01” indica al micro que debe cargar sus

registros “B” y “C” con los datos ubicados en las posiciones inmediatas al op-code, en este caso con

“E6” y “0F” que corresponden entonces a datos y no a op-code.

Conjunto de Instrucciones de un Microprocesador

El conjunto de instrucciones o códigos de operación a los cuales puede responder un

microprocesador en particular corresponde a su “Set de Instrucciones”. El número máximo de

instrucciones que puede entender cada micro depende de su palabra de datos, es decir, un micro de 8

bits puede ser capaz de interpretar 2 8

= 256 instrucciones, en la practica este numero suele ser menor,

por ejemplo el microprocesador MOTOROLA 6800 siendo de 8 bits solo tiene 197 instrucciones y el

INTEL 8085, también de 8 bits, tiene 239. Cuando se trabaja con un microprocesador es importante

conocer como funcionan cada una de sus instrucciones para poder realizar los programas.

Las instrucciones de un microprocesador pueden clasificarse en tres categorías:

- Instrucciones de transferencia de datos: Este tipo de instrucciones sirve para mover

información dentro del sistema, este movimiento puede ser dentro del microprocesador, entre este y la

memoria o bloques de entrada salida y viceversa.

- Instrucciones de procesamiento de datos: Estas instrucciones transforman la información, ya

Page 29: Guia de Microprocesadores Ujap

29 Prof. Yomarvys Osorio

sea por operaciones aritméticas o lógicas, por lo tanto hacen uso de la unidad aritmético lógica (ALU)

del microprocesador.

- Instrucciones de control de programa: Estas determinan la secuencia con que se ejecutarán las

instrucciones, permite transferir el control de una parte a otra del programa o entre subprogramas.

Lenguaje de Alto Nivel. Lenguaje Ensamblador

Un programa en lenguaje de máquina carece de sentido inmediato para un ser humano, quien sólo

ve una lista de valores numéricos sin sentido lógico. Además, la escritura de programas en lenguaje de

máquina puede resultar pesada y tediosa y está sujeta a errores. Para evitar esto, se han desarrollado

una serie de “Lenguajes de Alto Nivel” cuyo objetivo es hacer más agradable la programación de

microprocesadores y microcomputadores desde el punto de vista del usuario.

Los lenguajes de programación se pueden dividir, a grosso modo, en las siguientes jerarquías:

• Lenguajes de rnicroprogramación

• Lenguajes de máquina

• Lenguajes ensambladores

• Lenguajes de alto nivel

• Lenguajes de Microprogramación o Microprogramas: Normalmente, son invisibles para el

usuario de un microprocesador porque reside en una parte interna del mismo llamada ROM del microprograma.

El microprograma interpreta las instrucciones en lenguaje de máquina recibidas por el microprocesador y es el

responsable de generar la microinstrucciones necesarias para ejecutar correctamente cada instrucción.En algunos

microprocesadores, el usuario puede especificar la estructura del microprograma. Sin embargo, este no es el caso

general puesto que la mayoría de microprocesadores tienen un set de instrucciones fijo e inmodificable.

• El Lenguaje De Máquina (Machine Language): Como se explicó anteriormente, es la forma binaria

(patrones de 1’s y 0’s) del programa y es el único lenguaje que, en última instancia, el microprocesador puede

entender. Una forma simplificada del lenguaje de máquina es el código objeto, el cual representa cada código

binario por su equivalente hexadecimal.

• El Lenguaje Ensamblador (Assembly) y los Lenguajes de Alto Nivel (Pascal, Cobol, Basic, Etc.):

Consisten de una serie de instrucciones especiales (statements) que son más fáciles de entender por las personas

que las instrucciones en lenguaje de máquina o en código objeto.

Page 30: Guia de Microprocesadores Ujap

30 Prof. Yomarvys Osorio

Para poder ser comprendidos por el microprocesador, estas instrucciones deben ser convenidas a lenguaje

de máquina por medio de un programa de computador llamado traductor, como se ilustra en la figura 2.

Figura 2. Conversión de Lenguaje de Ensamblador o Alto Nivel a Lenguaje de Máquina

El programa traductor que conviene lenguaje ensamblador en lenguaje de máquina se denomina

“Ensamblador (Assembler)” y el que conviene lenguaje de alto nivel en lenguaje de máquina se denomina

“Compilador o Intérprete”. El lenguaje, ensamblador o de alto nivel, que entra en un traductor se denomina

“Código Fuente” y el que sale del mismo, como sabemos, se denomina “Código Objeto”.

Si las instrucciones del programa traductor están almacenadas en la memoria del computador para el cual

crea códigos en lenguaje de máquina se trata de un “Traductor Residente”. Si el programa traductor se ejecuta

sobre otra máquina y produce para la misma, códigos en lenguaje de máquina, se trata de un traductor

(compilador o ensamblador) “Cruzado o Cross-Translator”.

A continuación explicaremos los fundamentos del lenguaje ensamblador, este lenguaje es similar, en

principio, al lenguaje de máquina y utiliza el mismo conjunto de instrucciones. Es decir, es un lenguaje de

máquina traducido. Por esta razón, el ensamblador no es considerado como un lenguaje de alto nivel si se le

compara, por ejemplo, con el PASCAL el cual, por su estructura, está más orientado a las personas que a la

máquina misma. Sin embargo, el ensamblador posee varias e importantes características que hacen de un

programa escrito en este lenguaje más fácil de leer, escribir e interpretar que uno escrito en lenguaje de máquina.

Algunas de estas características claves son las siguientes:

1) En lugar de números, cada instrucción ejecutable (op-code) se representa mediante una abreviatura

llamada “Nemónico”, fácil de recordar, la cual define la operación realizada. Normalmente, un nemónico consta

de dos a cuatro letras y corresponde, usualmente, a las iniciales o la abreviatura de la palabra o palabras en inglés

que describen la instrucción. Por ejemplo, “MOV” es el nemónico de una instrucción que mueve (move) o

transfiere el contenido de de una parte del sistema microprocesador (un registro, una posición de memoria, etc.)

a otra sin modificarla. El uso de nemónicos permite al programador concentrar sus esfuerzos en la solución de su

problema particular, sin tener que preocuparse de códigos binarios de datos y direcciones y otros detalles típicos

de lenguajes de máquina.

2) Las direcciones absolutas de memoria se representan también por nemónicos llamados “Rótulos o

Código

Fuente

Programa en

Ensamblador

, Basic,

Pascal, C+,

etc.

Traductor

Ensamblador

, compilador,

intérprete,

etc.

Código

Objeto

Programa en

lenguaje de

máquina

Page 31: Guia de Microprocesadores Ujap

31 Prof. Yomarvys Osorio

Etiquetas (Labels)”, que son símbolos o grupos de símbolos que define el usuario. Algunos programas

ensambladores exigen que el primer carácter sea una letra y el rótulo en sí no tenga más de cinco o seis

caracteres de largo. Generalmente, una etiqueta termina en “dos puntos (:)”. Lo anterior obvia la necesidad de

conocer, durante la escritura del programa, la dirección específica de la memoria donde quedará almacenada la

instrucción a que hace referencia cada etiqueta. Por ejemplo, si dentro de un programa existe una instrucción de

bifurque que le ordena al microprocesador saltar a una parte del programa donde se realiza una multiplicación, la

dirección de salto puede etiquetarse como “MULT”; o similar.

3) Se pueden usar nemónicos llamados “Seudo-Códigos de Operación (Pseudo-Ops)” para facilitar la

labor de programación. Estos seudo-códigos, aunque parecen códigos de operación, no son instrucciones

ejecutables, es decir no son convertidos por el ensamblador a lenguaje de máquina. Sin embargo, proporcionan

información importante que necesita el ensamblador en el proceso de traducción. Los pseudos-ops se denominan

también “Directivas del Ensamblador”. Dos directivas o seudocódigos típicos de ensambladores 8085 son

“ORG” (origen), utilizado para indicar la ubicación de la primera instrucción ejecutable del programa y “EQU”

(equivale a...), utilizado para asignar símbolos a valores numéricos con el fin de que estos últimos posean un

significado más evidente ante nosotros. Por ejemplo la seudo instrucción “ORG 0000” le informa al ensamblador

que el programa comienza en la dirección 0000 y la seudo-instrucción “FREC EQU 74” le indica que cada vez

que se encuentre con el nemónico “FREC” debe sustituirlo por el valor numérico hexadecimal 74 (0111 0100, en

binario).

Los programas en lenguaje ensamblador deben ser escritos en una forma estándar con el fin de que puedan

ser fácilmente convenidos a lenguaje de máquina por el programa ensamblador. Desde este punto de vista, una

instrucción en lenguaje ensamblador consta de cuatro secciones o campos, como se muestra en la figura 3.

ETIQUETA OP-

CODE

OPERANDOS COMENTARIOS

BUCLE: IN 01 ;Entrar datos al puerto 1

Figura 3. Campos de una Instrucción en Emsablador

El primer campo corresponde a la etiqueta. Como se mencionó anteriormente, es un nemónico

alfanumérico de cinco o seis caracteres (siendo el primero una letra) para referirse a direcciones que no son

específicamente conocidas. Normalmente, una etiqueta termina en dos puntos (:) para separarla de los otros

campos. Ejemplos: “LOOP:”, “NAME:”, “PAZ 3:”, etc. Este campo no siempre se usa.

El segundo campo corresponde al nemónico del op-code (código de operación) de la instrucción a ser

ejecutada. Cada microprocesador tiene su propio conjunto de códigos nemónicos para designar cada una de las

Page 32: Guia de Microprocesadores Ujap

32 Prof. Yomarvys Osorio

instrucciones a las que responde. Ejemplos de op-codes para el 8085 son MVI, MOV, LXI, STA, ADD, SIJB,

SUM, DCR, ORA, CMP, DAA, JMP, CALL, RET, IN, OUT, PUSH, HALT, etc.

El tercer campo corresponde a los operandos o parámetros requeridos por la instrucción. Contiene,

separados “por comas (,)”, las designaciones de los registros y/o los datos o direcciones sobre los cuales actúa la

misma. Por ejemplo, en el lenguaje del 8085, la instrucción “MOV B, A” transfiere el contenido del registro A al

registro B. En este caso, MOV es el código de operación y A, B los operandos. A actúa como “registro fuente” y

B como “registro de destino”.

El cuarto campo corresponde a los comentarios. En esta área se escriben, entre otras cosas, notas

especiales que sirven de referencia no solamente al programador sino a cualquier persona que consulte el

programa en un futuro y explicaciones de lo que hace cada instrucción o grupo de instrucciones desde el punto

de vista de la aplicación. Los comentarios comienzan, generalmente, con un “asterisco (*)” o un “punto y coma

(;)” y no son ejecutables, es decir son ignorados por el programa ensamblador y, por tanto, no son convenidos a

códigos en lenguaje de máquina.

En la figura 4 se muestra como ejemplo la realización en lenguaje ensamblador (código fuente) del

programa en lenguaje de máquina (código objeto) desarrollado en una sección anterior (ver página 486). Este

programa, en particular, suma dos números y almacena el resultado en una posición de memoria. Más adelante

aprenderemos a elaborar programas más complejos en lenguaje ensamblador.

Observe el formato de las instrucciones y ubique en ellas los diferentes campos (etiqueta, nemónjco,

operandos y comentarios). Note que se utilizan las directivas de ensamblador ORG y EQU. Examine el código

objeto y observe que hay instrucciones más largas que otras. Por ejemplo, la instrucción “ADD B” ocupa un

byte, la instrucción “MVI A, SUM1” ocupa dos bytes y la instrucción “STA RESUL” tres bytes.

En este curso utilizaremos la notación en lenguaje ensamblador por resultar más clara desde el punto de

vista del programador. Sin embargo, recuerde que es la notación en lenguaje de máquina la que comprende el

microprocesador y la que debe utilizarse para introducir programas en la memoria.

Código Objeto

(Lenguaje de Máquina)

Código Fuente

(Lenguaje Ensamblador)

Dirección Instrucciones

datos Etiqueta

Op-Code

(Némonico) Operando Comentario

Instrucciones no

Ejecutables

ORG 0000 ;Empezar en dirección

0000

Page 33: Guia de Microprocesadores Ujap

33 Prof. Yomarvys Osorio

SUM1: EQU 08 ;Hacer SUM1 = 08

SUM2: EQU 07 ;Hacer SUM2 = 07

RESUL: EQU 0020 ;Hacer RESUL = 0020

0010H 3E MVI A , SUM1

;Cargar “A” con el 1er

dato 0011H 08

0012H 06 MVI B , SUM2

;Cargar “B” con el 2do

dato 0013H 07

0014H 80 ADD B ;Suma “A” con “B”

0015H 32

STA RESUL

;Llevar el resultado de la

suma a la posición

RESUL

0016H 20

0017H 00

0018H 76 HLT ;Parar

Figura 4. Ejemplo de Programa en Lenguaje Emsablador

Diagramas de Flujo

Aunque el lenguaje ensamblador representa una ayuda sustancial en la codificación de los programas,

sigue siendo difícil de crear inmediatamente el código necesario para nuestras aplicaciones particulares. Una

herramienta básica para la solución de problemas de programación la constituyen los “Diagramas de Flujo”.

Mediante un diagrama de flujo, un problema dado puede representarse en forma gráfica y sencilla,

dibujando los pasos que requiere su solución y el orden en que deben ejecutarse. Estos diagramas son mucho

más claros y fáciles de comprender que las instrucciones escritas en lenguaje ensamblador.

La mayoría de programadores, antes de escribir un programa en ensamblador, lo representan primero

gráficamente en un diagrama de flujo. Algunos programadores experimentados dibujan el diagrama de flujo

después de completar el programa y lo hacen sólo con fines explicativos.

Un diagrama de flujo bien elaborado no debe hacer referencia explícita al lenguaje ensamblador de una

máquina específica. Por tanto, puede ser utilizado para escribir un programa para cualquier microprocesador. En

la figura 5a se muestran los símbolos utilizados en los diagramas de flujo.

Los recuadros o rectángulos representan procesos o acciones simples. Cuando dichos procesos implican

Page 34: Guia de Microprocesadores Ujap

34 Prof. Yomarvys Osorio

operaciones más complejas se utiliza el símbolo de subrutina (un recuadro con barras internas). Si se trata de un

proceso que implique la comunicación directa con un dispositivo externo (o con el usuario), se utiliza el símbolo

de entrada/salida (un paralelogramo).

Las líneas que enlazan estos recuadros describen los posibles caminos entre ellos. Como los programas se

ejecutan siempre en forma secuencial, las líneas de enlace son siempre unidireccionales. Es esta la razón por lo

cual se utilizan flechas para indicar el sentido que se sigue en la ejecución de las instrucciones.

Siempre que haya que elegir una opción, se utiliza un símbolo de decisión, en forma de rombo, diamante o

hexágono aplanado. Como en el caso anterior, el control fluye por un sólo camino, pero puede discurrir en una

de dos direcciones según el resultado de la condición. Los símbolos auxiliares se utilizan para dar mayor

comprensión y claridad.

El símbolo marcado como terminal (un óvalo) muestra indistintamente tanto el principio como el final del

programa. El conector de partes se utiliza para reemplazar las líneas de flujo donde resulta conveniente por

razones de espacio o claridad.

El conector de páginas se usa cuando un mismo diagrama llega a ocupar más de una hoja. Representa una

gran ventaja, en cuanto a claridad y comodidad se refiere, utilizar un conector en lugar de una línea de flujo para

conectar puntos del diagrama representados en diferentes páginas.

Como norma general, todo programa debe ser concebido en términos de sus diagramas de flujo antes de

ser codificado. Tal práctica asegura que el flujo de control del programa siga una secuencia lógica y evita la

creación de espaguetis, es decir, programas en los que el flujo de control se desvía en forma indiscriminada y

confusa.

En la figura 5b se muestra como ejemplo el diagrama de flujo de un programa que toma diez muestras de

datos de un puerto de entrada y los almacena en la memoria. A partir de la lección 48 practicaremos

intensivamente la elaboración de diagramas de flujo.

Page 35: Guia de Microprocesadores Ujap

35 Prof. Yomarvys Osorio

Figura 5. Diagramas de Flujo

Proceso

Simple Complejo

(Subrutin

a) Decisiones

Si Si

No

No

Conectores

De

partes

De

páginas

Líneas

de flujo

Terminal

Entrada/

Salida

Empezar

a) Simbología

Inicio

Obtene

r dato

Almacenar en

memoria

Si

No Van 10

datos?

Fin

b) Ejemplo

Page 36: Guia de Microprocesadores Ujap

36 Prof. Yomarvys Osorio

PROGRAMACIÓN DEL MICROPROCESADOR 8085

Modelo de Programación del 8085

Durante las etapas de creación, escritura y depuración de cualquier programa, se debe tener en cuenta un

modelo del microprocesador enfocado a las partes entre las cuales se realiza el intercambio de datos. A esta

representación del microprocesador se le llama modelo de programación.

La transferencia de información es básica en la programación en lenguaje de máquina. En toda

computadora, debe haber transferencia de información entre el microprocesador, la memoria y los puertos de

entrada-salida. También se transfiere información entre los diversos registros internos del microprocesador.

En la figura 1 se ilustra el modelo de programación del 8085. Allí podemos observar la forma como se

agrupan los registros de ocho bits formando parejas de dieciséis bits. La cifra entre paréntesis a la derecha de

cada rectángulo indica el número de bits del respectivo registro.

A (8) Acumulador

B (8) C (8)

Registros

Auxiliares D (8) E (8)

H (8) L (8)

SP (16) Apuntador de Pila

PC (16) Contador de Programa

7 6 5 4 3 2 1 0

S Z --- AC --- P --- CY Palabra de Estado (WS)

Figura 1. Modelo de Programación del 8085

Formato de Instrucciones del 8085

En los sistemas basados en el 8085, la memoria se encuentra organizada en palabras o posiciones de ocho

bits (un byte) cada una. En la misma forma se guardan los datos en los registros internos del microprocesador.

Hay, sin embargo, algunas pocas instrucciones del 8085 que pueden trabajar con datos u operandos de dieciséis

bits usando los registros internos emparejados. Este hecho indica que no necesariamente a cada instrucción

Page 37: Guia de Microprocesadores Ujap

37 Prof. Yomarvys Osorio

corresponde un byte o posición de memoria. Algunas requieren de una o dos posiciones de memoria adicionales.

Las instrucciones en el 8085 pueden constar entonces de uno, dos o tres bytes.

Las instrucciones de un byte están formadas solamente por el código de operación y no requieren ningún operando.

La instrucción CMA (complementar el acumulador), mostrada en la figura 2, es un ejemplo de ello.

Ejemplo: CMA

1er Byte 0 0 1 0 1 1 1 1 Código OP

(2F)h Código de operación OP

Figura 2. Instrucción de 1 Byte

En las instrucciones de dos bytes, el primero de ellos es el código de operación y el segundo especifica él

operando de la instrucción. En la instrucción MVI B, 01H (cargar el registro B con el valor 01 hexadecimal),

mostrada en la figura 3, se ilustra el formato de las instrucciones de este tipo.

Ejemplo: MVI B, 01

(06)h (01)h

Código OP Dato

Posiciones de memoria ocupadas

1er Byte 0 0 0 0 0 1 1 0 Código OP

2do Byte 0 0 0 0 0 0 0 1 Dato

Figura 3. Instrucción de 2 Bytes

Cuando se trata de instrucciones de tres bytes, el primero de ellos contiene, como siempre, el código de

operación. Los dos bytes restantes se usan para representar el valor inmediato del operando o la dirección

completa (16 bits) del lugar de la memoria donde se encuentra almacenado. Un ejemplo de instrucciones de tres

bytes se muestra en la figura 4. La instrucción LXI H, 3050H carga la pareja de registros H y L con los valores

hexadecimales 30 y 50, respectivamente.

Ejemplo: LXI H, 3030

(21)h (30)h (30)h

Código OP Dir. Alta Dir. Baja

Posiciones de memoria ocupadas

Page 38: Guia de Microprocesadores Ujap

38 Prof. Yomarvys Osorio

1er Byte 0 0 1 0 0 0 0 1 Código OP

2do Byte 0 0 1 1 0 0 0 0 Dir. Alta

3er Byte 0 0 1 1 0 0 0 0 Dir. Baja

Figura 4. Instrucción de 3 Bytes

El Acumulador y las Banderas

El acumulador está directamente conectado a la unidad lógico aritmética y su contenido afecta al registro

indicador de estado. Si bien los demás registros pueden ser utilizados en forma similar, es el acumulador el que

se utiliza con más frecuencia.

Un ejemplo típico del uso del acumulador es el traslado de datos entre distintas partes de la memoria. Esta

es una operación muy sencilla pero su uso es bastante frecuente en todos los programas en lenguaje de máquina.

Supongamos que tenemos un dato, de ocho bits, almacenado en determinada posición de memoria, a la

que llamaremos ORIGEN. Deseamos trasladar dicho dato a una segunda posición de memoria: DESTIN.

Observe que por el momento no nos hemos preocupado por las posiciones de memoria concretas sino que

utilizamos etiquetas que resultan más comprensibles y dejamos su traducción para el final.

Podría parecemos que el traslado de datos puede hacerse en una sola operación debido a su sencillez. Sin

embargo es necesario dividir la operación en dos partes, una de captación del dato desde la posición de origen y

otra para colocar el dato en la posición destino.

La razón de dicha división es la necesidad de utilizar los buses de datos y direcciones para cada una de

dichas tareas. Si se intentara trasladar directamente un dato de una posición a otra en la memoria se produciría un

conflicto en los buses puesto que no se sabría cuál de las posiciones se está direccionando.

Además sería necesario indicar simultáneamente a una memoria que escribiera el dato en el bus y a otra

que leyera dicho dato. El problema sería aún mayor si las dos posiciones de memoria se encontraran en un

mismo circuito integrado.

La solución consiste en utilizar un almacenamiento intermedio para el byte que deseamos trasladar. Este

almacenamiento puede ser, por supuesto, el registro acumulador. El primer paso es entonces llevar el byte desde

la primera posición de memoria hasta el acumulador y almacenarlo allí, proceso conocido como cargar el

acumulador (LDA: Loading the Accumulator).

Luego se envía el dato desde el acumulador a la posición de memoria destino, operación conocida como

Page 39: Guia de Microprocesadores Ujap

39 Prof. Yomarvys Osorio

almacenar el acumulador (STA: Store the Accumulator contents). El programa que realiza dichas operaciones se

muestra en la figura 5.

Código Fuente:

ORG 0B10 h ;Empezar en dirección 0B10h

ORIGEN EQU 0A1F h ;Dirección de memoria origen

DESTIN EQU 0C26 h ;Dirección de memoria destino

LDA ORIGEN ;Cargar el dato en el

;acumulador

STA DESTIN ;Almacenar el dato en la

;memoria

HALT ;Parar

Código Objeto

Dirección Instrucción

0B10 3A 1F0A

0B13 32 260C

Figura 5. Traslado de Datos en la Memoria

La necesidad de realizar varias operaciones en secuencia para llevar a cabo una tarea se conoce como el

cuello de botella de Von Newman. Los datos deben fluir desde la memoria, siempre a través de la CPU, y

regresar por este mismo medio a la memoria.

Nótese que estamos copiando el contenido de la posición de memoria 0A1FH (ORIGEN) en la posición

0C26H (DESTIN) sin saber cual es dicho contenido. Es vital tener muy clara esta cuestión desde el principio. El

byte trasladado puede ser cualquier número entre 00H y FFH. Es esencial tener siempre presente la distinción ente

los datos y el lugar donde se encuentran almacenados.

Otro importante detalle es la traducción de las etiquetas de dos bytes. Observe que al definir la etiqueta ORIGEN en

el código fuente le asignamos el número hexadecimal 0A1F.

En el código objeto, sin, embargo, aparece listado como 1F0A, es decir, se invierte el orden de los bytes

que definen la etiqueta. Esto se conoce como notación lo-hi (apócope de low-high: bajo-alto), y es necesaria para

que el microprocesador pueda “comprender” el código que ejecuta. Este tipo de notación o procedimiento puede

variar según el fabricante de cada microprocesador.

Al final del programa se encuentra la instrucción HLT (Halt), que detiene el funcionamiento del

microprocesador. Esta instrucción es necesaria para evitar que se tomen los bytes siguientes de la memoria

Page 40: Guia de Microprocesadores Ujap

40 Prof. Yomarvys Osorio

donde se encuentra almacenado el programa como instrucciones ejecutables.

El programa anterior no afecta ninguna de las banderas (flags) del registro de estado del procesador (PSW

en el 8085). Veamos ahora un tipo de operación que modifica el estado de algunas banderas: la suma binaria.

El resultado de sumar dos números de N bits no siempre es otro número de N bits. Algunas veces es

necesario un bit adicional. Tomemos como ejemplo la siguiente suma:

Hexadecimal Binario

F8 11111000

+E6 11100110

1DE 111011110

El resultado es un número de nueve bits, aun cuando ninguno de los sumandos supera los ocho. Si

consideramos que el acumulador, que participa en la mayoría de las operaciones aritméticas, sólo puede

almacenar números de ocho bits, cabe preguntamos dónde va a parar el bit adicional.

La respuesta está en la bandera de acarreo. Cada vez que se presenta un desbordamiento en el bit más

significativo como resultado de una operación aritmética la bandera de acarreo (CY) se coloca en uno (set).

Si el resultado es un número de sólo ocho bits, la bandera de acarreo se hace cero (reset). En otras

palabras, CY se convierte en el noveno bit del acumulador.

En la mayoría de los casos, cuando sumemos dos números de un sólo byte, no sabremos por adelantado

cuáles serán, por lo que tendremos que estar dispuestos a que el resultado supere a FFH (1111 1111 en binario).

Esto supone reservar dos bytes de la RAM para contener el resultado de la suma. En e1 byte /o (byte bajo)

se almacena el contenido final del acumulador y luego se almacena el flag de arrastre como byte hi (byte alto).

No existe una instrucción exclusiva para almacenar la bandera de arrastre, pero las instrucciones ADC

(Add with carry: suma con arrastre) fueron formuladas pensando en dicha operación. ADC significa: “sumar el

contenido del operando de la instrucción al contenido actual de la bandera de arrastre y añadir luego ese

resultado al contenido del registro acumulador”.

Todo ello significa que antes de iniciar la suma debemos considerar el estado de la bandera de arrastre ya

que será sumada al resultado de la suma propiamente dicha.

La manera de evitar errores debidos a la condición inicial de la bandera de acarreo es, sencillamente,

desactivada antes de iniciar la suma.

Para ello se puede utilizar la instrucción ANI, que realiza un AND lógico entre los ocho bits del

acumulador y cada uno de sus homólogos en él operando de la instrucción.

Todo lo que hemos dicho hasta ahora no es más que el primer método de la aritmética de un solo byte. En

resumen, se deberá:

Page 41: Guia de Microprocesadores Ujap

41 Prof. Yomarvys Osorio

1.- Limpiar el byte alto (hi) de la posición.

2.- Desactivar la bandera de arrastre.

3.- Cargar el acumulador con un número.

4.- Sumarle el segundo número.

5.- Almacenar el contenido del acumulador en el byte bajo (lo) de una posición.

6.- Cargar el acumulador con e1 contenido del byte alto.

7.- Sumarle el valor inmediato 00H.

8.- Almacenar el contenido del acumulador en el byte alto.

Aunque el procedimiento descrito contiene cierto nivel de redundancia, nos ilustra acerca del cuidado que

debe tenerse al escribir nuestros programas en ensamblador, ya que el estado de un simple bit puede determinar

la validez de un resultado o la secuencia que ha de seguir la ejecución del programa.

El listado completo del programa descrito se muestra en la figura 6. A modo de ejercicio puede tratar de

ejecutarlo mentalmente. Para ello elija un par de números de ocho bits y asígnelos a SUM1 y SUM2.

Código fuente

ORG 0000H ;Dirección de inicio del código objeto

SUMI EQU 001 OH ;Direcciones donde se almacenan

SUM2 EQU 0011 H ;los números a sumar

LOBYTE EQU 0012H ;Byte bajo del resultado

HIBYTE EQU 0013H ;Byte alto del resultado

MVI A,OOH ;Carga el acumulador con el número 00H

STA HIBYTE ;Limpiar el Byte alto (hi) de la posición

XRA A ;Desactivar la bandera de arrastre

LDA SUMI ;Cargar el acumulador con un número

LXI H,SUM2 ;El registro H señala el segundo número

ADC M ;Sumar al acumulador el número señalado

;por H

STA LOBYTE ;Almacenar el contenido del acumulador en

;el Byte bajo (lo)

LDA HIBYTE ;Cargar el acumulador con el contenido del

;Byte alto (hi)

ACI OOH ;Sumarle el valor inmediato 00H

Page 42: Guia de Microprocesadores Ujap

42 Prof. Yomarvys Osorio

STA HIBYTE ;Almacenar el contenido del acumulador en

;el Byte alto (hi)

HLT ;Detener la ejecución del programa

Código Objeto

Dirección Instrucción

0000 3E 00

0002 32 1300

0005 AF

0006 3A 1000

0009 21 1100

000C 8E

000D 32 1200

0010 3A 1300

0013 CE 00

0015 32 1300

0018 76

Figura 6. Suma con Arrastre

Ejecute paso a paso cada instrucción, anotando cada vez el contenido del acumulador, del registro HL y de las

posiciones de memoria HIBYTE y LOBYTE.

Bifurcaciones, Bucles y Contadores

Bifurcaciones

Una bifurcación es un cambio en la secuencia de ejecución de un programa, normalmente

Page 43: Guia de Microprocesadores Ujap

43 Prof. Yomarvys Osorio

determinado tras la evaluación de una condición. Toda bifurcación se representa en los diagramas de

flujo mediante un símbolo de decisión.

Bucles y Contadores

Tenemos una iteración o bucle, cuando como resultado de una bifurcación se repite la ejecución

de un determinado bloque de instrucciones. El número de repeticiones está determinado por un

contador (el cual es generalmente un registro interno de la CPU) que se actualiza en cada iteración.

Aprender a utilizar de manera adecuada las bifurcaciones, bucles y contadores es fundamental

para todo aquel que se proponga programar eficientemente en lenguaje de máquina. Tanto los bucles

como las bifurcaciones condicionadas hacen uso de las banderas del registro indicador de estado. Estas

banderas, muestran los efectos en el acumulador (o en otros registros) de la última instrucción

ejecutada. Todas ellas se pueden utilizar en la toma de decisiones, pero por el momento necesitamos

considerar sólo dos de las mismas: las banderas de cero (Z) y de arrastre (CY). El estado de estas

banderas se utiliza para decidir si el microprocesador ejecuta la siguiente instrucción el programa o si

salta a alguna otra instrucción del mismo.

La CPU decide si saltar o continuar, bien cambiando o bien aceptando la dirección que contiene

su contador de programa (PC). Este registro siempre contiene la dirección de la próxima instrucción en

lenguaje de máquina a obedecer. Cuando el microprocesador empieza a ejecutar una instrucción, carga

en el registro de instrucción el código de operación (opcode) contenido en la dirección de memoria

indicada por el contador del programa. La dirección indicada por el registro se incrementa en razón del

número de bytes de la instrucción, de modo que el contador del programa señala entonces el código de

operación de la siguiente instrucción. Sí la que está en curso hace que él contador señale a una

dirección de algún otro lugar del programa, entonces se genera efectivamente un salto.

Las instrucciones que efectúan el mencionado cambio de dirección se denominan instrucciones

de bifurcación, o simplemente saltos, porque representan un punto de cambio en e1 flujo de control del

programa. En e1 8085 existen nueve saltos distintos, que serán explicados en detalle en una próxima

lección.

Para aclarar esta idea, consideremos la tarea de decidir cual de dos números es mayor y

almacenarlo en una posición específica de la memoria. Un diagrama de flujo del programa que realiza

esta tarea se muestra en la figura 1a. Los dos primeros rectángulos representan la carga de los números

en los registros A (acumulador) y L. Estas operaciones corresponden directamente a las dos primeras

Page 44: Guia de Microprocesadores Ujap

44 Prof. Yomarvys Osorio

instrucciones del programa (figura 1b). El siguiente rectángulo (tercera instrucción) representa la

operación de comparación, en la cual se resta el contenido del registro L del contenido del acumulador.

Esta operación no influye en dichos contenidos pero afecta directamente el estado de las banderas (en

este caso, la bandera de acarreo).

La figura en forma de rombo es un símbolo de decisión y corresponde a la cuarta instrucción del

programa. En ella se evalúa el resultado de la comparación anterior, es decir, el estado del flag CY. Si

el contenido del acumulador es mayor o igual que el contenido del registro L (CY = 0), el programa

continúa hacia abajo en el diagrama (y en el listado), se almacena en la memoria el contenido del

acumulador y se detiene el programa al llegar a la sexta línea. En caso contrario (CY = 1), el programa

bifurca hacia la derecha en el diagrama (séptima línea del programa), se almacena en memoria el

contenido del registro L (pasando a través del acumulador) y se detiene la ejecución al llegar a la última

línea.

Carga el segundo

número en el

Registro L

Compara A y L

¿Es (A) > (L)?

INICIO

ALTO

No

Almacena (A)

en la memoria

Carga el primer

número en el

Registro A

(L) > (A)

(L) =< (A)

Almacena (L)

en la memoria

ALTO

a) Diagrama de Flujo

b) Listado del Programa

Este bloque de instrucciones se ejecuta siempre

MVI A, 0F ;Carga el acumulador A con el 1er número

Page 45: Guia de Microprocesadores Ujap

45 Prof. Yomarvys Osorio

MVI L, 06 ;Carga el Registro L con el 2do número

CMP L ;Compara el acumulador A con el registro L

JC SALTO ;Bifurca hacia SALTO sí CY = 1 (A < L)

;Este bloque de instrucciones se ejecuta si es mayor el contenido del

;acumulador A (CY = 0)

STA 2040 ;Almacena el contenido del acumulador A en la

;posición de memoria 2040 Hex.

HLT ;Detiene la operación del microprocesador

;Este bloque de instrucciones se ejecuta si es mayor el contenido del

;registro L (CY = 1)

SALTO: MOV A, L ;Mueve el contenido del registro L al acumulador A

STA 2040 ;Almacena el contenido del acumulador A en la

;posición de memoria 2040 Hex.

HLT ;Detiene la operación del microprocesador

Figura 1. Programa Para Encontrar el Mayor de Dos Números

Una técnica similar se utiliza cuando se desea ejecutar procesos repetitivos, para lo cual se utiliza

una estructura conocida como bucle o iteración, tal es el caso del programa mostrado en la figura 2. El

programa sencillamente efectúa un conteo en forma regresiva desde 0FH (15 en decimal) hasta cero.

Para ello se carga en primer lugar el registro acumulador (que actuará como contador), y luego se

decrementa en cada iteración. La tercera línea no realiza en realidad ninguna operación (NOP: no

opere), y se incluye tan solo para indicar que pueden existir instrucciones ejecutables en medio del

bucle. La cuarta línea es la en cargada de tomar la decisión de continuar o no las iteraciones. En ella se

compara el estado actual de la bandera de cero, con el fin de verificar si ha terminado el conteo. Si la

bandera se encuentra desactivada, la instrucción JNZ devuelve el control a la segunda línea, marcada

con la etiqueta LABEL, y ejecuta una nueva iteración. Si la bandera de cero (Z) se encuentra activada,

es decir, si el contador ha llegado a cero, la comparación fracasa y el programa continúa en la siguiente

línea (en este caso HLT), terminando así la ejecución del bucle.

Page 46: Guia de Microprocesadores Ujap

46 Prof. Yomarvys Osorio

Cargar Contador

Decrementar

Contador

Proceso

(NOP en este caso)

Contador

Cero?

INICIO

PARAR

No

Si

a) Diagrama de Flujo

b) Listado del Programa

MVI A, 0F ;Inicializar contador

LABEL: DCR A ;Decrementar contador

NOP ;No opera (proceso repetitivo)

JNZ LABEL ;Salto condicional

HLT

Figura 2. Programa Cuenta Progresiva

Modalidades De Direccionamiento

Toda instrucción en lenguaje ensamblador, explícita o implícitamente, tiene que ver con los

contenidos de la memoria, y puesto que un byte sólo se puede distinguir de otro por su dirección, toda

instrucción en lenguaje ensamblador debe relacionarse al menos con una dirección. La forma como se

alude a ella se conoce como modalidad de direccionamiento. En el microprocesador 8085 existen

cinco modos de direccionamiento, a saber:

1) Direccionamiento implícito: Se usa en algunas instrucciones en las cuales la propia función

de la instrucción indica sobre que datos ha de operar. Un ejemplo de ello es la instrucción RLC (rotar el

acumulador a la izquierda), ya que la misma instrucción actúa solamente sobre el acumulador y no

sobre ningún otro registro oposición de memoria.

2) Direccionamiento por registro: En este, la instrucción indica el registro o pareja de registros

Page 47: Guia de Microprocesadores Ujap

47 Prof. Yomarvys Osorio

donde se encuentra almacenado el operando. Estas instrucciones son muy eficientes porque no tienen

que captar operandos de memoria. Como ejemplo se tiene la instrucción ADD C, representada en la

figura 3, que suma el contenido del acumulador al registro C.

1 0 1 0 1 0 1 0

Acumulador

0 1 0 1 0 1 0 1

Registro C

ADD C (81) Hx

Instrucción

1 1 1 1 1 1 1 1

Acumulador

Antes de la Instrucción Después de la Instrucción

- 0 - 0 - 0 0 0

Z AC P C S

Registro de banderas

Figura 3. Direccionamiento por Registro

3) Direccionamiento inmediato: Este tipo existe cuando el valor del operando se especifica de

manera explícita en el código de la instrucción, es decir, los datos a utilizar van enseguida del código

de operación. La mayoría de las instrucciones inmediatas del microprocesador 8085 utilizan al

acumulador como un operando implícito. En la figura 4 se observa una instrucción que utiliza

direccionamiento inmediato: ADI, la cual suma el valor de su operando al contenido de1 acumulador.

0000 1100

Acumulador

ADI

0000 1000

Instrucción

0001 0100

Acumulador

Antes de la Instrucción Después de la Instrucción

- 0 - 1 - 1 0 0

Z AC P C S

Registro de banderas

Código de operación

C6 Hex

Datos inmediatos

Memoria de programa

Figura 4. Direccionamiento Inmediato

4) Direccionamiento directo: En este los dos bytes que siguen al código de operación especifican

la dirección donde se encuentra almacenado el operando de la instrucción. La instrucción LDA, que ya

hemos utilizado, constituye un claro ejemplo de direccionamiento directo, y se ilustra en la figura 5.

Page 48: Guia de Microprocesadores Ujap

48 Prof. Yomarvys Osorio

¿ ?

Acumulador

LDA

1111 1111

Instrucción 1111 1111

Acumulador

Antes de la Instrucción Después de la Instrucción

0000 0010 0000 0000

Memoria de datos (0200 Hex)

3A Hex

0000 0000

0000 0010

Código de

operación

Memoria de programa

Byte Hi de la Dir.

Byte Lo

de la

Dir.

Dirección de 16 bits

Figura 5. Direccionamiento Directo

5) Direccionamiento Indirecto de registro: Este se sirve de dos registros auxiliares, BC o DE

para indicar la posición de memoria en la cual se guardarán o desde la cual se tomarán los datos. La

instrucción STAX es una de las instrucciones del 8085 que utiliza este tipo de direccionamiento y se

muestra en la figura 6.

Figura 6. Direccionamiento Indirecto de Registro

El Uso de la Pila

El tratamiento de la memoria es la esencia de la programación en lenguaje de máquina y la

mayoría de las instrucciones que hemos estudiado hasta ahora están relacionadas simplemente con

cargar posiciones de la memoria o tomarlos de ella. A estas posiciones hemos accedido de diversas

maneras (las modalidades de direccionamiento) pero hasta aquí todas las instrucciones que conocemos

han empleado siempre una dirección especifica como parte del operando. Existe una clase de

¿ ?

39

Acumulado

r

¿ ?

¿ ?

025

0 025

1 025

2

E

51 02

D

¿ ?

39

Acumulado

r

39

¿ ?

025

0 025

1 025

2

E

51 02

D

STAX D

Instrucción

Memoria de

Datos

Antes de la

Instrucción Memoria de

Datos

Despues de la

Instrucción

Page 49: Guia de Microprocesadores Ujap

49 Prof. Yomarvys Osorio

instrucciones, sin embargo, que acceden a un área específica de la memoria pero que no toman como

operando dirección alguna. Son instrucciones que operan sobre el área de memoria denominada pila

(stack) y se las conoce como operaciones de pila.

La pila o montón está creada para que tanto la CPU corno el programador dispongan de una

memoria temporal donde trabajar. Se trata de una especie de “cuaderno de apuntes” cómodo para

escribir y también fácil de leer y borrar. En las instrucciones de manejo de la pila no exigen un

operando con dirección ya que un registro especial de la CPU, el llamado índice de pila (SP: Stack

Pointer) siempre contiene la dirección de la primera posición libre de la pila.

Por tanto, todo cuanto se escribe en la pila es depositado automáticamente en el byte señalado por

dicho índice, y los bytes que se sacan de la pila se toman de la última posición utilizada. Al ejecutar

una operación de pila, su índice se ajusta automáticamente como parte de la operación. El índice de la

pila del 8085 es un registro de dos bytes capaz de direccionar cualquier posición entre 0000H y FFFFH,

o sea, todo el espacio direccionable por el propio 8085. Por consiguiente, la pila puede estar situada en

cualquier lugar de la RAM, y el programador puede cambiarla de sitio si lo desea. Sin embargo, esto no

es muy aconsejable. Un ejemplo del uso de la pila se muestra en la figura 7. Se trata de un sencillo

programa que intercambia el contenido de dos posiciones de memoria, MEMO1 y MEMO2. Para

lograr este cometido se sigue el proceso siguiente:

1. El contenido de MEMO1 es cargado en el acumulador.

2. El contenido del acumulador ‘‘empujado’’ (push) dentro de la pila.

3. El contenido de MEMO2 se carga en el acumulador.

4. El contenido del acumulador se almacena en MEMO1.

5. El último ítem guardado en la pila “salta’’ (pops) otra vez dentro del acumulador.

6. El actual contenido del acumulador (que antes estaba en la pila y al principio en MEMO1 se

almacena en MEMO2.

Programa Fuente

ORG 0000 h

MEMO1

:

EQU 0010 h ;Posiciones de memoria cuyos contenidos se han

MEMO2

:

EQU 0011 h ;de intercambiar

LDA MEMO1 ;El contenido de MEMO1 es cargado en el

;acumulador

Page 50: Guia de Microprocesadores Ujap

50 Prof. Yomarvys Osorio

PUSH PSW ;El contenido del acumulador es “empujado” en la

pila

LDA MEMO2 ;El contenido de MEMO2 es cargado en el

;acumulador

STA MEMO1 ;El contenido del acumulador se almacena en

;MEMO1

POP PSW ;El último ítem guardado en la pila “salta” al

;acumulador

STA MEMO2 ;El contenido actual del acumulador (que antes

estaba ;en la pila y al principio en MEMO1) se

guarda en ;MEMO2

HLT

Programa Objeto

0000 h 3A h 10 00

0003 h F5 h

0004 h 3A h 11 00

0007 h 32 h 10 00

000A h F1 h

000B h 32 h 11 00

000E h 76 h

Figura 7. Intercambiar los Contenidos de dos Posiciones de Memoria

Los seis pasos anteriores se ilustran en la figura 8. En ella puede verse claramente el camino que

siguen los datos durante la ejecución del programa y la utilización de la pila como área de

almacenamiento intermedio. Este fragmento de programa nos muestra que las operaciones de pila son

ante todo recíprocas y secuenciales. El último ítem empujado en ella, se recupera al primer salto que se

ordene desde la pila. Si ha habido varios ‘‘empujones” seguidos sin ningún ‘‘salto’’, los datos se

escriben en sucesivas posiciones de la pila, cada byte ‘‘encima’’ del anterior, y si se piden varios

“saltos’’ consecutivos, éstos van afectando a las sucesivas posiciones en orden descendente. La pila es

una estructura LIFO (Last In First Out), o sea, el último dato que entró es el primero en sa1ir. El dato

que ocupa en cualquier momento la parte superior del montón será el más reciente, el del fondo del

montón el más antiguo, y para sacar este último es necesario sacar primero todos los datos más

recientemente empujados. Convencionalmente, al primer byte libre de la pila se le denomina tope, ya

que uno se imagina las pilas creciendo hacia arriba. Aunque, de hecho, el índice de la pila disminuye a

cada empujón, por lo que el tope está en realidad en una posición de memoria inferior a la base de la

pila.

Page 51: Guia de Microprocesadores Ujap

51 Prof. Yomarvys Osorio

Figura 8. Esquema de Funcionamiento del Programa de Intercambiar

Utilización De Subrutinas o Subprogramas

Al programar en lenguaje ensamblador, una subrutina es un mecanismo básico que le permite al

programador tratar un conjunto de instrucciones como si fuera una única instrucción de más alto nivel.

En un programa, las subrutinas se definen simplemente listando las instrucciones que la componen, y

se ensamblan como si fueran pequeños programas, independientes y autónomos.

Una subrutina puede ser invocada en cualquier parte del programa principal y esto se logra

mediante una instrucción denominada llamada a subrutina, con la cual, el microprocesador desvía su

flujo secuencial, a la subrutina en cuestión y ejecuta sus instrucciones, hasta encontrar un indicador de

retorno de subrutina, el cual devuelve el flujo del programa hasta la instrucción que le sigue a dicha

llamada a subrutina. En la figura 9 se ilustra lo explicado.

Figura 9. Flujo de Control en una Llamada a Subrutina

Para lograr esto, el microprocesador sencillamente empuja en la pila el contenido del contador de

programa (PC) cuando encuentra la instrucción de llamada a subrutina, y lo reemplaza por la dirección

Sub

RET

CALL

Sub

Programa

principal

Subrutina

Instrucción de

llamada Instrucció

n de retorno

M1

M2

M1

M2

M1

M2

A A A

Stack

Stack

Stack

Siendo:

A :

Acumulador

M1: Memo1

M2: Memo2

1

2

3

4

5

6

Page 52: Guia de Microprocesadores Ujap

52 Prof. Yomarvys Osorio

especificada por la etiqueta de la misma, luego, al encontrar la instrucción de retorno, se carga el

contador de programa con el contenido de la pila, que es la dirección de la siguiente instrucción del

programa principal denominada dirección de retorno.

Además de guardar el contenido del PC cuando se llama a una subrutina, puede ser necesario

guardar en la pila otros registros de la CPU, cuyos contenidos son necesarios para el programa que

efectúa la llamada, ya que la subrutina puede hacer uso de tales registros y destruir los datos contenidos

en estos. Para guardar cada par de registros en la pila, se coloca una instrucción PUSH al principio del

código que define la subrutina. Posteriormente, se restauran los registros a su contenido original

mediante instrucciones POP, inmediatamente antes de retornar al programa principal.

En la figura 10 se usa el procedimiento descrito para guardar y restaurar el estado de todos los

registros del 8085 durante la ejecución de una subrutina ficticia (RUTI). Es de señalar que la secuencia

de extracción de direcciones es inversa a la secuencia de inserción, debido al método de acceso a la pila

en el que el último en entrar es el primero en salir (LIFO), también es muy importante saber que toda

inserción en la pila vaya acompañada de su correspondiente restauración antes de salir de la subrutina,

pues de lo contrario se tomará una dirección de retorno equivocada desde la pila y el programa,

sencillamente, se enloquece.

Al entrar en la subrutina, se empujan los registros en la pila

RUTI: PUSH PSW ;Guarda el contenido de la palabra de

estado

PUSH B ;Guarda el contenido de los registros B y C

PUSH D ;Guarda el contenido de los registros D y E

PUSH H ;Guarda el contenido de los registros H y L

;Instrucciones que conforman la subrutina

POP H ;Restaura los registros H y L

POP D ;Restaura los registros D y E

POP B ;Restaura los registros B y C

POP PSW ;Restaura la palabra de estado

RET ;Instrucción de retorno

Figura 10. Esquema Típico de una Subrutina

En algunas ocasiones se hace necesario pasar datos desde el programa principal hacia la subrutina

para que esta los utilice internamente, esto se conoce como transferencia de parámetros. La esencia de

la transferencia de parámetros consiste en que el programa que efectúa la llamada, coloca en un área de

comunicación conocida por la subrutina, bien los parámetros actuales a transferir, bien información

Page 53: Guia de Microprocesadores Ujap

53 Prof. Yomarvys Osorio

sobre la dirección a partir de la cual la subrutina puede determinar la localización de los parámetros.

En la figura 11 se muestran algunos de los métodos más usuales para pasar parámetros a

subrutinas. Estos métodos difieren principalmente en la elección del área de comunicación, que puede

estar en la CPU, en un área de datos de la memoria, en la pila, o en el propio programa que hace la

llamada.

Área de

comunicación

Acciones realizadas por el

programa principal

Acciones realizadas

por la subrutina

Registros de la CPU Colocar los valores de los parámetros en

registros de la CPU

Leer registros de la CPU

Área de datos en M Colocar la dirección de los parámetros en

registros de la CPU

Leer M utilizando registros

como direcciones

Pila en M Insertar en a pila os valores de los

parámetros

Extraer de la pila

Programa principal

en M

Ninguna; los valores de los parámetros se

listan como datos en el programa principal

Leer datos del programa

principal.

Figura 11. Métodos de Transferencia de Parámetros a subrutinas

El área de comunicación se puede usar también para transferir resultados desde la subrutina hacia

el programa que la llamó. La estructura general de una subrutina, incluyendo la transferencia de

parámetros, se muestra en la figura 12.

Punto de entrada

Guardar los registros de la CPU

Leer los parámetros de entrada

Cuerpo principal

de la subrutina

Escribir los parámetros de salida

Restaurar los registros de la CPU

Punto de salida (retorno)

Figurga 12. Estructura General de una Subrutina

Page 54: Guia de Microprocesadores Ujap

54 Prof. Yomarvys Osorio

Conjunto de Instrucciones de un Microprocesador

El conjunto de instrucciones de un Microprocesador es una lista de todas las operaciones que es

capaz de ejecutar un microprocesador. Esta lista varía con cada microprocesador y es suministrada por

el fabricante del mismo, en su forma básica de formato hexadecimal y su representación de nemónicos.

Cuando se realiza un programa en lenguaje ensamblador, todas sus acciones se deben expresar

por medio de este conjunto, para que el microprocesador pueda comprenderlas y ejecutarlas, por lo

tanto es indispensable conocer el significado de cada una de las instrucciones que se están usando y

saber como afectan los registros del microprocesador.

Para estudiar el conjunto de instrucciones de un Microprocesador es pueden dividirse en grupos

según la operación que realizan, estos son:

Instrucciones para Transferencia de Datos: Tienen como función ejecutar todas las posibles

transferencias con que cuenta el microprocesador, o sea, transferir un dato de una posición de memoria

a un registro, transferir el contenido de un registro a una posición de memoria o a otro registro y

viceversa.

Instrucciones Lógicas y Aritméticas: Son las encargadas de realizar las operaciones lógicas

(And, Or, Comparador, etc.) y aritméticas (Suma, Resta, Incrementar, Decrementar, etc.) que el

microprocesador esta en la capacidad de ejecutar. Estas le confieren al microprocesador la facultad de

reemplazar gran cantidad de componentes como: compuertas, comparadores, sumadores, etc. que eran

necesarios para realizar dichas operaciones.

Instrucciones de Cambio de Secuencia: Su función es la de alterar la secuencia lineal que

sigue la ejecución de un programa, mediante el cambio del contenido del “Contador de Programas”.

Entre estas instrucciones se encuentran: Los saltos, llamadas a subprogramas, retornos e

inicializaciones.

Instrucciones de Entrada/Salida: Son las encargadas del control de los dispositivos externos a

través de los puertos de entrada/salida para recibir o enviar información, al mundo exterior. Existen

microprocesadores que trabajan con comunicación serial y poseen instrucciones para tal fin.

Conjunto De Instrucciones Del Microprocesador 8085

Page 55: Guia de Microprocesadores Ujap

55 Prof. Yomarvys Osorio

El Microprocesador 8085 posee un conjunto de 243 instrucciones, en la tabla siguiente se

muestran estas divididas convenientemente en grupos según su función para su mejor compresión,

además, se da una breve explicación de cada una de ellas. Esta tabla será usada como referencia para

escribir los programas correspondientes al 8085.

También se da un cuadro con los códigos de operación en formato hexadecimal de cada uno de

sus nemónicos para tener una idea de su traducción por parte del software ensamblador.

Page 56: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

CONJUNTO DE INSTRUCCIONES DEL MICROPROCESADOR 8085 I N S T R U C C I O N E S P A R A T R A N S F E R E N C I A D E D A T O S

Descripción Código Nemónico B C Descripción Código Nemónico B C

Movimientos Al Registro B Movimientos Al Registro H

B → B 40 MOV B, B 1 4 H → B 60 MOV H, B 1 4

B → C 41 MOV B, C 1 4 H → C 61 MOV H, C 1 4

B → D 42 MOV B, D 1 4 H → D 62 MOV H, D 1 4

B → E 43 MOV B, E 1 4 H → E 63 MOV H, E 1 4

B → H 44 MOV B, H 1 4 H → H 64 MOV H, H 1 4

B → L 45 MOV B, L 1 4 H → L 65 MOV H, L 1 4

B → Memoria(HL)* 46 MOV B, M 1 7 H → Memoria(HL)* 66 MOV H, M 1 7

B → A 47 MOV B, A 1 4 H → A 67 MOV H, A 1 4

Movimientos Al Registro C Movimientos Al Registro L

C → B 4B MOV C, B 1 4 L → B 68 MOV L, B 1 4

C → C 49 MOV C, C 1 4 L → C 69 MOV L, C 1 4

C → D 4A MOV C, D 1 4 L → D 6A MOV L, D 1 4

C → E 4B MOV C, E 1 4 L → E 6B MOV L, E 1 4

C → H 4C MOV C, H 1 4 L → H 6C MOV L, H 1 4

C → L 40 MOV C, L 1 4 L → L 6D MOV L, L 1 4

C → Memoria(HL)* 4E MOV C, M 1 4 L → Memoria(HL)* 6E MOV L, M 1 7

C → A 4F MOV C, A 1 4 L → A 6F MOV L, A 1 4

Movimientos Al Registro D Movimientos A La Memoria*

D → B 50 MOV D, B 1 4 Memoria(HL)* → B 70 MOV M, B 1 7

D → C 51 MOV D, C 1 4 Memoria(HL)* → C 71 MOV M, C 1 7

D → D 52 MOV D, D 1 4 Memoria(HL)* → D 72 MOV M, D 1 7

D → E 53 MOV D, E 1 4 Memoria(HL)* → E 73 MOV M, E 1 7

D → H 54 MOV D, H 1 4 Memoria(HL)* → H 74 MOV M, H 1 7

D → L 55 MOV D, L 1 4 Memoria(HL)* → L 75 MOV M, L 1 7

D → Memoria(HL)* 56 MOV D, M 1 7 Memoria(HL)* → A 77 MOV M, A 1 7

D → A 57 MOV D, A 1 4 Movimientos Al Registro A

Movimientos Al Registro E A → B 78 MOV A, B 1 4

E → B 5B MOV E, B 1 4 A → C 79 MOV A, C 1 4

E → C 59 MOV E, C 1 4 A → D 7A MOV A, D 1 4

E → D 5A MOV E, D 1 4 A → E 7B MOV A, E 1 4

E → E 5B MOV E, E 1 4 A → H 7C MOV A, H 1 4

E → H 5C MOV E, H 1 4 A → L 7D MOV A, L 1 4

E → L 5D MOV E, L 1 4 A → Memoria(HL)* 7E MOV A, M 1 7

E → Memoria(HL)* 5E MOV E, M 1 7 A → A 7F MOV A, A 1 4

E → A 5F MOV E, A 1 4

Page 57: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Descripción Código Nemónico B C Descripción Código Nemónico B C

Carga Inmediata Dato de 16* → DE 11 LXI D, d16 3 10

Dato de 8* → A 3E MVI A, d8 2 7 Dato de 16* → HL 21 LXI H, d16 3 10

Dato de 8* → B 06 MVI B, d8 2 7 Memoria(dir)* → L y

Memoria(dir+1)* → H 2A LHLD dir 3 16

Dato de 8* → C 0E MVI C, d8 2 7 Memoria(dir)* → A 3A LDA dir 3 13

Dato de 8* → D 16 MVI D, d8 2 7 Memoria(BC)* → A 0A LDAX B 1 7

Dato de 8* → E 1E MVI H, d8 2 7 Memoria(DE)* → A 1A LDAX D 1 7

Dato de 8* → H 26 MVI L, d8 2 7 A → Memoria(BC)* 02 STAX B 1 7

Dato de 8* → L 2E MVI M, d8 2 7 A → Memoria(DE)* 12 STAX D 1 7

Dato de 8* → Memoria(HL)* 36

Carga y Almacenamiento A → Memoria(dir)* 32 STA dir 3 13

Dato de 16* → SP 31 LXI SP, d16 3 10 L → Memoria(dir)* y

H → Memoria(dir+1)* 22 SHLD dir 3 16

Dato de 16* → BC 01 LXI B, d16 3 10 HL → SP F9 SPHL 1 6

I N S T R U C C I O N E S L Ó G I C A S Y A R I T M É T I C A S

Sumas O Adiciones Restas O Sustracciones

B + A → A 80 ADD B 1 4 A – B → A 90 SUB B 1 4

C + A → A 81 ADD C 1 4 A – C → A 91 SUB C 1 4

D + A → A 82 ADD D 1 4 A – D → A 92 SUB D 1 4

E + A → A 83 ADD E 1 4 A – E → A 93 SUB E 1 4

H + A → A 84 ADD H 1 4 A – H → A 94 SUB H 1 4

L + A → A 85 ADD L 1 4 A – L → A 95 SUB L 1 4

Memoria(HL)* + A → A 86 ADD M 1 7 A – Memoria(HL)* → A 96 SUB M 1 7

A + A → A 87 ADD A 1 4 A – A → A 97 SBB A 1 4

B + cy + A → A 88 ADC B 1 4 A – B – cy → A 98 SBB B 1 4

C + cy + A → A 89 ADC C 1 4 A – C – cy → A 99 SBB C 1 4

D + cy + A → A 8A ADC D 1 4 A – D – cy → A 9A SBB D 1 4

E + cy + A → A 8B ADC E 1 4 A – E – cy → A 9B SBB E 1 4

H + cy + A → A 8C ADC H 1 4 A – H – cy → A 9C SBB H 1 4

L + cy + A → A 8D ADC L 1 4 A – L – cy → A 9D SBB L 1 4

Memoria(HL)* + cy + A → A 8E ADC M 1 7 A – Memoria(HL)* – cy → A 9E SBB M 1 7

A + cy + A → A 8F ADC A 1 4 A – A – cy → A 9F SBB A 1 4

Dato de 8* + A → A C6 ADI d8 2 7 A – dato de 8* → A D6 SUI d8 2 7

Dato de 8* + cy +A → A CE ACI d8 2 7 A – dato de 8* – cy → A DE SBI d8 2 7

BC + HL → HL 09 DAD B 1 10

DE + HL → HL 19 DAD D 1 10

HL + HL → HL 92 DAD H 1 10

SP + HL → HL 39 DAD SP 1 10

Page 58: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Descripción Código Nemónico B C Descripción Código Nemónico B C

Incrementos C or A → A B1 ORA C 1 4

1 + A → A 3C INR A 1 4 D or A → A B2 ORA D 1 4

1 + B → B 04 INR B 1 4 E or A → A B3 ORA E 1 4

1 + C → C 0C INR C 1 4 H or A → A B4 ORA H 1 4

1 + D → D 14 INR D 1 4 L or A → A B5 ORA L 1 4

1 + E → E 1C INR E 1 4 Memoria(HL)* or A → A B6 ORA M 1 7

1 + H → H 24 INR H 1 4 A or A → A B7 ORA A 1 4

1 + L → L 2C INR L 1 4 Dato de 8* or A → A F6 ORI d8 2 7

1+Memoria(HL)*→ Memoria(HL)* 34 INR M 1 10 Operación Lógica XOR

1 + BC → BC 03 INX B 1 6 B xor A → A A8 XRA B 1 4

1 + DE → DE 13 INX D 1 6 C xor A → A A9 XRA C 1 4

1 + HL → HL 23 INX H 1 6 D xor A → A AA XRA D 1 4

1 + SP → SP 33 INX SP 1 6 E xor A → A AB XRA E 1 4

Decrementos H xor A → A AC XRA H 1 4

A – 1 → A 3D DCR A 1 4 L xor A → A AD XRA L 1 4

B – 1 → B 05 DCR B 1 4 Memoria(HL)* xor A → A AE XRA M 1 7

C – 1 → C 0D DCR C 1 4 A xor A → A AF XRA A 1 4

D – 1 → D 15 DCR D 1 4 Dato de 8* xor A → A EE XRI d8 2 7

E – 1 → E 1D DCR E 1 4 Comparación

H – 1 → H 25 DCR H 1 4 A – B B8 CMP B 1 4

L – 1 → L 2D DCR L 1 4 A – C B9 CMP C 1 4

Memoria(HL)*–1→ Memoria(HL)* 35 DCR M 1 10 A – D BA CMP D 1 4

BC – 1 → BC 3B DCX B 1 6 A – E BB CMP E 1 4

DE – 1 → DE 0B DCX D 1 6 A – H BC CMP H 1 4

HL – 1 → HL 1B DCX H 1 6 A – L BD CMP L 1 4

SP – 1 → SP 2B DCX SP 1 6 A – Memoria(HL)* BE CMP M 1 7

Operación Lógica AND A – A BF CMP A 1 4

B & A → A A0 ANA B 1 4 A – Dato de 8* FE CPI d8 2 7

C & A → A A1 ANA C 1 4 Otras Instrucciones

D & A → A A2 ANA D 1 4 Rotar bits de A a la derecha 0F RRC 1 4

E & A → A A3 ANA E 1 4 Rotar bits de A a la izquierda 07 RLR 1 4

H & A → A A4 ANA H 1 4 Rotar A a la derecha con cy 1F RAR 1 4

L & A → A A5 ANA L 1 4 Rotar A a la izquierda con cy 17 RAL 1 4

Memoria(HL)* & A → A A6 ANA M 1 7 Complementar A 2F CMA 1 4

A & A → A A7 ANA A 1 4 Hacer 1 la bandera cy 37 STC 1 4

Dato de 8* & A → A E6 ANI d8 2 7 Complementar la bandera cy 3F CMC 1 4

Operación Lógica OR Ajuste decimal de A 27 DAA 1 4

B or A → A B0 ORA B 1 4

Page 59: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

I N S T R U C C I O N E S D E C A M B I O D E S E C U E N C I A D E L P R O G R A M A

Descripción Código Nemónico B C Descripción Código Nemónico B C

Llamadas A Rutinas Saltos

Incondicional a “dir” CD CALL dir 3 18 Incondicional a “dir” C3 JMP dir 3 10

A “dir” si hay acarreo DC CC dir 3 9/18 A “dir” si hay acarreo DA JC dir 3 7/10

A “dir” si no hay acarreo D4 CNC dir 3 9/18 A “dir” si no hay acarreo D2 JNC dir 3 7/10

A “dir” si es cero CC CZ dir 3 9/18 A “dir” si es cero CA JZ dir 3 7/10

A “dir” si no es cero C4 CNZ dir 3 9/18 A “dir” si no es cero C2 JNZ dir 3 7/10

A “dir” si es impar E4 CPO dir 3 9/18 A “dir” si es impar E2 JPO dir 3 7/10

A “dir” si es par EC CPE dir 3 9/18 A “dir” si es par EA JPE dir 3 7/10

A “dir” si el signo es “+” F4 CP dir 3 9/18 A “dir” si el signo es “+” F2 JP dir 3 7/10

A “dir” si el signo es “–” FC CM dir 3 9/18 A “dir” si el signo es “–” FA JM dir 3 7/10

Retornos De Rutinas Dirección “dir” → PC E9 PCHL dir 3 6

Incondicional C9 RET dir 3 18 Reiniciaciones

si hay acarreo D8 RC dir 3 6/12 En posición 0 de la interrupción C7 RST 0 1 12

si no hay acarreo D0 RNC dir 3 6/12 En posición 1 de la interrupción CF RST 1 1 12

si es cero C8 RZ dir 3 6/12 En posición 2 de la interrupción D7 RST 2 1 12

si no es cero C0 RNZ dir 3 6/12 En posición 3 de la interrupción DF RST 3 1 12

si es impar E0 RPO dir 3 6/12 En posición 4 de la interrupción E7 RST 4 1 12

si es par E8 RPE dir 3 6/12 En posición 5 de la interrupción EF RST 5 1 12

si el signo es “+” F0 RP dir 3 6/12 En posición 6 de la interrupción F7 RST 6 1 12

si el signo es “–” F8 RM dir 3 6/12 En posición 7 de la interrupción FF RST 7 1 12

I N S T R U C C I O N E S P A R A M A N E J O D E P I L A INSTRUCCIONES DE ENTRADA/SALIDA/CONTROL

Empuja B y C en la pila C5 PUSH B 1 12 Deshabilitar interrupciones F3 DI 1 4

Empuja D y E en la pila D5 PUSH D 1 12 Habilitar interrupciones FB EI 1 4

Empuja H y L en la pila E5 PUSH H 1 12 No opere 00 NOP 1 4

Empuja PSW en la pila F5 PUSH PSW 1 12 Detener la operación del micro 76 HLT 1 5

Recupera B y C de la pila C1 POP B 1 10 port → A DB IN port 2 10

Recupera D y E de la pila D1 POP D 1 10 A → port D3 OUT port 2 10

Recupera H y L de la pila E1 POP H 1 10 Leer mascarilla de interrupciones 20 RIM 1 4

Recupera PWS de la pila F1 POP PSW 1 10 Fijar mascarilla de interrupciones 30 SIM 1 4

Intercambia H y L con tope pila E3 XTHL 1 16

HL → SP F9 SPHL 1 6

Notas: B = Numero de bytes ocupados por la instrucción en la memoria de programa.

C = Numero de estados de reloj (T) empleados por la instrucción. Cuando hay mas de una especificación (7/10, 9/18, 6/12) la 1era se da si no hay

salto y la 2da si hay salto.

d8, d16 = Dato de 8 o 16 bits , o sea, ocupa 1 o 2 bytes, dir = Dirección de memoria (16 bits)

Memoria(HL) o Memoria(dir) = Indica contenido de la dirección de memoria apuntada por HL o dir (Ver nota anterior)

Page 60: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

CÓDIGO DE OPERACIÓN ASOCIADO A CADA NEMÓNICO

0 1 2 3 4 5 6 7 8 9 A B C D E F

0 NOP MOV B, B MOV D, B MOV H, B MOV M, B ADD B SUB B ANA B ORA B RNZ RNC RPO RP

1 LXI B LXI D LXI H LXI SP MOV B, C MOV D, C MOV H, C MOV M, C ADD C SUB C ANA C ORA C POP B POP D POP H POP PSW

2 STAX B STAX D SHLD STA MOV B, D MOV D, D MOV H, D MOV M, D ADD D SUB D ANA D ORA D JNZ JNC JPO JP

3 INX B INX D INX H INX SP MOV B, E MOV D, E MOV H, E MOV M, E ADD E SUB E ANA E ORA E JMP OUT XTHL DI

4 INR B INR D INR H INR M MOV B, H MOV D, H MOV H, H MOV M, H ADD H SUB H ANA H ORA H CNZ CNC CPO CP

5 DCR B DCR D DCR H DCR M MOV B, L MOV D, L MOV H, L MOV M, L ADD L SUB L ANA L ORA L PUSH B PUSH D PUSH H PUSH PSW

6 MVI B MVI D MVI H MVI M MOV B, M MOV D, M MOV H, M HLT ADD M SUB M ANA M ORA M ADI SUI ANI ORI

7 RLC RAL DAA STC MOV B, A MOV D, A MOV H, A MOV M, A ADD A SUB A ANA A ORA A RST 0 RST 2 RST 4 RST 6

8 MOV C, B MOV E, B MOV L, B MOV A, B ADC B SBB B XRA B CMP B RZ RC RPE RM

9 DAD B DAD D DAD H DAD SP MOV C, C MOV E, C MOV L, C MOV A, C ADC C SBB C XRA C CMP C RET PCHL SPHL

A LDAX B LDAX D LHLD LDA MOV C, D MOV E, D MOV L, D MOV A, D ADC D SBB D XRA D CMP D JZ JC JPE JP

B DCX B DCX D DCX H DCX SP MOV C, E MOV E, E MOV L, E MOV A, E ADC E SBB E XRA E CMP E IN XHCG EI

C INR C INR E INR L INR A MOV C, H MOV E, H MOV L, H MOV A, H ADC H SBB H XRA H CMP H CZ CC CPE CM

D DCR C DCR E DCR L DCR A MOV C, L MOV E, L MOV L, L MOV A, L ADC L SBB L XRA L CMP L CALL

E MVI C MVI E MVI L MVI A MOV C, M MOV E, M MOV L, M MOV A, M ADC M SBB M XRA M CMP M ACI SBI XRI CPI

F RRC RAR CMA CMC MOV C, A MOV E, A MOV L, A MOV A, A ADC A SBB A XRA A CMP A RST 1 RST 3 RST 5 RST 7

Page 61: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Instrucciones Para Transferencia De Datos Con El 8085:

Estas ocupan la mayor parte del conjunto de instrucciones del microprocesador 8085 y

básicamente posee cuatro tipos:

1) De movimiento. MOV: Realizan transferencias entre los registros internos del micro:

MOV r1, r2

Siendo: r1 = El registro interno destino (A, B, C, D, E, H o L).

r2 = El registro interno origen (A, B, C, D, E, H o L).

O desde una posición de memoria a cualquiera de los registros internos y viceversa:

MOV r, M

Siendo: r = El registro interno destino (A, B, C, D, E, H o L).

M = La posición de memoria origen, apuntada por los registros HL.

MOV M, r

Siendo: M = La posición de memoria destino, apuntada por los registros HL.

r = El registro interno origen (A, B, C, D, E, H o L).

Ejemplo de transferencia de datos con la memoria:

Las instrucciones de movimiento con la memoria son un claro ejemplo del direccionamiento

indirecto, ya que en la instrucción se indica la dirección donde se encuentra el dato a mover, por

medio de la pareja de registros HL y no directamente.

2) De movimiento inmediato. MVI: Carga el dato especificado por la instrucción, en un

registro interno del micro:

MVI r, dato

Siendo: r = El registro destino (A, B, C, D, E, H o L).

dato = Número o Byte a ser cargado en el registro.

O carga el dato especificado por la instrucción, en una posición de memoria:

MVI M, dato

Siendo: M = La posición de memoria destino, apuntada por los registros HL.

dato = Byte a ser cargado en la posición de memoria.

11001100 3080

307F

30h 80h

H L

10101010

C

Memoria de datos

Registros

internos

Antes de la instrucción

11001100 3080

307F

11001100

C

Memoria de datos

Después de la instrucción

MOV C, M

10101010 3080

307F

10101010

C

Memoria de datos

Después de la instrucción

MOV M, C

Page 62: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Ejemplo de movimiento inmediato de datos a la memoria:

3) De carga extendida inmediata. LXI: Carga el dato de 16 bits especificado por la instrucción,

en los registros pares internos al micro incluyendo el SP:

LXI rp, dato16

Siendo: rp = Los registros pares destino (BC, DE, HL o SP).

Dato16 = Número de 16 bits o 2 Byte a ser cargados en los registros pares.

Ejemplo de carga extendida inmediata:

4) De almacenamiento e intercambio. STA, STAX, LDA, LDAX, LHSD, SHSD y SPHL:

Estas cumplen dos funciones básicas, que son:

A.- Cargar (load) datos desde la memoria hasta los registros internos “A” o “HL”.

LDAX rp

Siendo: rp = Los Registros pares, (BC, DE o HL), que indican la dirección de memoria

donde se encuentra el dato a cargar en “A”.

LDA dir

Siendo: dir = Dirección de memoria donde se encuentra el dato a cargar en “A”.

LHLD dir

Siendo: dir = Dirección de memoria donde se encuentra el dato a cargar en “H” y “L”.

Esta carga a “L” con el contenido de “dir” y a “H” con el contenido de la

dirección siguiente, es decir, “dir + 1”.

00h 00h

B C

Registros internos

Antes de la instrucción Después de la instrucción

LXI B, 3050 30h 50h

B C

Registros internos

0000000 3080

307F

30h 80h

H L

Memoria de datos

Registros

internos

Antes de la instrucción

50 3080

307F

Memoria de datos

Después de la instrucción

MVI M, 50

Page 63: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

B.- La segunda función es almacenar (store) los contenidos de los registros “A” o “HL” en la

memoria.

STAX rp

Siendo: rp = Registros pares (BC, DE o HL) que indican la dirección donde almacenar el

contenido de “A”.

STA dir

Siendo: dir = Dirección de memoria donde almacenar el contenido de “A”.

SHLD dir

Siendo: dir = Dirección de memoria donde almacenar el contenido de “H” y “L”. Esta almacena a

“L” en la posición dada por “dir” y a “H” en la posición de la dirección siguiente.

Las primeras instrucciones, tanto en “A.- ” y “B.-” utiliza direccionamiento indirecto, ya que

en estas se indica la dirección por medio de los registros pares del micro y las dos restante utilizan

direccionamiento directo, ya que se indica directamente la dirección.

Ejemplo de carga y almacenamiento indirecto del registro A con la memoria:

Ejemplo de carga y almacenamiento directo del registro A con la memoria:

Antes de la instrucción Después de la instrucción

LDA 4052h

4Eh

A

Memoria de datos

Después de la instrucción

STA 4052h

4Eh 4052

4051

4053

¿?

¿?

4Eh

A

Memoria de datos

60h 4052

4051

4053

¿?

¿?

60H

A

Memoria de datos

60h 4052

4051

4053

¿?

¿?

Antes de la instrucción Después de la instrucción

LDAX B

4Eh

A

Memoria de datos

Después de la instrucción

STAX B

4Eh 4052

4051

4053

¿?

¿?

Registros

internos

4Eh

A

Memoria de datos

60h 4052

4051

4053

¿?

¿?

40h 52h

B C

60H

A

Memoria de datos

60h 4052

4051

4053

¿?

¿?

Page 64: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Ejemplo de carga y almacenamiento de los registros H y L con la memoria:

Una instrucción adicional, que posee el 8085 es la de intercambiar los contenidos de los

registros pares “DE” y “HL”:

XCHG

Ejemplo de intercambio de los registros “HL” y “DE”:

Instrucciones Aritméticas y Lógicas Con El 8085:

En el microprocesador 8085 estas instrucciones almacenan el resultado en el registro “A”, a

menos que se indique lo contrario, además cabe destacar que estas instrucciones modifican los bits

del registro “estatus”. Las instrucciones aritmético lógicas se dividen como sigue:

1) Instrucciones de adición o suma:

A.- La suma binaria ADD: Realizan la suma de cualquiera de los registros internos del micro

con el acumulador “A” sin considerar el acarreo:

ADD r

Siendo: r = Los registros internos del micro (A, B, C, D, E, H o L).

O la suma de una posición de memoria con el acumulador “A”:

ADD M

Siendo: M = La posición de memoria, señalada por los registros HL.

Antes de la instrucción Después de la instrucción

XCHG

Registros

internos

3Fh 43h

D E

50h 20h

H L

Registros

internos

50h 20h

D E

3Fh 43h

H L

Antes de la instrucción Después de la instrucción

SHLD 4052h

Después de la instrucción

Registros

internos

Memoria de datos

50h 4052

4051

4053

¿?

7Fh

3Fh 43h

H L

Memoria de datos

43h 4052

4051

4053

¿?

3Fh

Registros

internos

3Fh 43h

H L

LHLD 4052h

Memoria de datos

50h 4052

4051

4053

¿?

7Fh

Registros

internos

7Fh 50h

H L

Page 65: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

B.- La suma binaria con acarreo ADC: Realizan la suma de cualquiera de los registros internos

del micro y el acarreo con el acumulador “A”:

ADC r

Siendo: r = Los registros internos del micro (A, B, C, D, E, H o L).

O la suma de una posición de memoria con “A”:

ADC M

Siendo: M = La posición de memoria, señalada por los registros HL.

Ejemplo de la suma con acarreo:

C.- La suma binaria inmediata ADI: Suma en forma inmediata el dato especificado por la

instrucción con el contenido del acumulador “A”:

ADI dato

Siendo: dato = Número o Byte a ser sumado con el acumulador “A”.

D.- La suma binaria inmediata con acarreo ACI: Suma en forma inmediata el dato

especificado por la instrucción y el acarreo con el contenido del acumulador “A”:

ACI dato

Siendo: dato = Número o Byte a ser sumado con el acarreo y el acumulador “A”.

E.- La suma binaria doble DAD: Realizan la suma de cualquiera de los registros pares del

micro con el par de registros “HL”, el resultado se almacena en “HL”:

DAD rp

Siendo: rp = Registros pares (BC, DE o HL) que se suma al registro par HL.

2) Instrucciones de sustracción o resta:

A.- La resta binaria SUB: Restan cualquiera de los registros internos del micro del contenido

del acumulador “A”, sin considerar el préstamo:

SUB r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O restan el contenido de una posición de memoria del contenido del acumulador “A”:

Después de la

Instrucción

ADC B

Registros

internos

10100001

A

10100010

B

¿ ¿ - ¿ - ¿ 1

S Z AC P CY

Registros

internos

01000100

A

10100010

B

¿ ¿ - ¿ - ¿ 1

S Z AC P CY

Antes de la

Instrucción

10100001 Acumulador

10100010 Registro B

+

1 Bit CY

+

01000100 Resultado 1

Operación suma

CY

Page 66: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

SUB M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

B.- La resta binaria con préstamo SUB: Restan cualquiera de los registros internos del micro y

el préstamo del acumulador “A”:

SBB r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O restan el contenido de una posición de memoria y el préstamo del contenido de “A”.

SBB M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

Ejemplo de la resta con préstamo:

C.- La resta binaria inmediata SUI: Resta el dato especificado por la instrucción del

acumulador “A”, sin considerar el préstamo:

SUI dato

Siendo: dato = Número o Byte a ser restado del acumulador “A”.

D.- La resta binaria inmediata con préstamo SBI: Resta el dato especificado por la instrucción

y el préstamo del contenido del acumulador “A”:

SBI dato

Siendo: dato = Número o Byte a ser restado del acumulador “A”.

3) Instrucciones de incremento y decremento:

A.- Incremento de registros INR: Incrementa en uno (1) el valor de cualquiera de los registros

internos del micro:

INC r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O incrementan en uno (1) una posición de memoria:

INC M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

Después de la

Instrucción

SBB C

Registros

internos

00000100

A

00000010

C

¿ ¿ - ¿ - ¿ 1

S Z AC P CY

Registros

internos

00000001

A

00000010

C

¿ ¿ - ¿ - ¿ 1

S Z AC P CY

Antes de la

Instrucción

0000 0010 Registro C

La operación resta se realiza

por complemento a dos

Com. a 2 de CY + 1

0000 0011 C – CY

0000 0100 Acumulador

Com. a 2 de C – CY + 1111 1101

1 0000 0001 A – (C – CY)

Page 67: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

O incrementan en uno (1) el valor de cualquiera de los registros pares internos del micro:

INX rp

Siendo: rp = Cualquiera de los registros pares del micro (BC, DE o HL).

B.- Decremento de registros DCR: Decrementan en uno (1) el valor de cualquiera de los

registros internos del micro:

DCR r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O decrementan en uno (1) una posición de memoria:

DCR M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

O decrementan en uno (1) el valor de cualquiera de los registros pares internos del micro:

DCX rp

Siendo: rp = Cualquiera de los registros pares del micro (BC, DE o HL).

Ejemplo de incremento de una posición de memoria:

4) Instrucciones Lógicas:

A.- Instrucción AND: Realiza el producto lógico del acumulador “A” con cualquiera de los

registros internos del micro:

ANA r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O con una posición de memoria:

ANA M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

O con el dato especificado por la instrucción:

ANI dato

Siendo: dato = Número o Byte inmediato en la instrucción.

Antes de la instrucción Después de la instrucción

INC M Registros

internos

Memoria de datos

3088 72h

30h 88h

H L

Registros

internos

Memoria de datos

3088 73h

30h 88h

H L

Page 68: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

B.- Instrucción OR: Realiza la suma lógica del acumulador “A” con cualquiera de los registros

internos del micro:

ORA r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O con una posición de memoria:

ORA M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

O con el dato especificado por la instrucción:

ORI dato

Siendo: dato = Número o Byte inmediato en la instrucción.

C.- Instrucción XOR: Realiza la operación o exclusivo del acumulador “A” con cualquiera de

los registros internos del micro:

XRA r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O con una posición de memoria:

XRA M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

O con el dato especificado por la instrucción:

XRI dato

Siendo: dato = Número o Byte inmediato en la instrucción.

D.- Comparación binaria CMP: Realiza una resta binaria del acumulador “A” (sin modificar el

contenido del acumulador) con cualquiera de los registros internos del micro:

CMP r

Siendo: r = Cualquier registro interno del micro (A, B, C, D, E, H o L).

O con una posición de memoria:

CMP M

Siendo: M = Es una posición de memoria, señalada por los registros HL.

O con el dato especificado por la instrucción:

CPI dato

Siendo: dato = Número o Byte inmediato en la instrucción.

Ejemplo la instrucción AND:

Antes de la instrucción Después de la instrucción

ANA C 00010000

A

00110101

C

00010000

A

00110101

C

0 0 - 1 - 0 0

S Z AC P CY

Page 69: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

Ejemplo la instrucción XOR:

E.- Instrucciones de rotación: Permiten hacer girar los bits del acumulador “A”, es decir,

desplazar internamente esos bits a la derecha o a la izquierda:

RRC o RLC

Incluyendo el bit de acarreo “CY”:

RAR o RAL

Ejemplo las instrucciones de rotación:

E.- Complementar el registro “A”: Permite negar o invertir el contenido del acumulador “A”:

CMA

F.- Complementar el acarreo “CY”: Permite invertir el contenido del acarreo “CY”:

STC Coloca en uno la bandera de acarreo

CMC Complementa la bandera de acarreo

G.- Ajuste decimal DAA: Permite ajustar los ocho bits contenidos en el acumulador “A” para

formar dos dígitos de cuatro bits de tipo BCD. Este utiliza el siguiente proceso:

CY Acumulador

Rotación a la izquierda (RLC)

CY Acumulador

Rotación a la izquierda con acarreo (RAL)

Rotación a la derecha (RRC)

Rotación a la derecha con acarreo (RAR)

CY Acumulador

CY Acumulador

Antes de la instrucción Después de la instrucción

00000111

A 10101010

A

Status

1 0 - 0 - 0 0

S Z AC P CY

Memoria de datos

8055 10101010

80h 55h

H L

XRA M

Memoria de datos

8055 10101010

Page 70: Guia de Microprocesadores Ujap

Prof. Yomarvys Osorio

1.- Si el valor de los cuatro (4) bits menos significativos del acumulador es mayor que nueve

(9), o si esta activa la bandera “AC”, se suma un seis (6) al acumulador.

2.- Si el valor de los cuatro (4) bits más significativos del acumulador es ahora mayor que

nueve (9), o si esta activa la bandera “CY”, se suma un seis (6) a los cuatro (4) bits más

significativos del acumulador.

Ejemplo la instrucción DAA:

Antes de la

instrucción Después de la

instrucción

10001111

A DAA 10010101

A

(9) (5)

+6