Sei sulla pagina 1di 114

UNIVERSIDAD DE TARAPACÁ

Escuela Universitaria de Ingeniería Eléctrica Electrónica

APUNTES DEL MICROPROCESADOR


8085
Programación en lenguaje Assembler

ED 15

AUTOR:
PAUL TERRAZAS L.
ARICA-CHILE
2016
INTRODUCCION

En este texto se dará una breve descripción de los componentes y funciones


del microprocesador, posteriormente se aprenderá las instrucciones del lenguaje
Assembler, y finalmente se realizará una serie de programas que se
implementarán en el laboratorio.

Cuenta con un breve resumen de la materia y las bases fundamentales en


programación .

He querido dejar los últimos programas planteados para que uds, puedan
modificarlos, he transcrito guías de anteriores semestres y material que me han
entregado algunos compañeros, mi objetivo en ningún caso es reemplazar las
clases del Profesor y por ende deben asistir a todas las clases porque allí se
tratarán temas puntuales y materias para las evaluaciones.

El aporte que dejo es para tener material específico del ramo,


MICROPROCESADORES de la EIEE, para su consulta en ramos futuros.

He creado un libro, llamado apuntes del microprocesador el que uso como base para
esta nueva edición.
I ARQUITECTURA DEL MICROPROCESADOR

1.-El computador

2.-Arquitectura de Von Newmann

3.-Arquitectura del microprocesador 8085

4.-Tri-state

5.- Bit
1. EL COMPUTADOR

En términos básicos un computador es una máquina de calculo que funciona a


base de un programa almacenado compuesto fundamentalmente por una unidad
de entrada, una unidad de salida, y una unidad llamada CPU. Un programa es un
conjunto de instrucciones que se escriben en forma secuencial. Estas instrucciones
se almacenan en memoria para que luego se ejecuten dependiendo del tipo de
instrucción.

Fig.1.-Ejemplo esquemático de un computador.

1.1.-IN: Esta unidad permite leer (READ) información por unidades de entrada,
como teclados, mouse, USB (Modo lectura), lector de disco, micrófono. Etc.

Tiene 2^8=256 puertas de entrada.

1.2.-CPU: La información es procesadada por esta unidad y almacenada en la


memoria principal.

1.3.-Memoria Principal: La CPU tiene una memoria principal que contiene, los
programas, datos, Stacks (Pila). Antes de ejecutar cualquier instrucción deberá
ser almacenada en la memoria principal. = 65536 direcciones.

1.4.-OUT: Luego de ser procesado la información se escribe (WRITE) por medio de


unidades de salida, como son el monitor, el parlante, la impresora, USB( modo
escritura), LED, motores, bombas, etc.
Tiene 2^8=256 puertas salida

1.5.- CRISTAL: Si el cristal posee una frecuencia de 6MHz su frecuencia de


operación será de 3MHz ya que tiene un divisor por 2.

Para encontrar el tiempo que tendrá en la ejecución de cualquier instrucción la


obtenemos de la relación entre la frecuencia y el tiempo.

Nuestro tiempo de respuesta es 0.33 para 6MHz.

2.-Arquitectura de Von Newmann

La mayoría de los sistemas informáticos actuales siguen al pie de la letra la


arquitectura propuesta por Von Newmann. Esta arquitectura se caracteriza porque
el programa que ejecuta el sistema está almacenado internamente en el propio
sistema.

La arquitectura de Von Newmann define los siguientes elementos:

(1) Unidad Central de Proceso (CPU - Central Processing Unit)


(2) Memoria principal
(3) Controlador de entrada salida
(4) Buses del sistema

-Bus de datos
-Bus de direcciones
-Bus de control
2.-Arquitectura Von Newmann

2.1.-Unidad Central de Proceso (CPU)

La CPU es el lugar en el que se procesa la información de acuerdo a las


instrucciones del programa. La CPU de un sistema informático repite una serie de
pasos en los que continuamente accede a memoria para leer la próxima instrucción
a ejecutar, realiza lo que ordena la instrucción y vuelve a empezar.

Cuando la CPU está implementada en un único circuito integrado se


llama microprocesador (µP).

En una CPU podemos distinguir:

2.1.1.-Unidad aritmético lógica (ALU Arithmetic and logical unit)

Se encarga de realizar las operaciones aritméticas (sumas, restas,


multiplicaciones, etc..) y lógicas (AND, OR, rotaciones, desplazamientos, etc...) con
los datos. Normalmente los datos con los que opera, así como los resultados de la
operación se encuentran en registros de la CPU.
Las operaciones que es capaz de realizar están definidas por el juego de
instrucciones de la CPU. Es posible encontrar ALUs con capacidades orientadas
hacia la operación con valores enteros, coma flotante o números imaginarios (por
ejemplo en las DSP.)

2.1.2.-Banco de registros

Proporciona un espacio de almacenamiento para los datos con los que trabaja la
CPU. Los registros se deben cargar con información que proviene de la memoria
principal antes de comenzar a operar, cuando se necesita dejar espacio libre en el
banco de registros para operar con nuevos datos su valor debe escribirse en la
memoria principal.
Operar con datos en el banco de registros es mucho más rápido que operar con
datos que se encuentran en la memoria principal, por eso, cuanto mayor sea el
banco de registros se requerirán menos trasvases con la memoria principal y la
tarea se realizará antes.

Es posible que no todos los registros tengan las mismas características.


Normalmente se distingue entre:

(1)Registros de datos: Guardan la información con la que se trabaja.


(2)Registros de direcciones: Guardan direcciones de memoria (en las que puede
haber datos).
(3)Registros de control: Controlan el estado de la CPU (flags: zero, overflow,
underflow, positivo/negativo...)

2.1.3-Unidad de control

Se encarga de leer las instrucciones máquina almacenadas en la memoria


principal y de generar las señales de control necesarias para controlar y coordinar
el resto de las unidades funcionales de un computador, con el fin de ejecutar las
instrucciones leídas.

2.1.3.1.- Partes fundamentales

(1)Contador de programa: Registro que apunta a la dirección de memoria de la


próxima instrucción a ejecutar. Se incrementa automáticamente después de
ejecutar cada instrucción.

(2)Registro de instrucción: Guarda la instrucción que se está ejecutando.


(3)Decodificador: Interpreta la instrucción a ejecutar.
(4)Reloj: Genera una señal de sincronía.
(5)Secuenciador: Activa en el orden adecuado las diferentes unidades funcionales
para ejecutar la instrucción.

2.1.3.2.-Los dos tipos más frecuentes de unidades de control son:

(1)Cableada: La lógica de las operaciones está implementada mediante hardware.


(2)Microprogramada: Se trata de una pequeña CPU en miniatura que puede
programarse para realizar diferentes tareas.
2.2.-Memoria principal

La memoria principal tiene por objeto guardar información que es accesible a


la CPU. La CPU puede leer y/o escribir datos en las diferentes posiciones de
memoria que componen la memoria principal.

La memoria principal tiene menor capacidad que la memoria secundaria (que


virtualmente es ilimitada), pero es mucho más rápida. Actualmente la memoria
principal se implementa mediante circuitos integrados. La memoria principal de
los sistemas informáticos suele estar formada por dos áreas diferenciadas:

2.2.1.-Memoria RAM (Random Access Memory): Memoria de acceso aleatorio (no


tiene porqué ser utilizada de manera secuencial) que permite tanto la lectura como
la escritura. Habitualmente en los sistemas informáticos se trata de un medio de
almacenamiento volátil, de manera que se pierde su contenido al cesar la
alimentación.

2.2.2.-Memoria ROM (Read Only Memory): Memoria de acceso aleatorio que sólo
permite la lectura de los datos que almacena. Se trata de un medio de
almacenamiento persistente, pues no pierde su contenido cuando cesa la
alimentación.

2.3.-Controlador de Entrada/Salida (I/O)

En la medida en la que el sistema informático precisa comunicarse con el


mundo exterior (utilizando diferentes periféricos), es necesario un elemento que
controle el flujo de información que entra y/o sale del sistema informático.

Los periféricos del sistema informático se pueden clasificar en:

2.3.1.-Periféricos de entrada: Si sirven para introducir información en el sistema


informático (ej. teclado, ratón...)

2.3.2.-Periféricos de salida: Si representan información que sale del sistema


informático (ej. monitor, impresora...)

2.4.-Buses del sistema

Transportan la información entre los diferentes elementos de la CPU. Se


distingue entre el bus de datos (que transporta la información que se está
procesando) y el bus de control (que proporciona toda la señalización necesaria
para realizar el trabajo de forma ordenada).
Desde el punto de vista electrónico un bus es una serie de pistas que
transportan información entre diferentes elementos. El número de líneas que tiene
el bus determina el número de bits que se pueden transportar en paralelo. Los
buses suelen ser elementos síncronos que funcionan gobernados por un reloj.

Normalmente en cada ciclo de reloj se transporta un dato (de 8, 16 o 32 bits


según la anchura del bus), también existen buses que realizan dos operaciones en
cada ciclo de reloj (utilizan tanto el flanco de bajada como el flanco de subida).

Ejemplo:
El bus PCI cuenta con la siguiente especificación:
 Ancho del bus: 32 bits

 Reloj: 33 Mhz
Fácilmente podemos calcular la cantidad máxima de información que puede
transportar en un segundo. Simplemente necesitamos multiplicar la información
que mueve en cada ciclo (32 bits = 4 Bytes) por el número de ciclos que tienen
lugar en un segundo (33*106).

Información por segundo: 4 Bytes * 33*106 = 132000000Bytes/s = 125.88MB/s

Si el bus fuese capaz de utilizar tanto el flanco de subida como el de bajada para
transmitir información, se doblaria la capacidad útil.

2.4.1.-Bus de datos:

Como su nombre indica transporta datos. Estos datos pueden ser la


información que se está procesando o las instrucciones del programa que se
ejecuta. Hay que recordar que en la arquitectura Von Newmann el
programa está guardado en el interior del sistema informático codificado
como información.
El ancho en bits del bus de datos define el tamaño de la palabra del sistema
informático, habitualmente es 8bits, 16bits, 32bits o 64bits.

2.4.2.-Bus de direcciones:

El bus de direcciones se utiliza para indicar el origen y/o el destino de


los datos. En el bus de direcciones se indica la posición de memoria a la que
se está accediendo en cada momento. Puede tratarse de una dirección de la
memoria principal o puede tratarse de una dirección de memoria en la que
está mapeado un periférico.
El ancho en bits del bus de direcciones determina el tamaño del espacio de
memoria direccionable.
2.4.3.-Bus de control:

El bus de control proporciona señales para coordinar las diferentes


tareas que se realizan en el sistema informático.
Algunas de las señales que podemos encontrar:
 CLK: Frecuencia de reloj
 CS (Chip select): Activa el chip a utilizar
 READY: Está disponible el o no el dispositivo
 R/W: Se trata de una operación de lectura o escritura

3.-Arquitectura del microprocesador 8085

El microprocesador 8085 esta construida en base a la Arquitectura Von Newmann


y debido a eso, está constituido básicamente por tres grandes bloques:

(1)Unidad de control (CU)

(2) Registros internos del microprocesador (RI),

(3)Unidad aritmético-lógica ALU.


3.1-Unidad de control o Control Unit (CU).

La unidad de control es un bloque de lógica cableada dentro del circuito


integrado (CI). Esta parte del sistema controla y sincroniza las transferencias de
datos y las operaciones que se realizan con ellos.
Regula la función básica del microprocesador consistente en la búsqueda y
posterior ejecución de instrucciones.

Esta operación es cíclica mientras no se interrumpa mediante una instrucción


de paro (HALT).

En el estado de búsqueda se transfiere una instrucción desde la memoria


hasta el microprocesador y en el estado de ejecución se realiza esta operación.

3.2.- Registros internos del microprocesador.

El 8085 tiene una serie de registros de propósito general denominados B, C, D,


E, H y L, de 8 bits, se trata de una serie de registros que emplea la ALU para
manipular datos. y en ocasiones pueden ser utilizados como registros pares de dos
en dos, BC, DE, HL, almacenando así palabras o informaciones de 16 bits.

3.2.1-Registros de direccionamiento.

Hay también un bloque de Registros Internos de 16 bits que también son


llamados registros de direccionamiento. Están conectados al bus de direcciones y
suele haber dos registros de este tipo que son:

Contador del Programa o Program Counter(PC), de 16 bits el Stack Pointer o


puntero de pila (SP) de 16 bits.

(1) El Contador de Programa o Program Counter (PC).


El Contador de Programa, es un registro denominado abreviadamente PC, es
imprescindible en todos los microprocesadores. Contiene la dirección de la siguiente
instrucción que deba ejecutarse.

Su contenido se va incrementando a medida que las instrucciones van siendo


ejecutadas y puede alterarse cuando aparece la instrucción HALT (paro) o La señal
de RESET, que coloca al PC a cero e inicializa la ejecución del programa.

(2) El Puntero de Pila, o STACK POINTER (SP)

El Puntero de Pila, denominado abreviadamente SP, es indispensable


durante el desarrollo de programas tanto para trabajar con interrupciones como
para el tratamiento de subrutinas. El contenido del SP señalará en todo momento a
la cima de la pila. (La pila estará constituida por un bloque de memoria RAM,
donde se almacenarán de forma temporal los datos.
La Pila que usamos es de tipo L.I.F.O, Lost In First Out, es decir lo último que
ponemos es lo último que usamos, a diferencia del F.I.F.O, First In First Out, este
último lo primero que ponemos es lo primero que usamos.

3.3.- ALU- Unidad Aritmética Lógica en el microprocesador


El bloque fundamental del microprocesador es el llamado ALU, representa la
parte del microprocesador que realiza las operaciones aritméticas y lógicas. Para
llevar a cabo este proceso emplean normalmente un registro especial denominado
Acumulador (Acc) donde almacenan el resultado de las operaciones realizadas.

Para completar las indicaciones necesarias tras la ejecución de las


instrucciones, el microprocesador emplea además un registro especial de 8 bits
denominado Registro de Estado o Registro de Flags que marcarán distintas
características de las operaciones desarrolladas.

3.3.1.- FLAGS
La denominación y situación de cada flag se muestra en el siguiente esquema.

S Z X AC X P X CY

S: (Signo)
S es el flag de signo. Si el resultado es negativo S=1y si el resultado del flag es
positivo S=0. Considerando que el bit más significativo es el que se toma como bit
de signo.

Ejemplo: Ejemplo:

0000 0101 0000 0101

+0000 0011 + 1000 0011

0000 1000 S=0 1000 1000 S=1

Z: (Cero)

Z es el señalizador de cero. Si el resultado es cero, Z=1 y si el resultado es


diferente de cero, Z=0.

Ejemplo: Ejemplo:

0000 0101 0000 0000

+0000 0011 + 0000 0000

0000 1000 z=0 0000 0000 z=1

P: (Paridad )

P es el flag de paridad. Si el resultado es par, P= 1, y si el resultado es impar,


P=0. Aquí es importante recalcar que se refiere a la cantidad de ’s que hay en un
resultado de una operación. Por ejemplo 1011 es impar porque hay 3 unos, y 0101
es par porque hay 2 unos, independiente del valor binario que pueda tener.
Ejemplo: Ejemplo:

0000 0101 0000 1001

+0000 0011 + 1100 0000

0 000 1000 P=0 1 100 1001 P=1

AC: (Carry auxiliar)

CY es el señalizador de arrastre. Si hay carry auxiliar AC=1 y si no hay carry


auxiliar AC=0. El carry auxiliar está en la 5ta posición.

Ejemplo: Ejemplo:

1 []

0000 1111 0100 0100

+0000 0001 + 0000 1000

0001 0000 AC=1 0000 1100 AC=0

CY: (Carry)

CY es el señalizador de arrastre. Si hay carry Cy=1. Si no hay carry Cy=0


Ejemplo: Ejemplo:

1000 0000 0100 0100

+1000 1000 + 0000 1000

1 0000 1000 Cy=1 0000 1100 Cy=0

3.4.-Buses del microprocesador


(1) Bus de dirección: El microprocesador posee un bus de dirección. Este bus es un
conjunto de líneas unidireccionales que sirven para identificar una dirección, se cuenta
con 16 bits, es decir = 65536 direcciones. Nota: Si consideramos el cero como posición
serian 65535 posiciones k

(2) Bus de datos: Posee un Bus de datos de 8 bits que intercambian información
entre sus distintos bloques internos y para comunicarse con el exterior.

(3) Bus de control: compuesto por una serie de líneas, variable en número según el
componente de que se trate. Contiene las líneas de sincronización de funciones,
pudiendo ser unas de salida y otras de entrada al microprocesador. Algunas
señales de control pueden ser, las de lectura, escritura, reloj o clock, etc.

READ Toda información de lectura se encuentra en la puerta de entrada


(IN).

WRITE Toda información de escritura se encuentra en la puerta de salida


(OUT).

Io/ = Identifica si se refiere a la puerta (IN/OUT) o a la memoria. Se señala 1 si


la operación es en la puerta o 0 si la operación es en la memoria.
Fig.-Figura de ejemplo bus de control.

Ejemplo: Se desea leer una información en la puerta.

( Estamos leyendo información RD=1 )

(No estamos escribiendo información por lo tanto

WR=0 )

(Como estamos leyendo información en la puerta y no en la memoria,


este será 1. Si estuviéramos leyendo información en la memoria este sería 0)

Ejercicios resueltos

Si se desea escribir en la puerta , ,

Si se desea leer en la memoria , ,

Si se desea escribir en la memoria , ,


4.-TRI-STATE : Dispositivo lógico que posee tres estados, 1, 0 y alta impedancia. Se
usa cuando se toma dos o más salidas conectadas en forma paralela.

C A X

0 0 1

0 1 0

1 X

5.- bit
Un es la unidad mínima de información empleada en informática, en cualquier
dispositivo digital, o en la teoría de la información, es una señal electrónica que
puede estar encendida (1) o apagada (0).

5.1.-Byte

Byte, término creado por Werner Buchholz como una unidad de información
digital equivalente a ocho bits. La palabra byte proviene de bite, que significa
mordisco, como la cantidad más pequeña de datos que un ordenador podía
"morder" a la vez. El símbolo de byte es un B mayúscula, para distinguir de bit,
cuyo símbolo es b minúscula.

Cada Byte representa un solo carácter de texto en un ordenador. Pueden ser


letras, símbolos, números, signos de puntuación, caracteres especiales, etc. y
codifica diferentes informaciones en un mismo equipo, dependiendo de la
cantidad.

1 Bytes –> 8 bits

2 Bytes -> 16 bits

4 Bytes -> 32 bits


Ejemplo:

1 byte -> 1111 1111 = FF H ( 8bits )

2 bytes -> 1111 11111 1111 1111 = FFFF H (16 bits)

Recapitulando

Los registros son posiciones de memoria que almacenan información, los


datos son operandos en donde actúa los programas y los programas son un
conjunto de instrucciones. Cada registro tiene 8 bits, que al ser operados como
paridad par tendrán 16 bits.

A : Acumulador
F : Flags
B,C,D,E,H,L: Registros generales
PC : Program Counter
SP : Stack Pointer
HL : Apuntador datos de memoria.

*Nota: Cuando nos referimos a un numero acompañado de una H estamos


hablando de un valor HEXADECIMAL. Ej: 10H se refiere al numero 0001 0000 b

EL Lenguaje Assembler, son un conjunto de nemónicos que nos indican las


instrucciones que se van a ejecutar. Estas instrucciones son llevadas a un
ensamblador que convierte los nemónicos a un nivel binario, de tal forma que la
maquina pueda entender las instrucciones dadas.
II PROGRAMACION EN LENGUAJE ASSEMBLER

2.1.- Set de instrucciones del microprocesador 8085

2.2.-Set op.code

2.3.-Tamaño de instrucciones

2.4.-Diagrama de flujo y programación

2.5.- Ejercicios resueltos y compilados

2.6.-Ejercicios de tiempo de retardo

2.7.- Metodo de columnas.

2.8.-Método del flujograma.


INDICE DE LAS INSTRUCCIONES DEL MICROPROCESADOR 8085

1 MOV 21 ANA 41 JP 61 RST

2 MVI 22 ANI 42 JPE 62 EI

3 CMP 23 XRA 43 CALL 63 DI

4 CPI 24 XRI 44 CC 64 IN

5 LXI 25 ORA 45 CNC 65 OUT

6 STAX 26 ORI 46 CZ 66 HLT

7 STA 27 CMC 47 CNZ 67 PUSH

8 LDAX 28 STC 48 CM 68 POP

9 LDA 29 DAA 49 CP 69 DAD

10 INR 30 NOP 50 CPE 70 XCHG

11 INX 31 RLC 51 CPO 71 XTHL

12 DCR 32 RRC 52 RET 72 SPHL

13 DCX 33 RAL 53 RC 73 SHLD

14 ADD 34 RAR 54 RNC 74 LHLD

15 ADC 35 JMP 55 RZ 75 SBB

16 ADI 36 JC 56 RNZ 76 DAD

17 ACI 37 JNC 57 RM 77 ,ORG, data, Db, BW

18 SUB 38 JZ 58 RP

19 SUI 39 JNZ 59 RPE

20 SBI 40 JM 60 RPO

Fuente: https://es.scribd.com/document/337573426/SET-de-Instrucciones-Del-8085

Nota del autor: Para programar en Lenguaje Assembler se necesita


dominar las instrucciones de memoria, y requiere muchas horas de
programación.
INSTRUCCIONES DEL MICROPROCESADOR 8085
1 MOV R1, R2 Movimiento Direccionamiento registro.

Bits afectados: MOV es una instrucción de 1 byte, El contenido del registro R2 es transferido al registro R1.
Direccionamiento: R1 y R2 pueden ser los registros B, C, D, E, H, L o el acumulador A.
Registro indirecto
Supongamos que el registro B contiene 00H y el egistro C contiene 30H
MOV B,C

almacenará 30H en el registro B.

Ejemplo anexo: Si A=15H, B=12H entonces:

MOV A,B ;Mueve el contenido del registro B al

Acumulador

Resultado: A=12H, B=12H, debido a que es una operación de lectura, en B no se destruye la


información y queda con 12H, al contrario que en A, se destruye la información porque una
operación de escritura.

MOV Reg, M Direccionamiento registro indirecto.

El contenido de la dirección de memoria, cuya dirección está en los registros H-L, es


transferido al registro R. R puede ser cualquiera de los registros A, B, C, D, E, H o L.

Ejemplo: Si H=18H, L=AAH

Entonces MOV A,M mueve el contenido de la posición de memoria indicado por el registro
HL=18AAH al acumulador.

Posición de memoria .

HL= 18 AA H 55H

Resultado: A=55H

MOV M, Reg
Direccionamiento registro indirecto.
El contenido del registro R es transferido a la dirección de memoria indicada por los
registros H-L.
Supongamos que el registro H contiene 00H y el registro L contiene 30H. La instrucción
MOV M, A

almacenará el contenido del acumulador en la posición de memoria 0030H.

Ejemplo anexo: Si C=4AH y considerando que HL=18AAH y el contenido en esa posición


de memoria es 55H. Resultado: M=4AH

..
Posición de memoria

HL= 18 AA H 55H 4AH


.
2. MVI Reg, dato Cargar un registro con un dato Inmediato
MVI es una instrucción de 2 bytes, el primer operando debe ser uno de los registros A, B,
Bits afectados: C, D, E, H o L, que será cargado con el dato especificado en el segundo operando (DATO). El
Direccionamiento: dato no debe exceder de un byte.
Inmediato La instrucción:
MVI H, 33H

carga en el registro H el valor 33H, mientras que La instrucción


MVI L, 44H

carga en el registro L el valor 44H.

MVI M, dato
Cargar en la posición de memoria contenida por el registro H-L un dato inmediato

Supuestos los dos ejemplos anteriores, la instrucción

MVI M, 2AH

carga en la posición de memoria 3344H (dirección aportada por los registros H y L) el valor
2AH.

3 CMP Reg Comparar registro o memoria con acumulador.


El contenido del registro o posición de memoria especificados se compara con el
contenido del acumulador. Esta comparación se realiza restando internamente el contenido del
registro al del acumulador, permaneciendo éste invariable, y colocando los bits de condición en
función del resultado. Concretamente, el bit de cero se pone a uno si las cantidades comparadas
son iguales, y se pone a cero si son desiguales.

Si el acumulador almacena 0AH y el registro B contiene 05H


CMP B
Compara B con el acumulador efectuando una resta interna.
El registro B contiene 05H, se complementa a 2.

Registro 05H 0 0 0 0 0 1 0 1
Comp. 1 C-1: 1 1 1 1 1 0 1 0
Comp. 2 C-2: + 1
Dato comp. FBH 1 1 1 1 1 0 1 1

Acc 0AH: 0 0 0 0 1 0 1 0
Dato comp. FBH: 1 1 1 1 1 0 1 1
+
Nuevo Acc 05H 0 0 0 0 0 1 0 1

Z=0 Cy=0

CMP X>Y X=Y X<Y


*Nota: Acc=acumulador Comp=complemento

Z 0 1 0

Cy 0 0 1
4. CPI dato Comparar el contenido del acumulador con un dato Inmediato.

Flags afectados: Z, S, Compara el valor del byte especificado con el contenido del acumulador y posiciona los bits
P, CY, AC de cero y acarreo para indicar el resultado. El bit de cero indica igualdad.
Direccionamiento: Un 0 en el acarreo indica que el contenido del acumulador es mayor que DATOS.
Registro indirecto. Un 1 en el acarreo indica que el acumulador es menor que DATOS. Sin embargo, el
significado del bit de acarreo es contrario cuando los valores tienen diferente signo o cuando
uno de los valores está complementado.
El valor de DATOS no debe exceder de un byte.
Si tenemos la secuencia de instrucciones

(1).MVI A, 25H
(2).CPI 20H

La instrucción (1) carga en el acumulador el valor 25H.


La instrucción (2) realiza la siguiente operación de suma (tomando el complemento a dos del
dato inmediato, es decir, E0H):

Dato 20H 0 0 1 0 0 0 0 0
Comp. 1 C-1: 1 1 0 1 1 1 1 1
Comp. 2 C-2: + 1
Dato comp. E0H 1 1 1 0 0 0 0 0

Acc 25H: 0 0 1 0 0 1 0 1
Dato comp E0H: + 1 1 1 0 0 0 0 0
Nuevo Acc 05H 0 0 0 0 0 1 0 1

Cy=1

CPI X>Y X=Y X<Y

Z 0 1 0

Cy 0 0 1

5. LXI Reg, Dato LXI(Load Extended inmediate) es una instrucción de 3 bytes;

El primer operando debe especificar el par de registros a ser cargados, pueden ser los pares
BC, DE, HL, o el SP.

El segundo operando especifica los dos bytes a ser cargados.


LXI es la única instrucción inmediata que acepta un valor de 16 bits. El resto trabajan con datos
de 8 bits.
Si el par de registros especificados es SP, el segundo byte de la instrucción sustituye a los 8
bits menos significativos del puntero de pila, mientras que el tercer byte de la instrucción
reemplaza a los 8 bits más significativos del puntero de pila. Ejemplo:

1. La instrucción carga en el registro B el valor 00H y en el registro C el valor FFH.

LXI B, 00FFH

2. La siguiente instrucción carga en el puntero de pila el valor 1000H

LXI SP, 1000H


6. STAX Reg Almacena el contenido del acumulador
STAX es una instrucción de 1 bytes; El contenido del acumulador se almacena en la
posición de memoria especificada por los registros B y C, o los registros D y E.
Si el registro B contiene 3FH, el registro C contiene 16H, y el acumulador tiene 1FH, la
instrucción

STAX B

almacenará el contenido del acumulador en la posición de memoria del registro 3F16H.

Posición de memoria

BC= 3F16 H 1FH

7. STA DIR Almacenamiento directo desde el Acumulador

STA es una instrucción de bytes; STA DIR almacena una copia del contenido actual del
acumulador en la posición de memoria especificada por DIR.

Si A=1FH, La instrucción que se muestra introduce el contenido del acumulador en la posición


de memoria 0080H:

STA 0080H

Posición de memoria .
.
0080 H 1FH
.

Podemos concluir que tanto STAX como STA almacenan el contenido del acumulador en la
posición de memoria, y lo realizaran por medio de un registro o por medio de una dirección
respectivamente.

8. LDAX Reg Cargar el acumulador.


El contenido de la posición de memoria especificada por los registros B y C, o los registros
D y E, reemplaza el contenido del acumulador.
Si el registro D contiene 3FH y el registro E contiene 16H, la instrucción
LDAX D

cargará en el acumulador el contenido de la posición de memoria 3F16H.

Posición de memoria .
.
3F16 H 10H
.

Resultado A=10H
9. LDA DIR Carga directa en el acumulador

LDA DIR carga el acumulador con el contenido de la memoria direccionada por DIR. La
dirección puede ser puesta como un número, una etiqueta previamente definida o una
expresión.

A continuación se introducen en el acumulador el contenido de la posición de memoria 1000H:

LDA 1000H

Posición de memoria .
.
1000 H 12H
.

Resultado A=12H

Podemos concluir que tanto LDAX como LDA cargan el acumulador con el contenido de la
posición de memoria. Lo realizaran por medio de un registro o por medio una dirección
respectivamente.

INR Reg Incrementar registro o memoria.


10. Bits afectados: Z, S, P, El contenido del registro o posición de memoria especificados se incrementa en una
AC unidad.
Si el registro A contiene 98H, la instrucción
Direccionamiento:
Registro indirecto INR A

hará que este registro contenga la cantidad 99H.

Incrementar par de registros o dirección


11. INX Reg El número de 16 bits contenido en el par de registros especificado se incrementa en una
unidad.
1. Suponiendo que los registros H y L contienen respectivamente 30H y 00H, la
instrucción
INX H
hace que el registro H contenga 30H y el registro L el valor 01H.

2. Si el puntero de pila contiene FFFFH, la instrucción


INX SP

hace que éste contenga 0000H.

Decrementa registro o memoria.


12. DCR Reg El contenido del registro o posición de memoria especificados se decrementa en una
unidad.
Si el registro A contiene 99H, la instrucción

DCR A

hará que este registro contenga la cantidad 98H.


Decrementar par de registros
13. DCX Reg El número de 16 bits contenido en el par de registros especificado se decrementa en una
unidad.
Suponiendo que los registros H y L contienen respectivamente 30H y 00H, la instrucción

DCX H

hace que el registro H contenga 2FH y el registro L el valor FFH.

14. ADD Reg Sumar registro o memoria al acumulador (Suma Aritmética)


Bits afectados:Z, S,
P,CY, AC El contenido del registro o posición de memoria especificados se suma al contenido del
acumulador, usando aritmética de complemento a dos. El resultado se guarda en el
Direccionamiento: acumulador.
Registro
1. Si el registro B contiene el valor 3AH y el acumulador contiene 6CH, la instrucción
ADD B
realiza la siguiente suma:

Reg. B 3AH: 0 0 1 1 1 0 1 0
Acc 6CH: + 0 1 1 0 1 1 0 0
Nuevo Acc A6H 1 0 1 0 0 1 1 0

2. La instrucción
ADD A

duplica el contenido del acumulador.

ADC Reg Sumar registro o memoria al acumulador con acarreo.


15. Bits afectados:Z, S, El contenido del registro o posición de memoria especificados más el contenido del bit de
P,CY, AC acarreo, se suman al contenido del acumulador.
Supongamos que el registro B contiene el valor 30H, el acumulador 76H, y el bit de acarreo
Direccionamiento: está puesto a cero (Cy=0). La instrucción del microprocesador
Registro indirecto ADC C

realizará la siguiente suma:

Registro B 30H 0 0 1 1 0 0 0 0
Acc 76H: 0 1 1 1 0 1 1 0
Bit de acarreo :+ 0
Nuevo Acc A6H 1 0 1 0 0 1 1 0

El nuevo contenido del acumulador será A6H, mientras que todos los bits de condición
quedarán puestos a cero excepto los de signo y paridad. Si el bit de acarreo hubiera sido 1
(Cy=1) antes de realizar la operación, hubiera tenido lugar la siguiente suma

Registro B 30H 0 0 1 1 0 0 0 0
Acc 76H: 0 1 1 1 0 1 1 0
Bit de acarreo :+ 1
Nuevo Acc A7H 1 0 1 0 0 1 1 1

El acumulador contiene A7H y todos los bits de condición excepto el de signo, estaría puesto a
cero.

Sumar al acumulador un dato Inmediato.


16. ADI Dato
Bits afectados:Z, S, P, Suma el valor del byte especificado en la instrucción (DATOS), al contenido del
CY, AC acumulador y deja el resultado en el acumulador. El dato debe ser expresado en forma de
número, un ASCII constante, la etiqueta de un valor previamente definido o una expresión. El
dato no debe exceder de un byte.
Se utiliza aritmética de complemento a dos.

Ejemplo
A continuación presentamos un ejemplo con 3 instrucciones:

(1).MVI A, 34
(2).ADI 20
(3).ADI -20

En todas las instrucciones se utilizan datos en base decimal. Así, por ejemplo, en la
instrucción (2) el valor 20 es 14H.
La instrucción (1) carga en el acumulador el valor 22H.La instrucción (2) realiza la siguiente
suma

Acc 22H: 0 0 1 0 0 0 1 0
Dat. Inmediat. 14H: + 0 0 0 1 0 1 0 0
Nuevo Acc 36H 0 0 1 1 0 1 1 0

El bit de paridad se pone a uno y el resto se quedan a cero. La instrucción (3) restaura el valor
del acumulador realizando la siguiente suma:

Acc 36H: 0 0 1 1 0 1 1 0
Dat. Inmediat. ECH: + 1 1 1 0 1 1 0 0

Nuevo Acc 22H 0 0 1 0 0 0 1 0

Ahora los bits de paridad, acarreo y acarreo auxiliar se quedan a uno y el resto a cero.

ACI Dato Sumar al acumulador un dato Inmediato con arrrastre


17. Bits afectados: Suma el contenido del byte especificado (DATOS) en la instrucción, al contenido del
acumulador, añadiendo además el bit del acarreo. El resultado se almacena en el acumulador
(perdiéndose así el anterior contenido del Acumulador).
Z, S, P, CY, AC
El dato (DATOS) debe estar especificado en forma de número, en ASCII
constante, como etiqueta de un valor previamente definido o una Expresión. El dato no debe
exceder de un byte.

Tenemos las siguientes instrucciones:


(1).MVI A, 34 ; 22H Convierte en en 22 Hexadcimal
(2).ACI 20 ;20 En hexadecimal es 14H

y suponemos el bit de acarreo puesto a uno.


La instrucción (1) carga en el acumulador el valor 22H.
La instrucción (2) realiza la siguiente suma:
Acc 22H 0 0 1 0 0 0 1 0
20d 14H: 0 0 0 1 0 1 0 0
Bit de acarreo :+ 1
Nuevo Acc 37H 0 0 1 1 0 1 1 1
Todos los bits se ponen a cero.

18. SUB Reg


Bits afectados: Z, S, Direccionamiento:Registro indirecto
P,CY, AC El contenido del registro o posición de memoria especificados se resta al contenido del
acumulador, usando aritmética de complemento a dos. El resultado se guarda en el
acumulador.
Si no hay acarreo del bit de más peso, el bit de acarreo se pone a uno, y viceversa, al contrario
de lo que ocurre con la operación de suma.
Antes de entrar en los ejemplos recordamos que restar utilizando aritmética de
complemento a dos equivale a complementar cada bit del segundo operando y sumar 1.

Si el acumulador contiene 60H y el registro E contiene 28H, la instrucción

SUB E
realizará la siguiente operación de resta: (Registro B)+(-28H)

Registro 28H 0 0 1 0 1 0 0 0
Comp. 1 C-1: 1 1 0 1 0 1 1 1
Comp. 2 C-2: + 1
Dato comp. D8H 1 1 0 1 1 0 0 0

Acumulador 60H: 0 1 1 0 0 0 0 0
Dato comp. D8H: 1 1 0 1 1 0 0 0
+
Nuevo Acc 38H 0 0 1 1 1 0 0 0

A=38H

El acumulador obtiene un nuevo valor A=38H.

19. SUI Reg Restar del acumulador un dato Inmediato


Bits afectados: Z, S, El byte de datos inmediato se resta del contenido del acumulador usando aritmética de
P,CY, AC complemento a dos. El resultado se deja en el acumulador.
Ya que se trata de una operación de resta, el bit de acarreo se pone a uno cuando no hay
acarreo del bit de más peso, y se pone a cero si tiene dicho acarreo.
A continuación presentamos un ejemplo con 2 instrucciones:
(1).MVI A, B3H
(2).SUI B3H
La instrucción (1) carga en el acumulador el valor B3H.
La instrucción (2) realiza la siguiente suma (usando el complemento a dos del dato inmediato):

Registro B3H 1 0 1 1 0 0 1 1
Comp. 1 C-1: 0 1 0 0 1 1 0 0
Comp. 2 C-2: + 1
4DH 0 1 0 0 1 1 0 1

Dato comp.
Acumulador B3H: 1 0 1 1 0 0 1 1

Dato comp. 4DH: + 0 1 0 0 1 1 0 1

Nuevo Acc 00H 0 0 0 0 0 0 0 0

Como era de esperar el resultado final del acumulador es cero ya que le estamos restando su
propio valor. El valor 6DH del dato inmediato corresponde al complemento a dos del valor B3H
que estamos restando.
Debido a que existe desbordamiento del séptimo bit se produce acarreo y se pone el bit de
acarreo a cero. El bit de paridad se pone a uno mientras que los demás permanecen inactivos.

20. SBI
Restar del acumulador un dato Inmediato con arrastre

El bit de acarreo se suma internamente al byte de datos inmediato. El valor obtenido se


resta del contenido del acumulador usando aritmética de complemento a dos. El resultado se
deja en el acumulador.
Esta instrucción, al igual que SBB, se usa preferentemente para realizar restas multi-byte. Al
igual que en el apartado anterior, el bit de acarreo se pone a uno si no hay acarreo del bit de
más peso, poniéndose a cero si lo hay.
Tenemos las siguientes instrucciones:
(1).MVI A, 00H
(2).SBI 01H
y suponemos el bit de acarreo puesto a cero.
La instrucción (1) carga en el acumulador el valor 00H.
La instrucción (2) realiza la siguiente suma (usando el complemento a dos del dato inmediato):

Acumulador 00H 0 0 0 0 0 0 0 0
Dato inmed. FFH: 1 1 1 1 1 1 1 1
Bit acarreo :+ 0
Nuevo Acc. FFH 1 1 1 1 1 1 1 1

Cy=1
Z=0

Ca=0

No hay acarreo, por lo que el bit de acarreo se pone a uno. Los bits de cero y acarreo auxiliar
están a cero, mientras que los de signo y paridad se ponen a uno.

21. ANA Reg Direccionamiento:Registro indirecto


Bits afectados: Z, S,
P,CY, AC Función lógica AND entre registro o Memoria con acumulador
Se realiza la función lógica AND bit a bit entre el contenido del registro o posición de
memoria especificados y el contenido del acumulador. El bit de acarreo se pone a cero.

La tabla de verdad de la función lógica AND es:

A B F

0 0 0

0 1 0

1 0 0

1 1 1

Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción


ANA B
realiza la siguiente operación:Si el registro B contiene 6CH y el acumulador almacena 3AH, la
instrucción ANA B realiza la siguiente operación:

Acumulador 3AH: 0 0 1 1 1 0 1 0
Dato comp. 6CH: 0 1 1 0 1 1 0 0
Nuevo Acc 28H 0 0 1 0 1 0 0 0

A=28H

22. ANI Dato


Bits afectados: Z, S, Función lógica AND entre el acumulador y un Dato Inmediato.
P, CY, AC Realiza una operación Y lógica entre el dato (DATOS) especificado en la instrucción y el
contenido del acumulador, el resultado queda en el acumulador. Se pone a cero el bit de
acarreo. El dato, que no debe exceder de un byte, puede ser expresado en forma de número, un
ASCII constante, la etiqueta de algún valor previamente definido o una
Expresión.
Disponemos de las siguientes instrucciones:

(1).MVI A, A0H
(2).ANI 0FH

La instrucción (1) carga en el acumulador el valor A0H.


La instrucción (2) realiza la siguiente operación AND bit a bit entre el
acumulador y el dato inmediato 0FH:

Acumulador A0H: 1 0 1 0 0 0 0 0
Dato inmediato 0FH: 0 0 0 0 1 1 1 1
Nuevo Acc 00H 0 0 0 0 0 0 0 0

La instrucción ANI del ejemplo pone a cero los cuatro bits de mayor peso, dejando invariables
los cuatro menores. Ya que los cuatro bits de menor peso del acumulador eran cero, el
resultado final es 00H con lo que el bit de cero se pondrá a cero.

23. XRA Dato


Bits afectados: Z, S, Función lógica O-EXCLUSIVO entre registro o memoria con acumulador.
P, CY, AC Se realiza la función lógica O-EXCLUSIVO bit a bit entre el contenido del registro o posición de
memoria especificados y el contenido del acumulador, guardándose el resultado en este último.

La tabla de verdad de la función lógica O-EXCLUSIVO es:

A B F
0 0 0
0 1 1
1 0 1
1 1 0

1. Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción


XRA B

realiza la siguiente operación:

Acumulador 3AH: 0 0 1 1 1 0 1 0
Registro B 6CH: 0 1 1 0 1 1 0 0

Nuevo Acc 56H 0 1 0 1 0 1 1 0

La función O-EXCLUSIVO de cualquier bit con uno da lugar al complemento del mismo. Así, si el
acumulador contiene todo unos, la instrucción
XRA B
produce el complemento a uno del contenido del registro B, y lo guarda en el acumulador.

En algunas ocasiones, un byte se utiliza para reflejar los estados de ciertas condiciones dentro
de un programa, donde cada uno de los ocho bits puede responder a una determinada
condición de falso o verdadero, actuado o inhibido, etc.
Mediante la función O-EXCLUSIVO podemos determinar cuántos bits de la palabra han
cambiado de estado en un determinado lapsus de tiempo.

24. XRI Dato Bits 1.-Instrucción Función lógica O-EXCLUSIVO entre el acumulador y un dato Inmediato
afectados: Z, S, P, CY,
AC Se realiza la función lógica O-EXCLUSIVO bit a bit entre un byte de datos inmediatos y el
contenido del acumulador. El resultado se guarda en el acumulador. El bit de acarreo se pone a
cero.

Ejemplo
Esta instrucción se suele utilizar para complementar bits específicos del acumulador dejando
los restantes en su estado original. De este modo y suponiendo que el acumulador contiene
ABH, la instrucción
XRI 80H

complementa el bit de más peso del acumulador, tal y como se muestra en la siguiente figura:

Acumulador ABH: 1 0 1 0 1 0 1 1
Dato 80H: 1 0 0 0 0 0 0 0
inmediato
Nuevo Acc 2BH 0 0 1 0 1 0 1 1

25. ORA Reg Función lógica OR entre registro o memoria con acumulador
Bits afectados: Se realiza la función lógica AND bit a bit entre el contenido del registro o posición de
Z, S, P, CY, AC memoria especificados y el contenido del acumulador, quedando en este último el resultado. El
bit de acarreo se pone a cero. La tabla de verdad de la función lógica OR es:
Direccionamiento: A B F
Registro indirecto 0 0 0
0 1 1
1 0 1
1 1 1

Como sea que la función OR de cualquier bit con un uno da como resultado uno, y de cualquier
bit con cero, lo deja invariable, esta función se utiliza frecuentemente para poner a uno grupos
de bits.
Si el registro B contiene OFH y el acumulador almacena 33H, la instrucción
ORA B
realiza la siguiente operación:
Acumulador 33H: 0 0 1 1 0 0 1 1
Dato inmediato 0FH: 0 0 0 0 1 1 1 1
Nuevo Acc 3FH 0 0 1 1 1 1 1 1

Este ejemplo concreto garantiza que los cuatro bits de menos peso del acumulador son unos,
mientras que los demás permanecen invariables.

26. ORI dato Bits Función lógica OR entre el acumulador y un dato Inmediato.
afectados: Z, S, P, CY, ORI desarrolla una operación lógica OR entre el contenido especificado por DATOS y el
AC contenido del acumulador. El resultado se deja en el acumulador. Los bits de acarreo y acarreo
auxiliar se ponen a cero.
Ejemplo
Si el acumulador inicialmente contiene 3CH, la instrucción
ORI F0H

realiza la siguiente operación OR bit a bit:

Acumulador 3CH: 0 0 1 1 1 1 0 0
Dato inmediato F0H: 1 1 1 1 0 0 0 0
Nuevo Acc FCH 1 1 1 1 1 1 0 0
Como vemos la instrucción ORI de nuestro ejemplo activa los cuatro bits de menor peso,
dejando invariables los restantes.

Instrucción CMC dato


27. Bits afectados: CY
Complementar acarreo
Si el bit de acarreo es 0, se pone a 1. Si es un 1, se pone a 0.

28. Instrucción STC dato


Activar acarreo
El bit de acarreo se pone a 1.

29. DAA dato


Bits afectados: Z, S, Ajuste decimal del acumulador
P, CY, AC
El número hexadecimal de 8 bits contenido en el acumulador se ajusta como dos dígitos de 4
Direccionamiento: bits codificados en binario decimal, según el proceso siguiente:
Registro indirecto
(1).Si los cuatro bits menos significativos del acumulador representan un número mayor que 9,
o si el bit de acarreo auxiliar es igual a uno, el acumulador se incrementa en seis unidades. Si no
se presentan tales condiciones, el contenido
del acumulador no varía.

(2).Si los cuatro bits más significativos del acumulador representan ahora un número mayor
que 9, o si el bit de acarreo es uno, los cuatro bits más significativos se incrementan en seis
unidades. Asimismo, si no tienen lugar las
circunstancias expuestas, el contenido del acumulador no se incrementa. Si hay acarreo de los
cuatro bits menos significativos durante el paso (1), el bit de acarreo auxiliar se pone a 1; si no
lo hay, se pone a 0. Por otra parte, si hay acarreo de los cuatro bits más significativos durante el
paso (2), se activará el bit de acarreo, poniéndose a cero si no se produce acarreo.
Esta instrucción se utiliza en las operaciones de suma de números decimales. Es la única
instrucción cuya operación depende del bit de acarreo auxiliar.
Supongamos que queremos realizar una suma decimal de dos números (40 + 80).
Ambos bits de acarreo están a cero.

La secuencia de instrucciones podría ser:


(1).MVI B,80H
(2).MVI A,40H ; Acumulador = 40H
(3).ADD B ; Acumulador = 40H + 80H = C0H

(4).DAA ; Acumulador = 20H

; Bit de acarreo = 1

La instrucción DAA opera de la siguiente forma:

1. Como el contenido de los bits [0 – 3] del acumulador es menor que 9 y el bit de acarreo
auxiliar es cero, el contenido del acumulador no varía.
2. Como los 4 bits más significativos del acumulador representan un número mayor que 9,
estos 4 bits se incrementan en 6 unidades, poniendo a uno el bit de acarreo.

Acumulador C0H: 1 1 0 0 0 0 0 0 Cy=0


+6 60H: 0 1 1 0 0 0 0 0 Cy=0
Nuevo Acc 20H 0 0 1 0 0 0 0 0 Cy=1

En resumen puedes obtener un resultado en DECIMAL a partir de una operaciion


HEXADECIMAL
30. NOP
No se realiza ninguna operación.

31. RLC
Bits afectados: CY
Desplazar el acumulador a la izquierda Rotate Left Carry
RLC rota un bit hacia la izquierda todo el contenido del acumulador, transfiriendo el bit de
más alto orden al bit de acarreo y al mismo tiempo a la posición de menor orden del
acumulador.

Ejemplo

Supongamos que el acumulador contiene F2H.

32 RRC
Bits afectados: CY Desplazar el acumulador a la derecha Rotate Rigth Carry
RRC rota el contenido del acumulador un bit a la derecha, transfiriendo el bit de más bajo
orden a la posición de más alto orden del acumulador, además pone el bit de acarreo igual al bit
de menor orden del acumulador.

33. RAL
Bits afectados: CY (Rotate Arraund Left)
Desplazar el acumulador hacia la izquierda a través del bit de acarreo
RAL hace girar el contenido del acumulador y el bit de acarreo un espacio de un bit hacia la
salida (izquierda). El bit de acarreo que es tratado como si fuera del acumulador, se transfiere
el bit de menor orden del acumulador. El bit de mayor orden del acumulador se transfiere al bit
de acarreo. No tiene operandos.

Supongamos que el acumulador contiene B5H. La instrucción RAL efectuará las siguientes
modificaciones en el registro acumulador y en el bit de acarreo:
34. RAR
Rotate Arround the Rigth

RAR rota el contenido del acumulador y del bit de acarreo 1 bit de posición a la derecha. El bit
de acarreo que es tratado como si fuera parte del acumulador se transfiere al bit de más alto
orden del acumulador. El bit de menor peso del acumulador se carga en el bit de acarreo. No
existen operandos en la instrucción RAR

Ejemplo

En este caso el acumulador contendrá el valor 6AH. La instrucción RAL efectuará las siguientes
modificaciones en el registro acumulador y en el bit de acarreo:

35. JMP Dir


Salto incondicional La instrucción JMP DIR altera la ejecución del programa cargando el
valor especificado por DIR en el contador de programa.

36. JC dir La instrucción JC DIR comprueba el valor del bit de acarreo. Si es un 1 la ejecución del
programa continúa en la dirección especificada por DIR. Si es un 0 el programa continúa su
ejecución normal de forma secuencial.

37. JNC dir


Saltar si no hay acarreo
La instrucción JNC DIR comprueba el estado del bit acarreo. Si esta a 0 el programa cambia a la
dirección especificada por DIR. Si esta a 1 la ejecución del programa continúa normalmente.

38. JZ dir
Saltar si hay cero
La instrucción JZ DIR comprueba el bit de cero. Si está a 1 el programa continúa en la
dirección expresada por DIR. Si está a 0 continúa con la ejecución secuencial normal.

39. JNZ dir


Saltar si no hay cero
La instrucción JNZ DIR comprueba el valor del bit de cero. Si el contenido del acumulador no es
cero (Bit de cero = 0) el programa continúa en la dirección especificada por DIR. Si el
contenido del acumulador es cero (Bit de cero = 1) el
programa continúa su ciclo normal.

40. JM dir
Saltar si hay signo negativo
La instrucción JM DIR comprueba el estado del bit de signo. Si el contenido del acumulador es
negativo (bit de signo = 1) la ejecución del programa continúa en la dirección especificada por
DIR. Si el contenido del acumulador es positivo (bit de signo = 0) continúa la ejecución de la
secuencia normal.

41. JP dir
Salta si hay signo positivo
La instrucción JP DIR comprueba el estado de bit del signo. Si el contenido del acumulador es
positivo (bit de signo = 0) la ejecución del programa continúa con la dirección especificada por
DIR. Si el contenido del acumulador es negativo (bit de
signo = 1) continúa el programa con su ejecución normal.

42. JPE dir


Salta si la paridad es par
La paridad existe si el byte que esta en el acumulador tiene un número par de bits. El bit de
paridad se pone a 1 para indicar esta condición.
La instrucción JPE DIR comprueba la situación del bit de paridad. Si esta a 1, la ejecución del
programa continúa en la dirección especificada por DIR. Si esta a 0, continúa con la siguiente
instrucción de forma secuencial.
Las instrucciones JPE y JPO son especialmente usadas para comprobar la paridad de los datos
de entrada. (Sin embargo con la instrucción IN los bits no actúan.
Esto puede evitarse sumando 00H al acumulador para activarlos).

43. CALL dir Llamada incondicional

CALL guarda el contenido del contador de programa (la dirección de la próxima instrucción
secuencial) dentro del stack y a continuación salta a la dirección especificada por DIR.
Cada instrucción CALL o alguna de sus variantes implica una instrucción RET (retorno), de lo
contrario el programa podría "perderse" con consecuencias impredecibles. La dirección debe
ser especificada como un número, una etiqueta, o una
expresión. La etiqueta es lo más normal (El ensamblador invierte los bytes alto y bajo de
dirección durante el proceso de ensamblado). Las instrucciones CALL se emplean para
llamadas a subrutinas y debemos tener presente que siempre emplean el stack.

44. CC dir Llamada si hay acarrero


CC comprueba el estado del bit de acarreo. Si el bit está a 1, CC carga el contenido del contador
de programa en el stack y a continuación salta a la dirección especificada por DIR. Si el bit esta
a 0, la ejecución del programa continúa con la próxima instrucción de su secuencia normal.
Aunque el uso de una etiqueta es lo más normal, la dirección puede ser especificada también
como un número o una expresión.

45 CNC dir
Llamar si no hay acarreo.

CNC chequea el valor del bit de acarreo. Si está en cero CNC carga el contenido de contador de
programa en el stack y a continuación salta a la dirección especificada por la instrucción en
DIR. Si el bit está a 1, el programa continúa con su secuencia normal.
Aunque el uso de una etiqueta es lo más común, la dirección puede también estar indicada por
un número o por una expresión.

46 CZ dir
Llamar si hay cero
CZ chequea el bit de cero. Si el bit esta a 1 (indicando que el contenido del acumulador es cero),
CZ carga el contenido del contador de programa en el stack y salta a la dirección especificada
en DIR. Si el bit está a 0 (indicando que el contenido del
acumulador es distinto de cero) el programa continúa su desarrollo normal.
47 CNZ dir
Llamar si no hay cero
CNZ chequea el bit de Cero. Si está en 0 (indicando que el contenido del acumulador no
es cero), CNZ manda el contenido del contador de programa al stack y salta a la
dirección especificada por DIR. Si el bit está a 1 el programa continúa su desarrollo
normal.
48 CM dir
Llamar si hay signo negativo
CM comprueba el estado del bit del signo. Si el bit esta a 1 (indicando que el contenido del
acumulador es negativo) CM manda el contenido del contador de programa al stack y salta a la
dirección especificada por DIR. Si el bit es 0 la ejecución del programa continúa con su
secuencia normal. El uso de la etiqueta es lo más corriente, pero la dirección puede
especificarse también por un número o una expresión.

49 CP dir
Llamar si hay signo positivo
CP chequea el valor del bit de signo. Si está a 0 (indicando que el contenido del
acumulador es positivo), CP envía el contenido del contador de programa al stack y
salta a la dirección especificada por DIR. Si el bit tiene un 1, continúa el programa
normalmente con la instrucción siguiente.

50 CPE dir
Llamar si la paridad es par.
Existe paridad en un byte si el número de unos que tiene es par. El bit de paridad se
pone a 1 para indicar esta condición. CPE chequea el valor del bit de paridad. Si tiene
un 1, CPE envía el contenido del contador de programa al stack y salta a la dirección
especificada por la instrucción en DIR. Si el bit tiene un cero, el programa continúa
normalmente.

51 CPO dir
Llamar si la paridad es impar
CPO chequea el bit de paridad. Si el bit esta a 0, CPO carga el contenido del contador
de programa en el stack y salta a la dirección especificada en DIR. Si el bit está a 1 el
programa continúa su desarrollo normal.

52 RET
Retorno incodicional
Se realiza una operación de retorno incondicional.
La instrucción RET echa fuera dos bytes de datos del stack y los mete en el
registro contador de programa. El programa continúa entonces en la nueva dirección.
Normalmente RET se emplea conjuntamente con CALL.

53 RC Retorno si hay acarreo


La instrucción RC comprueba el estado del bit de acarreo. Si tiene un 1 (indicando
que
hay acarreo) la instrucción saca dos bytes del stack y los mete en el contador de
programa. El programa continúa en la nueva dirección suministrada. Si el bit es 0, el
programa continúa en la siguiente instrucción de la secuencia normal
54 RNC Retorno si no hay acarreo
La instrucción RNC comprueba el bit de acarreo. Si está a 0 indicando que no hay
acarreo, la instrucción echa fuera del stack dos bytes y los carga en el contador de
programa. Si el bit está a 1 continúa el ciclo normal.
55 RZ Retorno si hay cero
La instrucción RZ comprueba el bit de cero. Si está a 1, indicando que el contenido del
acumulador es cero, la instrucción echa fuera del stack dos bytes y los carga en el
contador de programa. Si el bit está a 0, continúa el ciclo normal.
56 RNZ Retorno si no hay cero
La instrucción RNZ comprueba el bit cero. Si está a 0, indicando que el contenido del
acumulador no es cero, la instrucción echa fuera del stack dos bytes y los carga en el
contador de programa. Si el bit está a 1, continúa el ciclo normal.
57 RM Retorno si hay signo negativo
La instrucción RM comprueba el bit de signo. Si tiene un 1, indicando dato negativo en
el acumulador, la instrucción echa dos bytes fuera del stack y los mete en el contador
de programa. Si el bit tiene 0, continúa el programa normal con la siguiente
instrucción.
58 RP Retorno si hay signo positivo
La instrucción RP comprueba el bit signo. Si está a 0, indicando que el contenido del
acumulador es positivo, la instrucción echa fuera del stack dos bytes y los carga en el
contador de programa. Si el bit está a 1 continúa el ciclo normal.
59
RPE
Retorno
59 RPE Retorno si la paridad es par
La instrucción RPE comprueba el bit de paridad. Si está a 1, indicando que existe
paridad, la instrucción echa fuera del stack dos bytes y los carga en el contador de
programa. Si el bit está a 0 continúa el ciclo normal. (Existe paridad si el byte que está
en el acumulador tiene un número par de bits, colocándose el bit de paridad a 1 en
este caso).
60 RPO
Retorno si la paridad es impar
La instrucción RPO comprueba el bit de paridad. Si está a 0, indicando que no hay
paridad, la instrucción echa fuera del stack dos bytes y los carga en el contador de
programa. Si el bit está a 1, continúa el ciclo normal.

61 RST
Es una instrucción CALL para usar con interrupciones. RST carga el contenido del
contador de programa en el stack, para proveerse de una dirección de retorno y salta
a una de las "ocho" direcciones determinadas previamente.
Un código de tres bits incluido en el código de operación de la instrucción RST
especifica la dirección de salto. Esta instrucción es empleada por los periféricos
cuando
intentan una interrupción.
Para volver a la instrucción en que ha tenido lugar la interrupción, se debe
utilizar una instrucción de RETORNO.
62 EI Activar interrupciones
La instrucción EI pone en servicio el sistema de interrupciones a partir de la siguiente
instrucción secuencial del programa. Esta instrucción activa el flip-flop INTE.
Se puede desconectar el sistema de interrupciones poniendo una instrucción DI
al principio de una secuencia, puesto que no se puede predecir la llegada de una
interrupción.
Al final de la secuencia se incluye la instrucción EI que vuelve a habilitar el
sistema de interrupciones. (RESET también pone fuera de servicio el sistema de
interrupciones además de poner el contador de programa a cero).
63 DI
Desactivar interrupciones
Esta instrucción desactiva el flip-flop INTE. Después de la ejecución de una
instrucción DI, el sistema de "interrupciones" esta sin posibilidad de ponerse en
marcha. En aplicaciones que empleen las interrupciones, la instrucción DI se emplea
solamente cuando una determinada secuencia no debe ser interrumpida. Por
ejemplo, se puede poner fuera de servicio el sistema de interrupciones incluyendo
una instrucción DI el principio del código de secuencia.
La interrupción TRAP del 8085 no puede ser puesta fuera de servicio. Esta
interrupción especial esta prevista para serios problemas que pueden presentarse
independientemente del bit de interrupción (fallo de alimentación, etc.).

64 IN port Entrada
La instrucción IN PORT lee los 8 bits de datos que hay en el "PORT" especificado y los
carga en el acumulador. El operando debe ser un número o una expresión que
produzca
un valor comprendido entre 00H y FFH.
1. La instrucción
IN 2
deposita en el acumulador los datos de entrada del puerto 2.
65 OUT port Salida
OUT PORT pone el contenido del acumulador en el bus de datos de 8 bits del puerto
seleccionado. El número de puertos oscila de 0 a 255 y es duplicado en el bus de
direcciones. Es la lógica externa la encargada de seleccionar el puerto y aceptar el
dato
de salida. El operando (PORT) debe especificar el número del puerto de salida
seleccionado.
1. La instrucción OUT 2 envía el contenido del acumulador al puerto de salida número
2.
66 HLT
La instrucción HLT detiene el procesador.
El contador de programa contiene la dirección de la próxima instrucción secuencial.
Por otro lado los bits y registros permanecen inactivos. Una vez en estado de parada
el procesador puede volver a ser arrancado solamente por un acontecimiento
externo, es decir una interrupción. Por tanto debemos asegurarnos que las
interrupciones estén en disposición de ser activadas antes de ejecutar la instrucción
HLT.
Si se ejecuta HLT estando las interrupciones fuera de servicio, la única manera de
volver arrancar el procesador será mediante un RESET o a través de la interrupción
TRAP.
El procesador puede salir temporalmente del estado de parada para servir un acceso
directo a memoria, sin embargo terminado el acceso directo vuelve al estado de
parada.
Un propósito básico de la instrucción HLT es permitir una pausa al procesador
mientras espera por la interrupción de un periférico.

Colocar datos en stack


El contenido del par de registros especificado se guarda en dos bytes de memoria definidos por el puntero
de stack.
67 PUSH pr El contenido del primer registro se guarda en la posición de memoria inmediatamente inferior a la del
puntero de stack. El contenido del segundo registro del par se guarda en la posición de memoria dos
unidades inferior al puntero de stack. Si se
hace referencia al para de registros PSW, en el primer byte de información se guarda el estado de los cinco
bits de condición. El formato de este byte es el siguiente:

S Z 0 Ca 0 1 0 1
Sea cual sea el par de registros especificado, una vez que los datos se han
guardado, el puntero de pila se decrementa en dos unidades.
1. Supongamos que el registro B contiene 3FH, el registro C contiene 16H y el
puntero de pila vale 2030H. La instrucción
PUSH B
almacenará el contenido del registro B en posición de memoria 2029H, el contenido del registro C en la
dirección de memoria 2028H, y decrementa dos unidades el puntero de stack, dejándolo en 2028H.

Gráficamente podemos ver el proceso anterior:

Antes de PUSH
Despues de PUSH
Puntero Puntero
Stack Stack
2030 2030
Registro B Registro C Registro B Registro C
3F 16 3F 16

MEMORIA DIRECCION MEMORIA DIRECCION


00 2027 00 2027

00 2028 16 2028

00 2029 3f 2029

00 2030 00 2030

2. Supongamos ahora que el acumulador contiene 33H, el puntero de pila tiene 102AH, y los bits de
condición de cero, acarreo y paridad están a uno, mientras que los de signo y acarreo auxiliar están a cero.
La instrucción

PUSH PSW

Almacena el contenido del acumulador en la posición de memoria 1028H, y coloca el valor 47H,
correspondiente a los citados estados de los bits de condición, en la posición 1029H, mientras que en el
puntero de pila queda el valor 1028H.
68 POP pr Sacar datos del stack

POP pr copia el contenido de la posición de memoria direccionada por el stack pointer


en el registro de bajo orden del par de registros especificados. A continuación se
incrementa el stack pointer en 1 y copia el contenido de la dirección resultante en el
registro de más alto orden del par. Luego se incrementa el stack pointer otra vez de
modo que se apunta al siguiente dato del stack. El operando debe especificar el par de
registros BC, DE, HL o PSW.

POP PSW usa el contenido de la localización de memoria especificada por el


stack pointer para restablecer los bits de condiciones.

Supongamos que las posiciones de memoria 2028H y 2029H contienen respectivamente 16H y 3FH,
mientras que el puntero de pila contiene 2028H. La instrucción

POP B

Carga el registro C con el valor de 16H de la posición de memoria 2028H, carga el registro B con el valor
3FH de la posición 2029H, e incrementa dos unidades el puntero de stack, dejándolo en 2030H.
Gráficamente podemos ver este proceso:

Antes de POP Despues de POP


Puntero Puntero
Stack Stack
2028 2030
Registro B Registro C Registro B Registro C
00 16 3F 16

MEMORIA DIRECCION MEMORIA DIRECCION


00 2027 00 2027

16 2028 16 2028

3F 2029 3f 2029

00 2030 00 2030

2. Si las posiciones de memoria 1008H y 1009H poseen respectivamente 00H y


16H, y el puntero de pila vale 1008H, la instrucción

POP PSW
carga 00H en el acumulador y pone los bits de estado de la siguiente forma:

S Z X Ca X P X Cy
0 0 0 1 1 1 1 0

=16H
69 DAD pr Suma doble
DAD RP suma el valor de un dato de 16 bits contenido en un determinado par de registros (PR) al
contenido del par de registros HL. El resultado es almacenado en el par HL. Los operandos (PR) pueden ser
B = BC, D = DE, H = HL, SP. Téngase en cuenta que la letra H debe ser empleada para especificar que el par
de registros HL debe ser doblado. DAD pone el bit de acarreo a 1 si hay una salida de acarreo de los
registros HL. Y además no afecta a ningún otro bit.
1. Supuesto que los registros D, E, H y L contienen 33H, 9FH, A1H y 7BH
respectivamente, la instrucción
Realiza la siguiente suma:
B–C: 339FH
H–L: + A17BH
__________________________

H–L 051AH

2. Al ejecutar la instrucción DAD H


se duplica el valor del número de 16 bits contenido en H – L (equivale a desplazar los 16 bits una posición
hacia la izquierda).

70 XCHG
Intercambiar datos entre registros
XCHG cambia el contenido de los registros H y L con el contenido de los registros D y E.
Si los registros H, L, D y E contienen respectivamente 01H, 02H, 03H y 04H, la instrucción XCHG realiza el
siguiente intercambio:
Antes de ejecutar XCHG

Antes de ejecutar XCHG


Antes de ejecutar XCHG
D E H L
D E H L
03 04 01 02
03 04 01 02
71

XTHL Intercambiar datos con el stack

XTHL cambia los dos bytes de la posición más alta del stack con los dos bytes almacenados en los registros
H y L.
Así XTHL salva el contenido actual del par HL y carga nuevos valores en HL.
XTHL cambia el contenido del L con la posición de memoria especificada por el stack pointer y el registro H
es intercambiado con el contenido del SP+1.

Si el puntero de pila contiene 40B4H, los registros H y L contienen AAH y BBH respectivamente, y las
posiciones de memoria 40B4H y 40B5H contienen CCH y DDH respectivamente, la instrucción

Antes de XTHL Antes de XTHL


Puntero Puntero
Stack Stack
40B4 40B4
Registro B Registro L Registro B Registro L
AA BB AA BB

MEMORIA DIRECCION MEMORIA DIRECCION


00 40B3 00 40B3

CC 40B4 CC 40B4

DD 40B5 DD 40B5

00 40B6 00 40B6

72 SPHL Cargar el puntero de stack desde los registros H y L


Los 16 bits contenidos en los registros H y L reemplazan el contenido del puntero de
stack. El contenido de los registros H y L permanece invariable.
Si los registros H y L contienen respectivamente 50H y 6CH, la instrucción
SPHL

carga el puntero de stack con el valor 506CH.


73 SHLD Carga directamente con H y L

Almacena una copia del registro L en la posición de memoria especificada por DIR, a
continuación almacena una copia del registro H en la siguiente posición de memoria (DIR+1).
Suponiendo que los registros H y L contienen respectivamente los valores 3CH y 54H, la
instrucción
SHLD 34B3
efectuará las siguientes modificaciones en memoria:

Memoria antes de ejecutar Memoria despues de ejecutar


SHLD SHLD

MEMORIA DIRECCION MEMORIA DIRECCION


FF 34B2 FF 34B2

FF 34B3 54 34B3

FF 34B4 3C 34B4

FF 34B5 54 34B5

74
LSHD

75
SBB

76
DAD

77
ORG 0 ; Posicion de programa en la DIRECTIVA
ORG 0 .data DIR ; Direccion donde empiezo a colocar mis datos, Ej: 2000H
.DATA
dB ; Directiva asociada a adatos
DB
DW
dW ; Directiva asociada a datos exadecimales.

.define ; Asume una variable a un numero

Ejemplo:
dB 1,2,5 ;Coloca los datos 1,2,5 en forma secuencial en la tabla.
dW 1,3,4,4,1234H ;Coloca datos en la tabla pero ocupa 2 bytes
.
2.2.-TABLA SET OP.CODE
2.3.-Tamaño de instrucciones [Bytes ]
Ejercicio de ensamble.

MVI A,55H ;Mueve inmediatamente 55H al acumulador A,


A=55
MVI B,15H ;Mueve inmediatamente 15H al registro B, B=15H
MVI C,22H ;Mueve inmediatamente 22H al Registro C, C=22H
MOV H,C ;Mueve el contenido del registro C al
registro H, H=22H
MOV L,B ; Mueve el contenido del registro B al
registro L, L=15
MOV M,A ;Mueve el contenido del acumulador A y lo
lleva a la
;posición de memoria
;Contenido por el registro H,L

Posición de memoria .

HL= 2215 H 55H

.
.

Trabajando con la tabla de datos OP.CODE


Para poder identificar la operación se debe identificar el código de la
instrucción, así por ejemplo el código 78H corresponde a MOV A,B. De esta forma
identificando el código de instrucción sabremos qué tipo de cual se trata,

La tabla Repertorio de instrucciones de la columna Bytes señala el tamaño de cada


instrucción asi por ejemplo la instrucción

MVI Reg,dato ; Ocupa 2 Bytes


Instrucción Codigo nemónico Tamaño instrucción
HEX

MOV A,B 1 Byte


78 Op. Code

MVI A,55H 2 Bytes


3E Op code

55 dato

LXI 1234H 3 Bytes


21 Op. Code

34 Dato

12 dato
Ejercicio de DES-ensamble. Dado los siguientes nemónicos
desensamblar.
3E5506150E22616877
Solución: Con la tabla SET OP CODE podemos identificar la instrucción. Deducir la
posición de la siguiente instrucción a partir del número total de Bytes que ocupa
cada instrucción.

PC Cod. Dat Instrucción Tamaño Bytes

0 3E 55H MVI A,55H 2


2 06 15H MVI B,15H 2
4 0E 22H MVI C,22H 2
6 61 MOV H,C 1
7 68 MOV L,B 1
PC 8 77 MOV M,A 1
Apunta siguiente inst. por Total 9 Bytes
tamaño Bytes.
LA PROGRAMACIÓN.

Después de haber tratado y examinado el repertorio de instrucciones del


microprocesador, vamos a introducir algunas cuestiones básicas y primordiales
sobre la metodología de la programación. El proceso de programación debe
desarrollarse partiendo de unas “ideas” que deben ser perfectamente asimiladas
comprendidas y organizadas por la persona o personas que vayan a construir el
programa en cuestión. Esto lleva implícita la disminución de errores durante el
proceso programador, por lo que se facilita enormemente la tarea. El objetivo final
de la programación es de conseguir programas que funcionen correctamente y sean
eficientes, proporcionar sobre ellos toda la documentación necesaria. Debe tenerse
en cuenta que un programa indebidamente documentado sería muy difícil de
modificar en un futuro, o al menos podría resultar tan costoso que nos haría
renunciar a tal propósito.

2.4.-DIAGRAMA DE FLUJO Y PROGRAMACIÓN:

Cuando se está aprendiendo programar en cualquier lenguaje, es evidente que


no se cuenta con la capacidad ni la maestría para hacerlo. Es por ello que es
necesario primeramente saber crear un Flujograma, también denominado
diagrama de flujo, este nos ayudará a guiarnos en el desarrollo de los pasos,
acciones, situaciones, hechos, movimientos y relaciones de todo tipo a partir de
símbolos.

Fig.10.-Formas y nombres del Flujograma.


Trabajando con el simulador

Antes de programar lo primero realizaremos es descargar el software. Se trata de


un programa que ensambla las instrucciones que usa el microprocesador 8085.

https://www.4shared.com/rar/ZvqlPSQPba/8085.html

Una vez descargado e instalado, ya contamos con la herramienta para poder


comprender esta materia.
1.- Abrimos el editor ASM/archivo/nuevo
2.- Escribimos nuestro programa y ensamblamos

3-Analizamos paso a paso las instrucciones


4.- Los registros se muestran en forma binaria y hexadecimal

5.-RESUMEN: Para programar es necesario tener claro que estamos


programando sobre una pila LIFO, para cualquier operación debemos especificar
una direccion, allí podemos quitar, transferir ,copiar, es decir realizar una
operación, y para ello existe las instrucciones de: transferencia, salto,
comparación, etc. Un programa pueden tener muchas formas de llegar a la misma
solución. De momento vamos a considerar los recursos como ilimitados y no se
considerará la optimización de la programación, sin embargo en la realidad
tendremos que optimizar la cantidad de Bytes disponibles.

Dir Pila
.
.
PC> dato
.
.
.
SP> FFFF
2.- SALTO DENTRO DE LA INSTRUCCIÓN
Un salto dentro de un programa, pueden estar condicionadas o no. Generalmente
el programador designa algún label, o etiquetado para señalar a la dirección al que
quiere saltar. Ej: …
XX: MVI A,B
JUMP XX ; Salto incondicional al label o etiquetado XX
HLT

2.5.- EJERCICIOS RESUELTOS Y ENSAMBLADO

Copia y pega en el editor ASM del simulador 8085 para el análisis más detallado de
cada ejemplo. Enssamblar.

1.- Mi primer contador o counter.

.ORG 0
MVI C,10; El compilador transforma el 10 decimal a 0A H de
;forma interna
LOOP:DCR C
JNZ LOOP ;Si no se cumple la condición de cero salta a LOOP
HLT
;Ensamblado correctamente ©EIEE

2.- Recorrido de tabla desde 0000H hasta 000AH con counter


;---------------------------------------------------------------
;Programa de tabla desde 0000H hasta 000AH con counter
;---------------------------------------------------------------

.ORG 0
MVI C,10 ; El compilador transforma el 10 decimal a 0A H de
; forma interna
LXI H,0000H ;Se posiciona el PC en 0000H para recorrer la tabla
LOOP: INX H ; Se empieza recorriendo la dirección de memoria
; incrementándose en una posición.

DCR C ;El ciclo del contador depende de la condicion de zero


JNZ LOOP ;Si no se cumple la condicion de cero retorna a LOOP
;
HLT

;Ensamblado correctamente ©EIEE


3.- Ingresa los valores de forma progresiva en una tabla dada y es almacenado en otra dirección.
Se tiene una tabla de 10 datos numericos almacenados a partir de la direccion de memoria 1000h. Se
desea construir una segunda tabla con estos datos y almacenarlos desde la posicion de memoria 100AH.

;-------------------------------------------------------
; Ingresa los valores en una tabla dada
;--------------------------------------------------------

.data 1000H
dB 1h,2h,3h,4h,5h,6h,7h,8h,9h,Ah
.ORG 0
MVI A,00H
MVI L,10 ;COUNTER
LXI B,1000H ;POSICIONAMIENTO
LXI D,100AH ;POSICIONAMIENTO
XX: LDAX B
STAX D
INX B
INX D
DCR L
JNZ XX
HLT

;Ensamblado correctamente ©EIEE

Resultado. A partir de la posición 1004:1H,2H,3H,4H,5H,6H,7H,8H,9H,AH

4.-Suma en el contador la cantidad de unos que hay en una tabla usando CPI.

.data 2000H
dB 1h,0h,1h,1h, 1h,0h,1h,0h,1h,0h
.ORG 0

LXI H,2000H ;Me ubico en la posición de memoria


MVI C,0 ;Inicializo contador
MVI B,10 ;tamaño de la tabla
OTRO:MOV A,M
CPI 1
JNZ XX
INR C
XX: DCR B
JZ FIN
INX H
JMP OTRO
FIN: HLT

;Ensamblado correctamente ©EIEE

Resultado B=0, C=06H, Es decir existen ’s en la tabla.


5.-Desensamblar el siguiente código de un programa para el procesador 8085
0E 00 3A 36 10 47 3A 37 10 80 D2 0E 00 0C 32 38 10 79 32 39 10 76

;De la tabla SET OP CODE (Ver arriba)

MVI A,00H ; 0E 00
LDA 3610H ; 3A3610
MOV B,A ; 47
LDA 3710H ; 3A37 10
ADD 80H ; 80
JNC 0E00H ; D2 0E 00
INR C ; 0C
STA 3810H ; 323810
MOV A,C ; 79
STA 3910H ; 323910
HLT ; 76

6.- Crear un contador que busque los numero ’s que posea en un tabla de tamaño
10.

(A) Lo primero que necesitamos saber es sumar con un contador la cantidad de


unos que hay

en una tabla. Para ello usaremos un CPI, que es un comparador.

;---------------------------------------------------------
; PROGRAMA QUE CUENTA SI EXISTE
; EL VALOR 01H EN LA TABLA
;---------------------------------------------------------

.data 2000H
dB 01h,00h,01h,01h, 01h,00h,01h,00h,01h,00h
.ORG 0

LXI H,2000H ;Me ubico en la posición de memoria


MVI C,0 ;Inicializo contador
MVI B,10 ;tamaño tabla
OTRO:MOV A,M
CPI 1
JNZ XX
INR C
XX: DCR B
JZ FIN
INX H
JMP OTRO
FIN: HLT
;Ensamblado correctamente ©PTRRZA
(B).- Necesitamos rotar un dato, para poder analizarlo bit a bit.
;--------------------------------------------------
;PROGRAMA QUE ROTA BIT A BIT
;--------------------------------------------------------

.ORG 0 ;ingreso de datos


MVI A,7FH ; ingresamos 0111 1111 al acumulador (7FH)

MVI B, 8 ; Definimos el tamaño del dato en 2 bytes ( 8 bits)


XX : RLC ; Se empieza rotando el Acumulador
DCR B ; disminuye el numero de rotaciones
JNZ XX ; si no hay ceros (z=0), salto para continuar rotando
HLT

;Ensamblado correctamente ©PTRRZA

(C) Encontrar el numero de 1 que hay en un dato usando RLC y ANI

;-----------------------------------------------------------------------------
; PROGRAMA QUE CUENTA LOS 1’S EN UN REGISTRO
;-----------------------------------------------------------------------------

.ORG 0
;INGRESO DE DATOS
MVI C,0 ; inicializamos el counter en cero
MVI B,8 ; Contador de tamaño de bits del dato (en exadecimal 08H)
MVI A,7FH ; Almacenamos el dato en registro A

LOOP:RLC ;Genera un movimiento bit a bit hacia la izquierda


MOV D,A ;Movemos el contenido del acumulador a D para no destruirlo
ANI 01H ;ANI destruye el contenido de A y reescribe en un nuevo Acc

JZ XX ; Si no es cero saltamos a la dirección xx


INR C ; El counter de 1’s se incrementa

XX: MOV A,D ; Restauramos el contenido del acumulador antes ANI


DCR B ; Disminuye el tamaño de palabra

JNZ LOOP ; La posición 00H del registro C es usado para Fin de ciclo
HLT ; Resultado: C=7H Hay 7 unos
;Ensamblado correctamente ©PTRRZA
5.-Ya estamos preparados para HACER el programa del ejercicio 5. Contar Todos
los ’s de cada registro en la tabla.
;------------------------------------------------------------------------------
; DIRECTIVAS Y ORIGENES DEL ENSAMBLADOR sin XCHG Versión 1.0
;------------------------------------------------------------------------------
.data 1000H
dB 01h,01h,01h,01h, 01h,01h,01h,01h,01h,01h
.ORG 0

;--------------------------------------------------------------------------
; INICIO DEL PROGRAMA
;--------------------------------------------------------------------------
MVI C,00H ;Counter total de 1's
MVI E,AH ;tamaño de tabla
MVI A,00H ;Limpio el acumulador

LXI H,1000H ;Nos posicionamos en 1000H

;----------------------------------------------------------------------------
; RECORRIDO DEL DATO EN LA DIRECCION HL
;----------------------------------------------------------------------------

HEAD :MOV A,M


MVI B,08H ;Counter de 1’s en la dirección HL***
XX: RLC ; El contenido lo dejamos en el acumulador

MOV D,A ; Almacenamos el contenido del acumulador


ANI 01H ; comparamos para saber si el ultimo bit es 0 o 1
JZ LOOP ;
INR C ; Este counter almacenara si hay 1's, son numero de elementos
LOOP:MOV A,D ; Devolvemos el valor antes de que ANI haya borrado la información
DCR B ;Decrementamos el registro B
;--------------------------------------------------------------------------------
; RECORRIDO DE LA SIGUIENTE DIRECCION DE LA TABLA
;--------------------------------------------------------------------------------
JNZ XX
INX H ; Se incrementa la tabla en la siguiente posición ***
DCR E
JNZ HEAD
HLT

;Ensamblado correctamente ©EIEE

Resultado C=A
3.- TIEMPO DEL PROGRAMA
3.1 Ejecución de un Programa. Hasta ahora se estudiaron la arquitectura de una CPU, el
formato de las instrucciones y los distintos tipos de instrucciones. Veremos ahora cómo se
ejecuta un programa almacenado en memoria. Un programa almacenado en memoria está
listo para ser ejecutado por el microprocesador. Para ser ejecutado, es necesario cargar el PC
con la dirección de la primera instrucción a ser ejecutada. Luego, el PC se incrementa
automáticamente recorriendo secuencialmente los sucesivos lugares de memoria donde se
halla el programa.

3.2 Ciclos de operación.


Hay dos operaciones fundamentales que realiza un procesador:
- Búsqueda de la instrucción: en la cual el procesador busca el código de operación(FETCH).
- Ejecución de la instrucción: En la cual el procesador ejecuta la operación determinada por la
instrucción. Un procesador se encuentra siempre haciendo una de las dos operaciones
anteriores.

3.2.1.-Ciclo de instrucción
Es el tiempo total, medido en números de períodos de reloj, de duración de un ciclo de
búsqueda más uno de ejecución de la instrucción teniendo en cuenta los sucesivos accesos a
memoria en el caso de ser una instrucción de más de un byte.

3.2.2.-Ciclo de máquina
Es el tiempo, medido en números de períodos de reloj de duración de una operación de
lectura, de escritura o de búsqueda (Fetch) de una instrucción. Un ciclo de instrucción está
compuesto por uno o varios ciclos de máquina (M1, M2, M3,M4), dependiendo del tipo de
instrucción. Se denomina M1 al ciclo de búsqueda, pues siempre es el primero de cada ciclo
de instrucción. Los ciclos de máquina más comunes son: Fetch, Memory Read, Memory Write,
I/O Read, I/O Write, INA, etc.

TIMING DIAGRAM for various machine cycles Los ciclos de la máquina son las operaciones
básicas realizadas por el procesador, mientras que las instrucciones se ejecutan. El tiempo
necesario para realizar cada ciclo de la máquina se expresa en términos de Tstates. Un T-
estado es el período de tiempo de un ciclo de reloj del microprocesador.The various machine
cycles are (los diferentes ciclos de la máquina son):

. Opcode fetch ……...…....... T


. Memory Read ……….…... T
. Memory Write ………..…. T
. I O Read……………………… T
5. I O Write…………………….. T
. Interrupt Acknowledge… 6 / 12 T
7. Bus Idle………………………. T
Ejemplo. N es un valor arbitrario que se usaremos para calcular la cantidad de veces que se
ejecuta una instrucción, generalmente este valor dependerá de la cantidad que se le asigne a
un contador o ciclo. Debido a que existen ciclos dentro de otros ciclos pueden haber dos o
mas valores N los que designaremos como N N …Nn. Este término deberá ser considerado
como DECIMAL cuando se calcule el TT, si nos entregan un valor hexadecimal se deberá
transformar a decimal.
Tomando en cuenta que cada instrucción tienen T tiempos de ejecución . Cuando hay un
salto de retorno condicionado, el valor del counter decrece en 1, y por tanto repite la
instrucción queda en (N-1) veces. Para el caso del JNZ vemos que necesita de 10T para
saltar una instruccion, y 7T para continuar con el programa sin efectuar ningun salto, el
valor 10T(N-1) nos señala que hubo un salto de retorno y se ejecuta N-1 veces.

Label Mnemónico Comentario


DELAY: MVI A,03H 7T
XX : DCR A 4T
JNZ XX 7/10T
HLT 4T

7T

4T 4T 4T *N

10T 10T 7T *N-1

4T

A=3 A=2,1 A=0

Cuando empieza a decrementar el registro A, DCR toma N veces la , mientras que al


efectuar un salto JNZ solo lo realiza (N-1) veces. Cuando A=0H, JNZ no salta y ejecuta la
siguiente instrucción (7T). Sumamos:

TT= 7T+ 4TN +10T(N-1) +7T +4T

TT = 7T+ 4TN +10TN -10T+7T+4T

TT=8T+14TN

N=03H N=3 (Decimal)

TT=8T+14*3*T

TT=8T+42T R: TT=50T
2.7.- Metodo de Columnas (DETALLES).

N: Se multiplica por N, si se repite 3 veces en las filas


| | | |

N-1: Se multiplica N-1, si se repite 2 veces en las filas.


| | | |
Si solo repite 1 vez, simplemente sumar. Sin multiplicar por nada!. Ej: b
Ejemplo
c - c

a a N a*N

a a b N-1 a*(N-1)+b

a a a N a*N

b b a N b*(N-1)+a

b a c b+a+c

Inicio Bucle Fin +__________________

TT: c+ a*N+ a*(N-1)+b+ a*N+ b*(N-1)+a+ b+a+c

Tipos de columnas: Como te habrás dado cuenta, al efectuar este tipo de operaciones habra un inicio,
luego un salto condicional que lleva a un ciclo recursivo, que se repite constantemente sin variar y
solo cuando se cumple una condición se continua hasta el fin del programa.

| | | |
Inicio: Corresponde a los tiempos T del primer recorrido de la instrucción.
Bucle: Es el ciclo T que se repite constantemente sin variar y en forma recursiva.
Fin: Cuanto se cumple la condición para recorrer las últimas instrucciones hasta HLT
1.-Calcular la duración del programa, para un procesador 8085, que usa un cristal de 6 Mhz.

Label Mnemónico Comentario


DELAY: MVI B,02H 7T
REP1: MVI C,02H 7T
REP2: DCR C 4T
JNZ REP2 7/10T
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

DELAY: MVI B,02H 7T


REP1: MVI C,02H 7T
REP2: DCR C 4T
JNZ REP2 7/10T
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

--------------------------------------------------------------------------------------------------

DELAY: MVI B,02H ; N1 7T


REP1:
X

DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

7T

X X X *N1

4T 4T 4T *N1

7T 7T 10T *N1-1

10T 10T 4T *N1-1

B=2 B=1 B=0


TT= 7T+XN1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T

REP1: MVI C,02H ; N2 7T


REP2: DCR C 4T X
JNZ REP2 7/10T

7T

4T 4T 4T *N2

10T 10T 7T *N2-1

C=2 C=1 C=0

X=7T+4TN2+10T(N2-1)+7T
X=7T+4TN2+10TN2-10T+7T
X=14TN2+4T
TT= 7T+XN1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T Reemplazando X:

TT= XN1+21TN1+4T

TT= (14TN2+4T)N1+21TN1+4T

TT= 14TN2N1+4TN1+21TN1+4T

TT=14TN2N1+25TN1+4T

N1=02H= N2=02H=

TT=14T*(2)*(2)+25T*(2)+4T

TT=110T

Mhz

.
2.-Calcular la duración del programa, para un procesador 8085, que usa un cristal de 6 Mhz.

Label Mnemónico Comentario


DELAY: MVI B,0AH 7T
REP1: MVI C,47H 7T
REP2: DCR C 4T
JNZ REP2 7/10T
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

DELAY: MVI B,0AH 7T


REP1: MVI C,47H 7T
REP2: DCR C 4T
JNZ REP2 7/10T
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

DELAY: MVI B,0AH ; N1 7T


REP1:
X

DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T

7T

X X X *N1

4T 4T 4T *N1

7T 7T 10T *N1-1

10T 10T 4T *N1-1

Inicio Bucle Fin

TT= 7T+XN1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T


REP1: MVI C,47H ; N2 7T
REP2: DCR C 4T X
JNZ REP2 7/10T

7T

4T 4T 4T *N2

10T 10T 7T *N2-1

Inicio Bucle Fin

X=7T+4TN2+10T(N2-1)+7T
Puesto que es el mismo ejercicio pero solo con los valores de N distintos se
procede a calcular N1,N2 como en el ejercicio anterior.

TT=14TN2N1+25TN1+4T

7 7
N1=0AH= 10 N2=47H=71
TT=14T*71*10+25T*10+4T
TT=10940T
TT 9 s
TT=0,0036 [s]
2.8.-Método del Flujograma.
(1) Se procede a hacer un flujograma completo del programa
(2) Las rutinas se desglosan de tal forma que podamos hacer un recorrido mas simple del
programa.
(3) Habiendo hecho esto se procede a unificar en una ecuación
El esquema debe representar correctamente el programa.

2.1-Calcular la duración del programa, METODO FLUJOGRAMA.

Label Mnemónico Comentario


DELAY: MVI B,0AH 7T
REP1: MVI C,47H 7T
REP2: DCR C 4T
JNZ REP2 7/10T
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T
No olvidar: N1 y N2 deberán ser convertidos a decimal para calcular TT

Se recorre el programa sumando los tiempos T. Se multiplica por N cuando ingresa a un ciclo o N-1
si ha retornado en una dirección. Recordando que 7T/10T se refiere al tiempo que ocupa para
ejecutar un salto (10T) o para ejecutar la siguiente instrucción (7T).

Se simplifica el diagrama para recorrer las instrucciones con mayor simplicidad


TT= 7T+XN1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T

X=7T+4TN2+10T(N2-1)+7T

TT=7T+XN1+4TN1+(N1-1)10T+7T+4T

TT=7T+(7T+4TN2+(N2-1)10T+7T)N1+4TN1+(N1-1)10T+7T+4T

TT =0,0036 [s]
3.-Se tiene un cristal de 6,1414Mhz determinar el tiempo de ejecución del
programa.
Label Mnemónico Comentario

DELAY: MVI B,104 4T


LXI H,1000 10T
DEI: DCX H 4T
MOV A,B 4T

ORA H 4T
JZ FIN 7/10T
JNZ DEI 7/10T

FIN: HLT 4T

4T

10T

12T 12T 12T *N

7T 7T 10T *N-1

10T 10T 4T *N-1

Inicio Bucle Fin

TT= 4T + 10T + 12TN +7T(N-1) + 10T + 10T(N-1) + 4T

TT= TT=29NT-11T=(29N-11)T

. 7 7

N=1000

TT=(1000*29-1 5 s =9421,425 s

TT=0,00942
III PERIFERICOS, PUERTAS DE ENTRADA, PUERTAS DE
SALIDA, PROGRAMACION POR DIRECCIONAMIENTO

3.1.-puertas entrada y salida in- out

3.2.-interfaz

3.3.-led

3.4.-programando el control status y las puertas de salida del 8155.

3.5.- timer programable.

3.6.-programa con puertas

3.7-programa con entrada de interruptores


3.1.-PUERTAS ENTRADA Y SALIDA IN- OUT
El mircroprocesador no puede trabajar con todos los periféricos en forma simultánea. Para
por ello el dispositivo lógico TRISTATE discrimina mediante un cortocircuito de alta
impedancia.

C A X
0 0 1
0 1 0
1 X

Fig.-Tabla lógica del TRISTATE


Por medio del Bus de dirección seleccionamos alguna de las 256 puertas de entrada, si
deseamos leer o las 256 puertas de salida si deseamos escribir. El Bus de control se
encargara de señalar la operación, RD, WR, o si trabajará en la memoria principal I0/M.

Operación de lectura en la puerta de Operación de escritura en la puerta de


entrada: salida:
Ejemplos ilustrativos
a) Periférico de entrada
Se muestra una lectura en el PERIFERICO 1, esto implica que C1=0,
c2=1,c3=1,c4=1,c5=1,c6=1,c7=1. Para anular los periféricos simplemente se pone C=0,
activando una alta impedancia y crear un cortocircuito. El valor que toma X, no tiene
importancia porque su operación esta anulada. El CPU solo lee al periférico A1,

Ejemplo IN/OUT

IN 20H Acc (port 20)


OUT 4F Acc (port 4F)

2B Op.code D3 Op.code

20 Direc. 4F Direc.
b) Periférico de entrada y salida.
Este esquema ilustra una lectura (RD), y una escritura (WR) en las puertas IN y
OUT. Debido a que el TRISTATE tiene un C=0 no hay alta impedancia y por
ende no existe un cortocircuito.

El problema de este diseño es que no se determina la dirección de las puertas,


solamente señalamos el tipo de operación que se está realizando y el lugar
donde se lleva a cabo.
c) Periférico de entrada con dirección de control simplificado
Aquí se ha añadido la dirección de control A A A …A7 en la puerta logica

A7 A6 A5 A4 A3 A2 A1 A0 IN
0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 1 0 0 2
0 0 0 0 0 1 0 0 0 4
0 0 0 0 1 0 0 0 0 8
0 0 0 1 0 0 0 0 1 0
0 0 1 0 0 0 0 0 2 0
0 1 0 0 0 0 0 0 4 0
1 0 0 0 0 0 0 0 8 0

d) Periféricos de entrada con otro tipo de lógica.

A7 A6 A5 A4 A3 A2 A1 A0 IN
1 1 1 1 1 1 1 0 F E
1 1 1 1 1 1 0 1 F D
1 1 1 1 1 0 1 1 F B
1 1 1 1 0 1 1 1 F 7
1 1 1 0 1 1 1 1 E F
1 1 0 1 1 1 1 1 D F
1 0 1 1 1 1 1 1 B F
0 1 1 1 1 1 1 1 7 F
e) Lógica de un selecctor.

Este ejemplo muestra que valores


tendrá de salida el selector 74138, Seleccionador OUT
donde los valores A2,A1,A0 se irán
A2 A1 A0 I7 I6 I5 I4 I3 I2 I1 I0
incrementándo y generará una señal en
la puerta de salida correspondiente al 0 0 0 1 1 1 1 1 1 1 0
valor binario de dicho incremento. Asi
se tiene A2A1A0=000, generá una 0 0 1 1 1 1 1 1 1 0 1
señal en I0=0. A2A1A0=011
0 1 0 1 1 1 1 1 0 1 1
0 1 1 1 1 1 1 0 1 1 1
1 0 0 1 1 1 0 1 1 1 1
1 0 1 1 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1 1
f) Lógica de un selector con dirección de control.
Se tiene un selector cuyo valor de A2A1A0=000, genera señal en I0=0 . xx=00.

A7 A6 A5 A4 A3 A2 A1 A0 I
1 1 1 x x 0 0 0 0
1 1 1 x x 0 0 1 1
1 1 1 x x 0 1 0 2
1 1 1 x x 0 1 1 3
1 1 1 x x 1 0 0 4
1 1 1 x x 1 0 1 5
1 1 1 x x 1 1 0 6
1 1 1 x x 1 1 1 7

Ejercicio 1.- Encontrar el correspondiente direccionamiento si se desea una señal de


lectura en la puerta I0.

Solución: Como vemos en la figura, lo primero que realizaremos es asegurarnos es que la


señal en el TRI-STATE de alta impedancia sea 0, para eso dejamos I0=0 y el resto de las
puertas de salida I I …I7 en 1, de esta forma realizamos un corto circuito por alta
impedancia en las otras puertas. Las señales de control A2=0,A1=0,A0=0, permitirán
seleccionar la puerta de salida I0. Los buses de control ̅̅̅̅ e =1 determinar que se
trata de una operación de lectura en la puerta respectiva. Los valores A11,A12,A13,A14,A15
deberan ser 1, para que se genere una señal de 0 en .
Generamos el siguiente cuadro lógico

SALIDA Direccionamiento
I7 I6 I5 I4 I3 I2 I1 I0
A15 A14 A13 A12 A11 A10 A9 A8
1 1 1 1 1 1 1 0 IN
A7 A6 A5 A4 A3 A2 A1 A0
Nota: A A8 A A9…A7 A 5
1 1 1 1 1 0 0 0 F8H

Ejercicio 2.- Se desea obtener una señal de salida en I5.


Para ello hacemos A2=1, A1=0, A0=1, 5 5 . Recordando que se considera
desde el bit más significativo al bit menos significativo.

SALIDA
Direccionamiento
I7 I6 I5 I4 I3 I2 I1 I0
A15 A14 A13 A12 A11 A10 A9 A8
1 1 0 1 1 1 1 1
IN
A7 A6 A5 A4 A3 A2 A1 A0

0 0 1 0 1 1 0 1 2DH
Ejercicio 3.- Dado la siguiente dirección diseñar e implementar un circuito lógico.

A15 A14 A13 A12 A11 A10 A9 A8

A7 A6 A5 A4 A3 A2 A1 A0 IN
0 0 1 0 1 0 0 0 28H
0 0 1 0 1 0 0 1 29H
0 0 1 0 1 0 1 0 2ª
0 0 1 0 1 0 1 1 2B
0 0 1 0 1 1 0 0 2C
0 0 1 0 1 1 0 1 2D
0 0 1 0 1 1 1 0 2E
0 0 1 x 1 1 1 1 2F

Solución.

Por medio de los direccionamientos podemos deducir el siguiente esquema:


3.2.-Interfaz
Un interfaz es un dispositivo electrónico que permite conectar, los periféricos con la CPU.

2.-Interfaz en paralelo.
Transferencia simultáneas de 8 bits

Nota: La puerta C solo dispone de 6 bits, los otros restantes 2 bits son
considerado Don’t Care.
3.-Interfaz en serie: Transferencia bit a bit
2.-Registro control C/S
Este registro ayuda a direccionar el control status, programando las funciones de las puertas
como entrada o salida, la operación del timer y la Interrupción.

Interfas 8155 [8 bits]

Timer Interrup. PC PB PA
Puerta C Puerta B Puerta A

00= Timer no opera 00= IN


01= Stop timer 0=IN 0=IN
01=Proceso
10= Stop timer
diálogo 1=OUT 1=OUT
despues de completar 1
cuesta 10=Proceso
11=STAR parte timer diálogo
11=OUT

2.2.1.- Puertas PA-PB-PC


Para programar las puertas de entrada y salidas del 8155, debemos saber que cuenta con 3
puertas, PA,PB,PC, los cuales asignaremos como entrada o salida, dependiendo del
programador. Si el valor de PA=0, entonces PA será una puerta de entrada, en caso
contrario, será una puerta de salida (PA=1). Lo mismo para PB. PC es una puerta especial ya
que considera otro estado, llamado Proceso de diálogo( PC=01,PC=10), si PC=00 sera una
puerta de entrada y si PC=11, será una puerta de salida.

Ejemplo: PA=IN, PB=OUT, PC=IN

2.2.2.-Puerta Interrup
De momento vamos a considerar esta puerta Don’t Care.

2.2.3.-Puerta Time
Esta puerta controla el tiempo y dependiendo del requerimiento se va configurar los valores
de cada estado lógico esta en recuadro de arriba.

3.-Programación del TIMER


El interfaz posee un TIMER de 14 bits, que puede producir ondas cuadradas continuas,
pulsos continuo, una onda cuadrada y un pulso.

TH TL
4 9 C 4
0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
Modo 14 bits
00= una onda cuadrada
01= onda cuadradas continuas
10= un pulso
11= pulsos continuo.
Ejercicio Dado el siguiente circuito implementar las direcciones del Ship Select, las puertas
PA,PB,PC, TH y TL, si se tiene la interface 8155 y una señal de salida en I3 del selector 74138.
Solución:
Direccionamiento de las puertas del 8155 con el ship selector 74138

Direccionamiento en I3 [8 bits]

74138 8155

A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H CS (Control
status)
0 1 0 1 1 0 0 1 59H PA (Puerta A)
0 1 0 1 1 0 1 0 5AH PB (Puerta B)
0 1 0 1 1 0 1 1 5BH PC (Puerta C)
0 1 0 1 1 1 0 0 5CH TL
0 1 0 1 1 1 0 1 5DH TH
Direccionamiento en I5

74138 8155

A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 1 0 1 0 0 0 68H CS (Contro Status)
0 1 1 0 1 0 0 1 69H PA (Puerta A)
0 1 1 0 1 0 1 0 6AH PB (Puerta B)
0 1 1 0 1 0 1 1 6BH PC (Puerta C)
0 1 1 0 1 1 0 0 6CH TL
0 1 1 0 1 1 0 1 6DH TH
3.3.-Periféricos
3.3.1.-LED
Un led (LIGHT EMITER DIODE) es un un cuerpo semiconductor de gran resistencia que al
recibir una corriente eléctrica de muy baja intensidad, emite luz de forma eficiente y con alto
rendimiento.

Anodo Catodo

En un circuito lógico los estados de encendido del led dependerá si hay un flujo de
corriente en polarización directa, en caso contrario estará apagado. De allí que se
enciende un led cuando hay un cero lógico en el Cátodo y un 1 lógico en el Ánodo.

Ejemplo. Se tiene un set de 7 leds conectados a una señal de entrada. Si el estado lógico de
encendido (ON) es FOH, el esquema es el siguiente:

D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 1 0 0 0 0

3.1.-Display de 7 segmentos
ANODO COMUN: Los leds se encienden con 0.
CATODO COMUN: Los leds se encienden con 1.

Tabla GENERAL Cátodo común Tabla del simulador SIM 8085 Cátodo común
Display Valor hexadecimal Xgfe dcba Display Valor hexadecimal Xcde gbaf
0 3FH 0011 1111 0 77H 0111 0111
1 06H 0000 0110 1 44H 0100 0100
2 5BH 0101 1011 2 3EH 0011 1100
3 6EH 0110 1110 3 6EH 0110 1110
4 66H 0110 0110 4 4DH 0100 1101
5 6DH 0110 1101 5 6BH 0101 1011
6 5FH 0101 1111 6 7BH 0111 1011
7 07H 0000 1111 7 46H 0 100 0110
8 7FH 0111 1111 8 7FH 0111 1111
9 6FH 0110 1111 9 6FH 0110 1111
a) Ejercicio con CONTROL STATUS

Programando el CONTROL STATUS y las puertas de salida del 8155.


Si deseamos que la puertas del 8155 tengan la siguiente característica
PA=OUT , PB=OUT y PC=IN entrada.
Asignamos los valores:

REGISTRO CONTROL

Si X=0 PC PB PA

X X X X 0 0 1 1 03H

Programa:
MVI A, 03H
OUT 58H
Lo que realiza este pequeño programa es mover al acumulador el valor lógico
de las puertas PA, PB,PC (03H) para controlar las puertas del 8155. Se le
asigna 58H al Control Status (C/S), lógica ingresada por el direccionamiento del
uP74138 y el uP8155. De momentos hemos considerado el Time y el Interr.
como Don´t care (X=0)
Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits]

74138 8155

A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H C/S (Control
Status)
0 1 0 1 1 0 0 1 59H PA (Puerta A)
0 1 0 1 1 0 1 0 5AH PB (Puerta B)
0 1 0 1 1 0 1 1 5BH PC (Puerta C)
0 1 0 1 1 1 0 0 5CH TL
0 1 0 1 1 1 0 1 5DH TH

;--------------------------------------------------------------

; Programa que direcciona las puertas del Interfaz PA,PB,PC

;-------------------------------------------------------------

INICIO: MVI A,03H ;Designa los valores de la puerta


time/intrr/PC/PB/PA=0000 0011

OUT 58H ;C/S Control Status designado por


los direccionamientos del
; 8155 y el 74138
XX :IN 5BH ;Lee en la puerta C el contenido y
lo envía al Acc (ver tabla arriba)
ANI 01H ; Aisla el bit menos significativo
JNZ XX
MVI A,00H
OUT 59H ; Escribe el contenido de la puerta
A, el valor contenido en el Acc
JMP INICIO
MVI A,FF
OUT 5A ;Escribe el contenido de la puerta
B, el valor del Acc=FF
b) Ejercicio con TIMER PROGRAMABLE.

El microprocesador posee un TIMER de 14 bits, que puede programar. Ademas


posee un selector de tipo de onda.

TH TL
4 9 C 4
0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0
Modo 14 bits

Modo :
2500 : 2

0 0 Solo una onda cuadrada 1250 0


625 0
0 1 Ondas cuadradas
312 1
continuas
156 0
1 0 Un solo pulso 78 0
39 0
1 1 Pulsos continuos
19 1
Ejemplo: Se tiene una onda de pulso continua y una frecuencia 9 1
de entrada y de salida : 4 1

5 2 0
1 0
1
Calcular el TH y el TL

Solucion: Se calcula N

5
5

El valor de N es un valor decimal y debe convertirse en hexadecimal

5 9 ( 5 5
El valor 9C4H se envía al Timer programable.

TIMER
TH TL
4 9 C 4
0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0
Modo 14 bits

Programa

MVI A, C4H ; Asigna el valor 49C4H a TH/TL

OUT TL

MVI A, 49H

OUT TH
;----------------------------------------------------------------------
; programa con puertas
;---------------------------------------------------------------------

MVI A,03H ; Direccionamiento de las puertas Time,Intrr,PC,PB,PA, = 0000 0011


OUT C/S ; C/S=58H Valor del direccionamiento de uP8081 y la interfaz.
; El timer no opera.
;-------------
MVI A,C4H ;Es el valor del TIMER =49C4H, asignado al interfaz por N=fin/fout
OUT TL ; TL=5CH
MVI A,49H
OUT TH ; TH=5DH
;-------------
MVI C3H ; Time,Intrr,PC,PB,PA=1100 0011
OUT C/S ;
;

Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits]

74138 8155

A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H C/S (Control Status)

0 1 0 1 1 0 0 1 59H PA (Puerta A)

0 1 0 1 1 0 1 0 5AH PB (Puerta B)

0 1 0 1 1 0 1 1 5BH PC (Puerta C)

0 1 0 1 1 1 0 0 5CH TL

0 1 0 1 1 1 0 1 5DH TH
3.3.1.1.-Mi primer display
Vamos a copiar el siguiente programa en el editor ASM, compilar y seleccionar el display de
7 segmentos y ejecutamos el programa ejecutamos en RUN>>:
;-------------------------------------------------------------------------
; Programa mi primer display de 7 segmentos
;-------------------------------------------------------------------------
.ORG 0
MVI A, 77H
OUT 00H

HLT

;Ensamblado correctamente ©PTRRZA

;-----------------------------------------------------------------------------
; Programa mi primer display de 7 segmentos de 0 a 9 con retardo (DELAY)
;-----------------------------------------------------------------------------

.DATA 1000H
DB 77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH ;Definimos los números de 0-9
.ORG 0

INICIO: MVI D,0H ;Es nuestro contador


LXI H,1000H

XX: CALL MOSTRAR ; LLAMA SUBRUTINA


CALL DELAY

OTRO: INR D
CALL MOSTRAR
CALL DELAY
MOV A,D
CPI 9
JNZ OTRO
HLT

MOSTRAR: MOV L,D


MOV A,M
OUT 07H
RET
DELAY: MVI B,10H
DELAY2: MVI C,FFH
YY: DCR C
JNZ YY
YYY: DCR B
JNZ DELAY2
RET
;Ensamblado correctamente ©PTRRZA
Ejercicio Final
Se desea diseñar un programa para el microcomputador 8085 de la figura, que permita
leer un teclado numerico del 0 al 9, y que codifica su información en ASCII (0=30h, 1=31,.....
9=39h) conectado al puerto PB, tal como muestra la siguiente figura. Se entiende que sólo es
posible mostrar del 0 al 9 y por tanto se supone que solo existen esas teclas.

En la puerta C, hay conectado un led que se activa cuando se presiona una tecla.
Si se presiona la tecla 5, deberá generarse una serie de onda cuadradas de 5000 hz.
La Puerta A, esta conectada a un display de siete segmentos: PA0 a segmento a, PB1 a
segmento b y así sucesivamente, por lo cual deberá mostrarse en el display la información
correcta. Puede generarse una tabla donde este almacenada la información de cada digito
asociada al display.
Solución:
Se cuenta con el Up 8085, selector 74138, el interfaz 8155 y los periféricos, teclado,
display de 7 segmentos y un LED.

Antes programar debemos direccionar las puertas, definir el registro de control y


programar el timer. Para ello realizaremos los cuadros pasos :

1.- Direccionamiento.

2.- Registro control

3.- Timer

4.-Periféricos : Display de 7 segmentos - Teclado

5.-Programación
1.-Direccionamiento
Permite direccionar el C/S,PA,PB,PC,TH, TL. Requieres del selector 74138 y la interfaz
8155.

El selector genera una señal en I3 con A6A5A7=011=3, y para se activen los ENABLES
requiere que de allí que A4,A3=10. La señal del selector llega al
Chip Select del interfaz el que contiene los valores A2A1A0=XXX, que irán
incrementándose en forma binaria. Todos estos valores se trasladarán a una tabla, que nos
dará las direcciones de las puertas según sea las condiciones iniciales. Es importante para
programar.

Direccionamiento de las puertas del 8155 con el ship selector 74138


en I3 [8 bits]

74138 8155

A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
1 0 1 1 0 0 0 0 B0H C/S (Control Status)

1 0 1 1 0 0 0 1 B1H PA (Puerta A)
1 0 1 1 0 0 1 0 B2H PB (Puerta B)
1 0 1 1 0 0 1 1 B3H PC (Puerta C)
1 0 1 1 0 1 0 0 B4H TL
1 0 1 1 0 1 0 1 B5H TH

NOTA: El orden de las puertas mantenerlas como en el cuadro: C/S,PA,PB,PC,TL,TH.

No confundir Ship Select con el Contro Status


2.-Registro control
Este registro permite controlar las puertas de la interfaz PA,PB,PC, el INTERR y el TIME. Los
valores que asignaremos a las puertas serán de acuerdo al esquema.

PA=OUT=1, PB=IN=0, PC=OUT=11, INTERR=XX, TIMER=00 (no opera) y TIMER=11


para partir o START. Ingresamos los valores en la tabla

REGISTRO CONTROL

TIMER INTERR. PC PB PA

0 0 0 0 1 1 0 1 0DH

1 1 0 0 1 1 0 1 CDH
3.-Programación del TIMER
Se define conforme a los requerimientos del problema, para ello se requiere saber cuál es la
frecuencia del cristal, y cuanto nos pide generar.

Datos
614: 2
307 0

7 153 1
76 1 6
38 0
19 0
9 1
7
5 4 1 6
2 0

;___________PROGRAMACION TIMER________ 1 0
0 1
MVI A,66H
x 2
OUT TIMER_L
x
MVI A,42H

OUT TIMER_H

;____________________________________________

TIMER
TH TL
4 2 6 6
0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0
Modo 14 bits
*NOTA: Cuando se sobrepasa la capacidad de 14 bits es necesario otro TIMER

4.- Perifericos
4.1.-Display de 7 segmentos
ANODO COMUN: Los leds se encienden con 0.
CATODO COMUN: Los leds se encienden con 1.

Tabla del simulador SIM 8085 Cátodo


común
Display Valor hexadecimal Xcde gbaf
0 77H 0111 0111
1 44H 0100 0100
2 3EH 0011 1100
3 6EH 0110 1110
4 4DH 0100 1101
5 6BH 0101 1011
6 7BH 0111 1011
7 46H 0100 0110
8 7FH 0111 1111
9 6FH 0110 1111

Cátodo común 1 ON / Ánodo común 0 ON


RESUMEN TABLA ANSII
4.2-TECLADO
Teclado ANSII Teclado ANSII
Para leer el teclado es necesario identificar el
código que genera al presionar el teclado
numérico. Para ello recurrimos a la tabla de 0 30H 5 35H
código ANSII.(5=35H).
1 31H 6 36H

2 32 7 37H
0 1 2

3 4 5 3 33H 8 38H

6 7 8 4 34H 9 39H
9
Tabla completa código ANSII
5.- Programa Ejercicio Final
;PROGRAMA QUE LEE UN TECLADO Y GENERA UN PULSO CON LA TECLA 5
.data 1030
db C0H, F9H, A4H, B0H, 99H, 92H, 83H, F8H, 80H,98H
.define
CS B0H
TECLADO B1H
DISPLAY B2H
LED B3H
TIMERL B4H
TIMERH B5H
;_____________________
; INICIO PROGRAMA
.org 0
LXI SP,3000H ;Inicializamos el STACK
LXI H,1000H ;Nos posicionamos en la dirección
;____________________
;PROGRAMA TIMER
MVI A,0DH
OUT CS
MVI A,66H
OUT TIMERL
MVI A,42H
OUT TIMERH
;______________________
;LEER TECLADO
INICIO : IN TECLADO
MOV L,A
MOV A,M
OUT DISPLAY
MVI A,01
OUT LED
; ________________________
CALL Delay
MVI A,00H
OUT LED
;________________________ ;si se presiona la tecla 5=35H ESTE salta a la
MVI A,35H ;subrutina TIMER
CMP L
JZ TIMER
JMP INICIO
;________________________
TIMER: MVI A, CDH ;aqui se inicia un ciclo reloj de ondas cuadradas continuas
OUT CS ;se modifica CS
JMP INICIO
Delay: mvi C,00H
XX: DCR C
JNZ XX
RET
;____FIN PROGRAMA_____________
;Ensamblado correctamente ©EIEE
Nota del autor: El simulador no cuenta con un interfaz real por lo que el ejercicio anterior no se
podrá verificar y sólo será posible realizarlo en el laboratorio, sin embargo los resultados teóricos
no tendrían que variar mucho con los reales.

5.1.-Mi primer programa con IN/OUT.

;---------------------------------------------------------------------------
;Programa que presionando 0 se muestra en el display de 7 segmentos
;---------------------------------------------------------------------------
.org 0
mvi b,00h
mov a,b ;inicializo
inicio:in 00h ;ingreso por teclado un numero
cpi 30h ;comparo el contenido del acumulador con 30h que en ansi ii es 0
jnz inicio ; si es cero el contenido podremo salir del ciclo
mvi a,77h ;el valor (out) es 77h para el display de 7 segmentos es 0
out 00h ; este valor es llevado a la puera

hlt ;Ensamblado correctamente ©EIEE

;---------------------------------------------------------------------------
;Programa que presionando 7 se muestra en el display de 7
;---------------------------------------------------------------------------
.org 0
mvi b, 00h
mov a,b ;inicializo
inicio: in 00h ;ingreso por teclado un numero
cpi 37h ;en ansi ii es 7 (ver tabla ANSI)
jnz inicio ; si es cero el contenido podremos salir del ciclo
mvi a,46h ; el valor que sale (out) es 46h=7b
out 00h ; este valor es llevado a la puerta
hlt ;Ensamblado correctamente ©EIEE

VER Tabla del simulador SIM 8085 Cátodo común.


Anexamente quiero mostrarles un error importante cuando programé los periféricos y direcciones
del interfaz.

;Este programa nos muestra un error del programador

.org 0

.Data 1000h
db 10h, f9h
.define
TECLADO 01H

LXI SP, 3000H ;Inicializamos el STACK


LXI H,1000H ;Nos posicionamos en la dirección
MVI A,0AH
OUT TECLADO
HLT

; error declaramos el origen antes de define!!!

.Data 1000h
db 10h, f9h
.define
TECLADO 01H

.org 0 ;declaramos el origen después de define


LXI SP, 3000H ;Inicializamos el STACK
LXI H,1000H ;Nos posicionamos en la dirección
MVI A,0AH
OUT TECLADO
HLT
;Ensamblado correctamente ©EIEE
VI PROGRACION EN EL STACK SUBRUTINAS E
INTERRUPCIONES

6.1 PROGRACION EN EL STACK


La memoria de pila se puede describir como un conjunto de posiciones de memoria en
la memoria R/W que se utilizan para almacenar información binaria temporalmente durante
la ejecución de un programa. La memoria de pila es utilizada tanto por P como por el
programador. Siempre que P se encuentre con cualquier interrupción o subrutina la
secuencia de ejecución del programa se altera, en tal situación P coloca automáticamente la
dirección de la ubicación de memoria presente en el contador de programa en la pila y
después de ejecutar la interrupción o la subrutina el P devuelve al programa original
comprobando la dirección presente en la pila.

Del mismo modo, el contenido del registro puede ser almacenado en la pila y recuperado
por el programador. Durante la ejecución de un programa a veces es necesario guardar el
contenido de ciertos registros y datos en la memoria para que los registros puedan ser
utilizados para otras operaciones. Después de completar estas operaciones, los contenidos
guardados en la memoria se pueden transferir de nuevo a los registros. Las localizaciones de
la memoria para este propósito son reservadas por el programador en el principio.

El puntero de la pila se inicializa siempre al principio del programa utilizando la instrucción LXI
SP,dir. Esta instrucción carga el registro del puntero de pila con la dirección de memoria de 16 bits.
Cualquier área de la memoria RAM se puede utilizar como pila pero para evitar que el programa sea
destruido por la información de la pila, es una práctica general que el comienzo de la pila se
encuentre en la ubicación de memoria disponible más alta (FFFFH). La memoria de la pila se basa en
el principio del último en entrar es lo primero (LIFO). La entrada de datos en la pila se denomina
operación 'PUSH' y la recuperación de datos de la pila se denomina operación 'POP'. El puntero de
pila siempre tiene la dirección de la pila superior.

LXI SP, 3075H ; Carga el registro de apuntador de pila (16 bits) con 3075H.

LXI D, 3075H ; Esta instrucción carga el registro D con 30H y el registro E con 75H.
;De manera similar, si escribimos:
6.1.1 INSTRUCCIÓN PUSH Rp

Empuja el par de registros en la pila: Es una instrucción de 1 byte que se usa para
copiar el contenido del par de registros en la pila. la dirección de ubicación de memoria
presente en el registro del puntero de pila se decrementa 2 veces.

Ejemplo. Supongamos que el apuntador de pila contiene la dirección de memoria 2058H, el


registro D contiene 5AH y el registro E contiene 63H, es decir DE=5A63H la instrucción:

PUSH D
Ejecutan los siguientes pasos:

a) El puntero de la pila (SP) se decrementa en uno, es decir (SP-1), que aquí pasa a ser
2057H. El contenido del registro D (registro de orden alto), es decir, 5AH, se copian en
la posición de memoria 2057H (MSP-1)
b) El puntero de la pila es nuevamente decrementado por uno, es decir (SP-1), que ahora se
convierte en 2056H. El contenido del registro E (registro de orden inferior) se copia en
el nuevo valor de la posición de memoria 63H.

Antes de PUSH
Despues de PUSH

Puntero
Puntero
Stack
Stack
2058H
2056
Registro D Registro E
Registro D Registro E
5AH 63H
5AH 63H

DIRECCION SP MEMORIA
DIRECCION SP MEMORIA
2055 0
2055 0

2056 0
PC->2056 63H

2057 0
2057 5AH

PC->2058 0
2058 0

6.1.2.- INSTRUCCIÓN POP Rp

Es una instrucción de 1 byte que se usa para copiar el contenido de la memoria de la


pila al par de registros de la dirección de ubicación de memoria presente en el PC, el registro
del puntero de pila se incrementa 2 veces cada vez que se ejecute esta instrucción.

Ejemplo Supongamos que el puntero de pila contiene la dirección del ejemplo anterior
2056H y contiene 63H. La posición de memoria 2057H contiene 5AH y luego utilizando POP
D se ejecutan los pasos siguientes:

La instrucción: POP D
a) El contenido de la posición de memoria 2056H, se transfiere 63H al registro E, y el
puntero de la pila se incrementa en uno para (SP + 1), es decir, 2057H
b) El contenido de la posición de memoria 2057H, se transfiere 5AH al registro D y
ahora el contenido del par de registros BC =5A63H.
* El puntero de pila se incrementa de nuevo para obtener un nuevo valor (SP + 1), es decir,
2058H recuperando así los valores originales del registro par DE.
Antes de POP Despues de POP

Puntero Puntero
Stack Stack
2056 2058
Registro Registro C Registro B Registro C
X X 5AH 63H

DIRECCION SP MEMORIA DIRECCION SP MEMORIA


2055 0 2055 0

PC->2056 63H 2056 63H

2057 5AH 2057 5AH

2058 0 PC-> 2058 0

6.4.1 Resumen
Cada vez que usamos las instruccion PUSH debemos considerar el orden con su
respectivo POP, ya que estamos programando sobre una pila tipo LIFO en el STACK, por lo
tanto lo ultimo que ingresamos es lo primero que colocamos.

;Programa del ejemplo anterior que borra y recupera su información


.org 1000H
LXI SP,2058 ; Ubicamos PC en la dirección del STACK POINTER
LXI D, 5A63H ; Inicializamos los valores del registro par DE
PUSH D ; Transferimos D=5AH en la dirección del STACK 2057
; Transferimos E= 63H en la dirección del STACK 2056
;modificamos el registro par con el valor DE=FFFFH
MVI D,FFH
MVI E,FFH

;recuperamos los datos del STACK


POP D ;El contenido de la dirección 2056 es transferido a E
;se incrementa el STACK
;El contenido de la dirección 2057 es transferido a D -> DE=5A63H
;Se incrementa el STACK quedando en la dirección 2058
HLT
;Ensamblado correctamente ©EIEE
Resumen: Cada PUSH viene asociado con un POP, y debe programarse en base a una pila tipo
LIFO.

PUSH PSW DIRECCION STACK


PUSH H SP-6 FFF9 (C)
PUSH B
FFFA (B)
.
. SP-4 FFFB (L)
POP B FFFC (H)
POP H SP-2 FFFD Flags
POP PSW SP FFFE (A)
. PC FFFF
.

*Nota del autor: No puedes colocar PUSH C, PUSH L o PUSH E ! ya que estamos trabajando
sobre los registros pares : HL, BC, DE, PSW.

No programar sin un orden LIFO ya que trabajanos en una pila.

EJ: Error Orden LIFO

PUSH B PUSH B

PUSH H PUSH H

POP B POP H

POP H POP B

… ….
6.2.-PROGRAMACIÓN CON SUBRUTINAS
6.2.1.- INTRUCCION CALL dir

CALL guarda el contenido del contador de programa (la dirección de la próxima


instrucción secuencial) dentro del stack y a continuación salta a la dirección especificada por
DIR.

Cada instrucción CALL o alguna de sus variantes implica una instrucción RET
(retorno), de lo contrario el programa podría "perderse" con consecuencias impredecibles.
La dirección debe ser especificada como un número, una etiqueta, o una expresión. La
etiqueta es lo más normal (El ensamblador invierte los bytes alto y bajo de dirección durante
el proceso de ensamblado).

Las instrucciones CALL se emplean para llamadas a subrutinas y debemos tener


presente que siempre emplean el stack.

EJEMPLOS

;Programa que llama a una subrutina sin usar el Stack Pointer (SP)
;y sufre perdidas de los valores en los registros originales
.ORG 0
MVI H,0AH
MVI L,10H
MVI C,0AH
CALL SUBRUTINA
XX: DCR C
JNZ XX
HLT ;Se pierde el valor original HL=0A10 con HL=00FF

SUBRUTINA:
MVI H,00H
MVI L,FFH
RET
;Ensamblado correctamente ©EIEE
;Para corregir este error ocuparemos el STACK y las instrucciones
PUSH y POP.
;Programa que guarda datos en el SP

.ORG 1000H ; Nos posicionamos con PC en la dirección 1000H


LXI SP,FFFFH ;Direccionamos el SP en la mas alta dirección
MVI H,0AH ;Inicializamos los valores con HL=0A10H
MVI L,10H
MVI C,0AH ;Inicializamos el counter

PUSH H ;PUSH guarda en el Stack el valor HL=0A10H


CALL SUBRUTINA ;En la subrutina HL=00FF y se pierde el valor original
POP H ;POP restaura el valor ORIGINAL HL=0A10H

XX :DCR C ;Programa principal del contador


JNZ XX
HLT

SUBRUTINA:
MVI H,00H ;valor
MVI L,FFH
RET ;retorna al programa principal

;Ensamblado correctamente ©EIEE

Conclusión PUSH: Salva los registros en el Stacks.


6.3.-Interrupciones
Una interrupción puede ser definida como cualquier señal al P que altera la normal
secuencia de ejecución de un programa. La interrupción puede introducirse en el P a través
de una instrucción escrita en el programa o incluso puede iniciarse mediante un dispositivo
externo. Siempre que el P recibe cualquier interrupción su control se cambia a otra
ubicación para ejecutar un conjunto de instrucciones llamadas rutinas de servicio que están
escritas en esa ubicación. El P reanuda su funcionamiento después de completar la rutina
de servicio. La interrupción en 8085 es controlado por el flip-flop Interrupt Enable, que es
interno al procesador y se puede configurar o restablecer mediante el uso de instrucciones
de software. Existen dos tipos de interrupciones:

A) Interrupciones de software

B) Interrupciones de hardware

6.3.1 Interrupciones de software

El conjunto de instrucciones de 8085 incluye ocho instrucciones de RST (reinicio)


denominadas interrupciones de software. Estas son instrucciones de un byte. Cada una de
estas instrucciones permite transferir la ejecución del programa a una ubicación específica
en 00H. Por lo tanto, las instrucciones RST actúan como un vector que apunta hacia
diferentes posiciones de memoria. La Tabla 1 muestra la lista de diferentes instrucciones
RST.

6.3.2 Interrupciones de hardware

Hay cinco interrupciones de hardware en 8085. Son:

Tabla dirección de llamadas a INTERRUPTS


Orden de prioridad Interrupts Call locations
1 TRAP 0024H
2 RST 7.5 003CH
3 RST 6.5 0034H Mascara individual
4 RST 5.5 002CH Mascara individual
5 INTR Non-vectored interrupt

Las interrupciones también se clasifican como:

a) Interrupciones vectorizadas: Las interrupciones vectorizadas son las que tienen


algunas ubicaciones de memoria específicas y el control se transfiere automáticamente a
la ubicación de memoria respectiva sin ningún hardware externo.
El ejemplo de interrupción vectorizada es RST5.5, RST6.5, RST7.5 y TRAP.

b) Interrupciones no vectorizadas: Las interrupciones no vectorizadas son aquellas en


las que el usuario tiene que especificar la dirección junto con la interrupción en la que se
va a transferir el control. El ejemplo de la interrupción no vectorizada es INTR.

c) Interrupciones enmascaradas: Las interrupciones mascarables son las que P no


necesitan asistir inmediatamente y en lugar de ello el P puede pedirle que espere un
tiempo. El ejemplo de interrupción enmascarable es RST5.5, RST6.5, RST7.5 e INTR.

d) Interrupciones no enmascaradas: También se conoce como NMI. Es la interrupción que


P tiene que asistir como y cuando viene, es decir, no se puede ignorar o pide que espere.
Ejemplo de interrupción no enmascarable es TRAP.

a) EI- Enable interrupt


b) DI- Disable interrupt
c) SIM- Set Interrupt Mask
d) RIM- Read interrupt Mask
e)MSE-Mask Set Enable: Permite poner mascaras.|
6.4.-INTERRUP INTR

Esta interrupción no es possible vectoriazarlas, debido a que possee 8 direcciones dentro del
hardware.

SID I7 I6 I5 IE ̅̅̅̅̅̅̅̅
. ̅̅̅̅̅̅̅̅
. ̅̅̅̅̅̅̅̅
.

Serial If bit=1 Flip- If anyone of the three bits (D0,D1


Imput Then the interrupt are Flop is and D2)=1 then it implies that the
Data pending set respective interrupt is masked.
More than one interrupts can also
be masked
6.5.-SET INTERRUPT MASK SIM
Características del Set Interrupt Mask

Para poder acceder a las diferentes interrupciones debemos llamar a las instruccione:
MVI Acc, dir, SIM (set Interrup Mask) y EI (Enable Interrup).

mvi Acc,dir ;dir puede activar las interrupciones /M7.5 /M6.5 /M5.5

sim ;Habilita las máscaras

ei ;Habilita las interrupciones

di ;Deshabilita las interrupciones

D7 D6 D5 D4 D3 D2 D1 D0

SOD SDE XXX RST 7.5 MSE ̅̅̅̅̅̅̅̅


. ̅̅̅̅̅̅̅̅
. ̅̅̅̅̅̅̅̅
. SIM

0 0 0 1 1 0 0 0 18H

0 0 0 1 1 0 1 1 1BH

0 0 0 0 1 1 0 1 0DH

0 0 0 0 1 1 1 0 0EH

Vectorizable RST5.5, RST6.5, RST7.5 TRAP.

Enmascarable RST5.5, RST6.5, RST7.5 INTR.


SIM Operation Enable

SOD Serial Output data 1

SDE Serial data Enable if D6=1 Then serial output is enable 1

XXX Don´t care 0/1

Reset RST 7.5 If D4=1 Additional control to reset RST7.5

MSE: Mask Set Enable If D3=1 then D0, D1 and D2 are enable 1

D2 0 RST7.5 is enabled / 1 RST7.5 is disabled 0

D1 0 RST6.5 is enabled / 1 RST6.5 is disabled 0

D0 0 RST5.5 is enabled / 1 RST5.5 is disabled 0

RST 7.5, RST 6.5, RST 5.5: All the three interrupts are vectored and maskable interrupts. In
order to enable these interrupts the P requires two instructions:

a) EI (Enable Interrupt)
b) SIM (Set Interrupt Mask)

Besides these three interrupts are sensitive to different types of triggering as explained
below:

RST 5.5 and RST 6.5: These are level sensitive interrupts which implies that the
triggering level should be on until the P completes the execution of current instruction. If
the P is not able to respond immediately to these interrupts then they should be stored by
external hardware.

RST 7.5: It is positive-edge sensitive and can be triggered with a short pulse. In this
case if the P is unable to respond immediately then the request is stored internally by D-
flip-flop.
TRAP: It is vectored, non-maskable interrupt. It is level-and edge-sensitive, which
implies that the input should go high and remain in that state until it is acknowledged by the
P. In case of TRAP the instructions like EI (Enable interrupt), DI (Disable interrupt) and
SIM (Set Interrupt Mask) are not required i.e. it need not be enabled, and it cannot be
disabled. The triggering of various interrupts can be
summarized in the form of diagram as shown below:

;------------------------------------------------------------------------
; Programa de retardo con interrupcion /M 7.5
;-----------------------------------------------------------------------

.org 0
jmp 40h ;Dirección del programa principal

.org 3ch ;Dirección designada internamente para /M 7.5 (ver tabla)


jmp 100h ;Por poco espacio se efectua un salto a esta dirección

.org 40h ;Dirección del programa principal


lxi sp,FFFFh

mvi a,0Bh; Enmascaramos sin resetear RST F/F /M75 = 0000 1011
;Para explicar en términos visuales esta interrupción
sim
ei ;De momento habilitaremos las interrupciones
mvi a,F0H ;Corresponde al contenido del programa principal
x1: out 0
call delay
rlc
jmp x1

delay: mvi c,FFh


x2: dcr c
jnz x2
ret

.org 100h
push psw
push b
mvi b,88h ; vamos a a rotar 10 veces los 8 bits
mvi a,80h ; El valor a rotar sera A= 1000 0000

x3: out 01
call delay ;Para poder visualizar se llama a un retardo
rrc ;Rotamos a derecha para diferenciarnos del programa
principal
dcr b ;
jnz x3
pop b
pop psw
ei
ret

;Ensamblado correctamente ©PTRRZA


Fig.- Programa se ejecuta y enciende y rota los leds en la puerta 00H.

Fig.-Se activa una Interrupción y los leds se encienden y rotan en 01H

Una interrupción básicamente es un programa que interrumpe una instrucción


dejándola en proceso (PAUSA). Una vez realizado esta operación, regresa al programa
principal para que siga efectuando su operación.

Nota: Se debe tener cuidado con las direcciones de retorno y salto, para no sobrescribir
las direcciones de las interrupciones. Sería nefasto perderse en el programa y por ende
debemos tener cuidado de usar las instrucción RET cuando sea necesario. Como se trabaja
con datos dentro de una pila, muchas veces es necesario almacenarlos en el STACK, y por
ello se usa las instrucciones PUSH y POP.
7.-Conclusiones finales.

He querido dejar este material a disposicion a cualquier alumno que desee aprender
sobre programación en lenguaje assembler. Espero haber sido de algún aporte en el camino
de la enseñanza, he rescatando ejemplo de mis compañeros de curso, notas del profesor, la
WEB, y ejercicios propios. He corregido y compilado los ejercicios para que puedan ser mas
fácil copiar y pegar en el simulador cada programa paso a paso.

Les deseo lo mejor de los éxitos.


ANEXO

NumeRos Decimales, Binarios y Hexadecimal.

Dec Bin Hex

0 0000 0

1 0001 1

2 0010 2

3 0011 3

4 0100 4

5 0101 5

6 0110 6

7 0111 7

8 1000 8

9 1001 9

10 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

Potrebbero piacerti anche