UNIVERSIDAD DE TARAPACÁ
Escuela Universitaria de Ingeniería Eléctrica Electrónica
APUNTES DEL MICROPROCES ADOR 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 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.
En términos básicos un computador es una máquina de calculo que funciona a base de un compuesto fundamentalmente por una unidad de entrada, una unidad de salida, y una unidad llamada CPU. 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.
: Esta unidad permite leer información por unidades de entrada, como teclados, mouse, USB (Modo lectura), lector de disco, micrófono. Etc. Tiene 2^8=
de entrada.
: La información es procesadada por esta unidad y almacenada en la 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. : Luego de ser procesado la información se escribe por medio de unidades de salida, como son el monitor, el parlante, la impresora, USB( modo escritura), LED, motores, bombas, etc.
Tiene 2^8=
salida
el cristal posee una frecuencia de 6MHz su frecuencia de operación será de 3MHz ya que
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.
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: (CPU - Central Processing Unit)
-
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 llama
se
En una CPU podemos distinguir:
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.)
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: : Guardan la información con la que se trabaja. Guardan direcciones de memoria (en las que puede haber datos). Controlan el estado de la CPU (flags: zero, overflow, underflow, positivo/negativo...)
Se encarga de leer las instrucciones máquina almacenadas en la y de generar las señales de control necesarias para controlar y coordinar el resto de las unidades funcionales de un , con el fin de ejecutar las instrucciones leídas.
: 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. Guarda la instrucción que se está ejecutando. Interpreta la instrucción a ejecutar. Genera una señal de sincronía. Activa en el orden adecuado las diferentes unidades funcionales para ejecutar la instrucción.
La lógica de las operaciones está implementada mediante hardware. Se trata de una pequeña CPU en miniatura que puede programarse para realizar diferentes tareas.
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. (que virtualmente es ilimitada), pero es mucho más rápida. Actualmente la memoria principal se implementa circuitos integrados. La memoria principal de los sistemas informáticosmediante suele estar formada por dos áreas diferenciadas: 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. 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.
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: Si sirven para introducir información en el sistema informático (ej. teclado, ratón...) Si representan información que sale del sistema informático (ej. monitor, impresora...)
Transportan la información entre los diferentes elementos de la CPU. Se distingue entre el (que transporta la información que se está procesando) y el (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).
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.
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.
El bus de direcciones se utiliza para indicar el srcen 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 cada momento. tratarse de una dirección la memoria principal oenpuede tratarse dePuede una dirección memoria en lade que está mapeado un periférico. El ancho en bits del bus de direcciones determina el tamaño del espacio de memoria direccionable.
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: : Frecuencia de reloj (Chip select): Activa el chip a utilizar : Está disponible el o no el dispositivo : Se trata de una operación de lectura o escritura
El microprocesador 8085 esta construida en base a la y debido a eso, está constituido básicamente por tres grandes bloques:
La unidad de control es un bloque de lógica cableada dentro del circuito integrado (CI). Esta parte del sistema . 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 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.
El 8085 tiene una serie de denominados B, C, D, E, H y L, de , 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 .
Hay también de también sony llamados registros un de bloque direccionamiento. Están conectados al busque de direcciones suele haber dos registros de este tipo que son: Contador del Programa o Program Counter puntero de pila de 16 bits.
, de 16 bits el Stack Pointer o
El
de
, es un registro denominado abreviadamente
,
y puede alterarse cuando aparece la instrucción o La señal , que coloca al PC a cero e inicializa la ejecución del programa. ,
, denominado durante el desarrollo de programas tanto abreviadamente para trabajar con , es indispensable como para el 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 , es decir lo último que ponemos es lo último que usamos, a diferencia del First In First Out, este último lo primero que ponemos es lo primero que usamos.
El bloque fundamental del microprocesador es el llamado , 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 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 denominado Registro de Estado o que marcarán distintas características de las operaciones desarrolladas.
La denominación y situación de cada flag se muestra en el siguiente esquema.
S
Z
X
AC
X
P
X
CY
S es el flag de signo. Si el resultado es y si el resultado del flag es . Considerando que el bit más significativo es el que se toma como bit de signo.
Ejemplo:
Ejemplo:
0 00 0 0 1 01
0 00 0 0 1 01
+ 0 00 0 0 0 11
+ 1000 0011
0000 1000
S=0
1000 1000
S=1
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:
0 00 0 0 1 01 + 0 00 0 0 0 11 0000 1000
0 00 0 0 0 00 + 0000 0000 z=0
0000 0000
z=1
) 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 que hay en un resultado de una Por ejemplo 1011 es impar porque hay 3tener. unos, y 0101 es par porque hayoperación. 2 unos, independiente del valor binario que pueda
Ejemplo:
Ejemplo:
0 00 0 0 1 01
0 00 0 1 0 01
+ 0 00 0 0 0 11
+ 1100 0000
0 000 1000
P=0
1 100 1001
P=1
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
[]
0 00 0 1 1 11 + 0 00 0 0 0 01 0001 0000
0 10 0 0 1 00
AC=1
+ 0000 1000 0 0 0 0 1 1 0 0 AC=0
CY es el señalizador de arrastre. Si hay carry Cy=1. Si no hay carry Cy=0
Ejemplo:
Ejemplo:
1 00 0 0 0 00
0 10 0 0 1 00
+ 1 00 0 1 0 00
+ 0000 1000
1 00 0 0 1 0 0 0
Cy=1
0000 1100
Cy=0
: El microprocesador posee . 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. : Si consideramos el cero como posición serian 65535 posiciones k
que intercambian información entre sus distintos bloques internos y para comunicarse con el exterior. compuesto por una serie de líneas, variable en número según el componente que de se trate. de funciones, pudiendo serdeunas salidaContiene y otras las de líneas entradadealsincronización 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). = 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. Se desea
una información
.
( 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)
Si se desea escribir
, ,
Si se desea leer
, ,
Si se desea escribir
, ,
: 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
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).
término creado por Werner Buchholz como una equivalente a . 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
1 byte ->
H
2 bytes -> 1111 11111
( 8bits ) H
(16 bits)
son posiciones de memoria que almacenan información, son operandos en donde actúa y los 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.
Cuando nos referimos a un numero acompañado de una H estamos hablando de un valor . Ej: 10H se refiere al numero 0001 0000 EL , 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.
DE LAS INSTRUCCIONES DEL MICROPROCESADOR 8085 1
21
41
61
2
22
42
62
3
23
43
63
4
24
44
64
5
25
45
65
6
26
46
66
7
27
47
67
8
28
48
68
9
29
49
69
10
30
50
70
11
31
51
71
12
32
52
72
13
33
53
73
14
34
54
74
15
35
55
75
16
36
56
76
17
37
57
77
18
38
58
19
39
59
20
40
60
,ORG, data, Db, BW
https://es.scribd.com/document/337573426/SET-de-Instrucciones-Del-8085
dominar las programación.
Para programar en Lenguaje Assembler se necesita y requiere muchas horas de
INSTRUCCIONES DEL MICROPROCESADOR 8085
Bits afectados: Direccionamiento: Registro indirecto
El contenido del registro R2 es transferido al registro R1. R1 y R2 pueden ser los registros B, C, D, E, H, L o el acumulador A. Supongamos que el registro B contiene 00H y el egistro C contiene 30H almacenará 30H en el registro B. Si A=15H, B=12H entonces: MOV A,B
;Mueve el contenido del registro B al Acumulador
: 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.
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. 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
: A=55H
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 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. M=4AH Posición de memoria = 18 AA H
.. 55H 4AH .
Bits afectados: Direccionamiento: Inmediato
el primer operando debe ser uno de los registros A, B, C, D, E, H o L, que será cargado con el dato especificado en el segundo operando (DATO). El dato no debe exceder de un byte. La instrucción: carga en el registro H el valor 33H, mientras que La instrucción carga en el registro L el valor 44H.
Supuestos los dos ejemplos anteriores, la instrucción
carga en la posición de memoria 3344H (dirección aportada por los registros H y L) el valor 2AH.
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 Compara B con el acumulador efectuando una resta interna. El registro B contiene 05H, se complementa a 2. Registro Comp. 1 Comp. 2
05H C-1: C-2: +
0 1
0 1
0 1
0 1
0 1
1 0
0 1
1 0 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: + 05H
1
1
1
1
1
0
1
1
0
0
0
0
0
1
0
1
Z=0 Cy=0 X>Y
X=Y
X
Z
0
1
0
Cy
0
0
1
Flags afectados: Z, S, P, CY, AC Direccionamiento: Registro indirecto.
Compara el valor del byte especificado con el contenido del acumulador y posiciona los bits de cero y acarreo para indicar el resultado. El bit de cero indica igualdad. Un 0 en el acarreo indica que el contenido del acumulador es mayor que DATOS. 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). (2). 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 Comp. 1 Comp. 2 Dato comp.
20H C-1: C-2: + E0H
0 1
0 1
1 0
0 1
0 1
0 1
0 1
1
1
1
0
0
0
0
Acc Dato comp
25H: E0H: + 05H
0 1 0
0 1 0
1 1 0
0 0 0
0 0 0
1 0 1
0 1 1 0
0 0 0
1 0 1
Cy=1 X>Y
X=Y
X
Z
0
1
0
Cy
0
0
1
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. . El resto trabajan con datos de 8 bits. , el segundo byte de la instrucción sustituye a los 8 bits menos asignificativos puntero de pila, mientras tercer byte de la instrucción reemplaza los 8 bits másdel significativos del puntero deque pila.elEjemplo: 1. La instrucción carga en el registro B el valor 00H y en el registro C el valor FFH.
2. La siguiente instrucción carga en el puntero de pila el valor 1000H
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
en la posición de memoria del registro 3F16H. Posición de memoria BC= 3F16 H
1FH
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 de memoria 0080H:
en la posición
Posición de memoria
. . 1FH .
Podemos concluir que tanto como en la posición de memoria, y lo realizaran por medio de un registro o por medio de una dirección respectivamente.
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 el contenido de la posición de memoria 3F16H. Posición de memoria 3F16 H
. . 10H .
. 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:
Posición de memoria 1000 H
. . 12H .
Podemos concluir que tanto como . Lo realizaran por medio de un registro o por medio una dirección respectivamente.
Bits afectados: Z, S, P, AC
El contenido del registro o posición de memoria especificados se incrementa en una unidad. Si el registro A contiene 98H, la instrucción
Direccionamiento: Registro indirecto hará que este registro contenga la cantidad 99H.
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 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 hace que éste contenga 0000H. El contenido del registro o posición de memoria especificados se decrementa en una unidad. Si el registro A contiene 99H, la instrucción
hará que este registro contenga la cantidad 98H.
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
hace que el registro H contenga 2FH y el registro L el valor FFH.
Bits S, P,CY,afectados:Z, AC Direccionamiento: Registro
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 acumulador. 1. Si el registro B contiene el valor 3AH y el acumulador contiene 6CH, la instrucción realiza la siguiente suma:
Reg. B Acc
3AH: 6CH: +
0 0
0 1
1 1
1 0
1 1
0 1
1 0
0 0
Nuevo Acc
A6H
1
0
1
0
0
1
1
0
2. La instrucción duplica el contenido del acumulador.
Bits afectados:Z, S, P,CY, AC Direccionamiento: Registro indirecto
El contenido del registro o posición de memoria especificados más el contenido del bit de acarreo, se suman al contenido del acumulador. Supongamos que el registro B contiene el valor 30H, el acumulador 76H, y el bit de acarreo está puesto a cero (Cy=0). La instrucción del microprocesador realizará la siguiente suma: Registro B Acc Bit de acarreo
30H 76H: :+
0 0
0 1
1 1
1 1
0 0
0 1
0 1
0 0 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 cerolaexcepto los hubiera de signotenido y paridad. el bit de suma acarreo hubiera sido 1 (Cy=1) antes de realizar operación, lugar Si la siguiente Registro B Acc Bit de acarreo
30H 76H: :+
0 0
0 1
1 1
1 1
0 0
0 1
0 1
0 0 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.
Bits afectados:Z, S, P, CY, AC
Suma el valor del byte especificado en la instrucción (DATOS), al contenido del 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). (2). (3).
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 Dat. Inmediat. Nuevo Acc
22H: 14H: + 36H
0 0 0
0 0 0
1 0 1
0 1 1
0 0 0
0 1 1
1 0 1
0 0 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.
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). (2). 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 20d 14H: 0 0 Bit de acarreo :+ Nuevo Acc
37H
0
0
1 0
0 1
0 0
0 1
1 0
0 0 1
1
1
0
1
1
1
Todos los bits se ponen a cero.
Bits afectados: Z, S, 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 realizará la siguiente operación de resta: (Registro B)+(-28H)
Registro Comp. 1 Comp. 2 Dato comp.
28H C-1: C-2: + D8H
0 1
0 1
1 0
0 1
1 0
0 1
0 1
1
1
0
1
1
0
0
0 1 1 0
Acumulador Dato comp.
60H: D8H: + 38H
0 1
1 1
1 0
0 1
0 1
0 0
0 0
0 0
0
0
1
1
1
0
0
0
El acumulador obtiene un nuevo valor A=38H.
Bits afectados: Z, S, P,CY, AC
El byte de datos inmediato se resta del contenido del acumulador usando aritmética de 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). (2). 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: + 4DH
1 0
1
0
1
1
0
1
1
1
0
0
1
1
1
0
0
1
1
0
1
0
0
0
0
0
0
0
Dato comp. Acumulador
B3H:
1
0
Dato comp.
4DH: +
0
00H
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.
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). (2). 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
1
1
1
1
1
1
1
Bit acarreo Nuevo Acc.
:+ FFH
0 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.
Bits afectados: Z, S, P,CY, AC 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 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.
Bits afectados: Z, S, P, CY, AC
6CH:
0
1
1
0
1
1
0
0
28H
0
0
1
0
1
0
0
0
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). (2). 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 Dato inmediato
A0H: 0FH:
1 0
0 0
1 0
0 0
0 1
0 1
0 1
0 1
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. Bits afectados: Z, S, 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 0 0 1 1
B 0 1 0 1
F 0 1 1 0
1. Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción realiza la siguiente operación: Acumulador
3AH:
0
0
1
1
1
0
1
0
Registro B
6CH: 56H
0 0
1 1
1 0
0 1
1 0
1 1
0 1
0 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 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. Bits 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 srcinal. De este modo y suponiendo que el acumulador contiene ABH, la instrucción complementa el bit de más peso del acumulador, tal y como se muestra en la siguiente figura: Acumulador Dato inmediato
Bits afectados: Z, S, P, CY, AC Direccionamiento: Registro indirecto
ABH: 80H:
1 1
0 0
1 0
0 0
1 0
0 0
1 0
1 0
2BH
0
0
1
0
1
0
1
1
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, 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: A B F 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 realiza la siguiente operación: Acumulador 33H: Dato inmediato 0FH:
0 0
0 0
1 0
1 0
0 1
0 1
1 1
1 1
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. Bits afectados: Z, S, P, CY, AC
ORI desarrolla una operación lógica OR entre el contenido especificado por DATOS y el 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 realiza la siguiente operación OR bit a bit: Acumulador Dato inmediato
3CH: F0H:
0 1
0 1
1 1
1 1
1 0
1 0
0 0
0 0
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.
Bits afectados: CY Si el bit de acarreo es 0, se pone a 1. Si es un 1, se pone a 0.
El bit de acarreo se pone a 1. Bits afectados: Z, S, P, CY, AC Direccionamiento: Registro indirecto
El número hexadecimal de 8 bits contenido en el acumulador se ajusta como dos dígitos de 4 bits codificados en binario decimal, según el proceso siguiente: (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 noeltienen lugar del las acumulador no se incrementa. Si hay acarreo de los circunstancias expuestas, contenido 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 +6
C0H: 60H: 20H
1 0 0
1 1 0
0 1 1
0 0 0
0 0 0
0 0 0
0 0 0
0 Cy=0 0 Cy=0 0 Cy=1
En resumen puedes obtener un resultado en DECIMAL a partir de una operaciion HEXADECIMAL
No se realiza ninguna operación.
Bits afectados: CY 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.
Supongamos que el acumulador contiene F2H.
Bits afectados: CY 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.
Bits afectados: CY 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:
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:
La instrucción JMP DIR altera la ejecución del programa cargando el valor especificado por DIR en el contador de programa.
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.
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. 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.
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.
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.
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. acumulador (bit de signoSi=el1)contenido continúa del el programa conessunegativo ejecución normal.
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).
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 invierte los bytes alto y bajo de expresión. La etiqueta es lo más normal (El ensamblador 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.
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.
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.
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.
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. 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. CP dir 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.
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.
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.
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.
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 RNC 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. RZ 56
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.
RNZ 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. RM 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 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 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 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 . 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
62
EI
utilizar una instrucción de RETORNO. 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 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 TRAPesta delprevista 8085 no puesta que fuerapueden de servicio. Esta interrupción especial parapuede seriosser problemas presentarse independientemente del bit de interrupción (fallo de alimentación, etc.).
64
IN port 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
65
OUT port
66
HLT
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. 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. La instrucción OUT 2 envía el contenido del acumulador al puerto de salida número 2. 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.
67
PUSH pr
El contenido del par de registros especificado se guarda en dos bytes de memoria definidos por el puntero de stack. 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 Stack 2030 Registro B 3F
Registro C 16
Puntero Stack 2030 Registro B 3F
Registro C 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
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 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
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 Puntero Stack 2028 Registro B 00
Despues de POP
Registro C 16
Puntero Stack 2030 Registro B 3F
Registro C 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 carga 00H en el acumulador y pone los bits de estado de la siguiente forma:
=16H
S
Z
0
0
X 0
Ca
X
P
X
Cy
1
1
1
1
0
69
DAD pr 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 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
D 03
Antes de ejecutar XCHG E H 04
01
L 02
D 03
Antes de ejecutar XCHG E H 04
01
L 02
71 XTHL 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 Puntero Stack 40B4 Registro B Registro L AA BB
Antes de XTHL Puntero Stack 40B4 Registro B Registro L AA BB
MEMORIA
DIRECCION
MEMORIA
DIRECCION
00
40B3
00
40B3
CC
40B4
CC
40B4
DD
40B5
DD
40B5
00
40B6
00
40B6
72
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
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 efectuará las siguientes modificaciones en memoria:
Memoria
de ejecutar SHLD
Memoria
de ejecutar SHLD
MEMORIA
DIRECCION
MEMORIA
DIRECCION
FF
34B2
FF
34B2
FF
34B3
54
34B3
FF
34B4
3C
34B4
FF
34B5
54
34B5
74
75
76
77 ORG 0 ; Posicion de programa en la D IRECTIVA
.data DIR ; Direccion donde empiezo a colocar mis datos, Ej: 2000H dB ; Directiva asociada a adatos 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 t abla. dW 1,3,4,4,1234H ;Coloca datos en la t abla pero ocupa 2 bytes .
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
. .
Para poder identificar la operación se debe identificar el de la , 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 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
A,B
Tamaño instrucción 1 Byte
Op. Code
A,55H
Op code
2 Bytes
dato 1234H
Op. Code Dato dato
3 Bytes
Dado los siguientes nemónicos desensamblar. 55 15
22
77
Con la tabla 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
PC
Cod. Dat
Instrucción
0
55H
MVI A,55H
Tamaño Bytes 2
2
15H
MVI B,15H
2
4
22H
MVI C,22H
2
6
MOV H,C
1
7
MOV L,B
1
8
MOV M,A
1
Apunta siguiente inst. por .
Total
Bytes
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. , 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.
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 , 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.
Antes de programar lo primero realizaremos es descargar el . Se trata de un programa que ensambla las instrucciones que usa el microprocesador 8085.
Una vez descargado e instalado, ya contamos con la herramienta para poder comprender esta materia.
Abrimos el editor ASM/archivo/nuevo
Escribimos nuestro programa y ensamblamos
Para programar es necesario tener claro que estamos programando sobre , para cualquier operación debemos especificar una direccion, allí podemos quitar, transferir ,copiar, es decir realizar 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 .
Un salto dentro de un programa, pueden estar condicionadas o no. Generalmente el programador designa algún para señalar a la dirección al que quiere saltar. Ej: … MVI A,B JUMP Salto incondicional al label o etiquetado HLT …
Copia y pega en el editor ASM del simulador 8085 para el análisis más detallado de cada ejemplo. Enssamblar.
.ORG 0 MVI C,10; Elinterna compilador transforma el 10 decimal a 0A H de ;forma LOOP:DCR C JNZ LOOP ;Si no se cumple la condición de cero salta a LOOP HLT ;Ensamblado correctamente ©EIEE
;--------------------------------------------------------------;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
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 LXI L,10 B,1000H LXI D,100AH XX: LDAX B STAX D INX B INX D DCR L JNZ XX HLT
;COUNTER ;POSICIONAMIENTO ;POSICIONAMIENTO
;Ensamblado correctamente ©EIEE
A partir de la posición 1004:1H,2H,3H,4H,5H,6H,7H,8H,9H,AH
4 .data 2000H dB 1h,0h,1h,1h, 1h,0h,1h,0h,1h,0h .ORG 0 LXI H,2000H MVI C,0 MVI B,10
;Me ubico en la posición de memoria ;Inicializo contador ;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
B=0, C=06H, Es decir existen ’s en la tabla.
00
36 10
37 10
0E 00
38 10
39 10
;De la tabla SET OP CODE (Ver arriba) MVI LDA MOV LDA ADD
A,00H 3610H B,A 3710H 80H
; ; ; ; ;
0E 00 3A3610 47 3A37 10 80
JNC INR STA MOV STA HLT
0E00H C 3810H A,C 3910H
; ; ; ; ;
D2 0E 00 0C 323810 79 323910 ; 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 ; ingresamos 0111 1111 al acumulador (7FH)
MVI A,7FH MVI B, 8 XX : RLC DCR B JNZ XX
; ; ; ;
Definimos el tamaño del dato en 2 bytes ( 8 bits) Se empieza rotando el Acumulador disminuye el numero de rotaciones 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 MVI C,0 MVI B,8 MVI A,7FH LOOP:RLC MOV D,A ANI 01H
JZ XX INR C XX:
;INGRESO DE DATOS ; inicializamos el counter en cero ; Contador de tamaño de bits del dato (en exadecimal 08H) ; Almacenamos el dato en registro A ;Genera un movimiento bit a bit hacia la izquierda ;Movemos el contenido del acumulador a D para no destruirlo ;ANI destruye el contenido de A y reescribe en un nuevo Acc ;; Si no es cero saltamos a la dirección xx El counter de 1’s se incrementa
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
XX: RLC ;
;Counter de 1’s en la dirección HL***
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
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. Hay dos operaciones fundamentales que realiza un procesador: en la cual el procesador busca el código de operació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. 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. 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: , etc. 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 Testado 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 . IO Read……………………… T 5. IO Write…………………….. T . Interrupt Acknowledge… 6 / 12 T 7. Bus Idle………………………. T
N es un valor arbitrario que se usaremos para calcular la cantidad de veces que se ejecuta una instrucción, generalmente
. Debido a que existen ciclos dentro de otros ciclos pueden haber dos o mas valores N los que designaremos como NN…Nn. Este término d eberá 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 , 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.
DELAY: :
MVI A,03H DCR A JNZ HLT
7T 4T 7/10T 4T
7T *N 7T 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: = 7T+ 4T +10T
+7T +4T
= 7T+ 4TN +10TN -10T+7T+4T =8T+14TN N=03H
(Decimal)
TT=8T+14*3*T TT=8T+42T
R:
: Se multiplica por N, si se repite 3 veces en las filas | | | |
Se multiplica N-1, si se repite 2 veces en las filas. | | | |
Si solo repite 1 vez, simplemente sumar. Sin multiplicar por nada!. Ej:
c
b
-
c
N
a*N a*(N-1)+b a*N b*(N-1)+a
b
a
c
Inicio
Bucle
Fin c+ a*N+
b+a+c
+ a*N+
+ b+a+c
Como te habrás dado cuenta, al efectuar este tipo de operaciones habra un , luego un salto condicional que lleva a un , que se repite constantemente y solo cuando se cumple una condición se continua hasta el . | | | |
Corresponde a los tiempos del primer recorrido de la instrucción. Es el ciclo que se repite constantemente sin variar y en forma recursiva. 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. DELAY: REP1: REP2:
FIN:
MVI B,02H MVI C,02H DCR C JNZ REP2 DCR B JZ FIN JNZ REP1 HLT
7T 7T 4T 7/10T 4T 7/10T 7/10T 4T
MVI B,02H MVI C,02H DCR C JNZ DCR B JZ FIN JNZ HLT --------------------------------------------------------------------------------------------------
MVI B,02H
7T
DCR B JZ FIN JNZ REP1 HLT
4T 7/10T 7/10T 4T
7T X
X
X
*N1
4T
4T
4T
*N1
10T
B=2
B=1
4T B=0
= 7T+XN1+4TN1+
+ 10T+
+4T
MVI C,02H
DCR C JNZ
7T 4T
4T
4T
*N2
7T C=2
C=1
C=0
7T+4TN2 7T+4TN2
+7T
+7T
7T+ N1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T
Reemplazando X:
N1+21TN1+4T )N1+21TN1+4T N1
N1+21TN1+4T
=14TN2N1+25TN1+4T =02H=
=02H=
14T*(2)*(2)+25T*(2)+4T
Mhz
.
2.-Calcular la duración del programa, para un procesador 8085, que usa un cristal de 6 Mhz. DELAY: REP1: REP2:
FIN:
MVI B, MVI C, DCR C JNZ REP2 DCR B JZ FIN JNZ REP1 HLT
7T 7T 4T 7/10T 4T 7/10T 7/10T 4T
MVI B,0AH MVI C,47H DCR C JNZ REP2 DCR B JZ FIN JNZ HLT MVI B,0AH
7T
DCR B JZ FIN JNZ REP1 HLT
4T 7/10T 7/10T 4T
7T X
X
X
*N1
4T
4T
4T
*N1
10T 4T Inicio = 7T+XN1+4TN1+
Bucle
Fin
+ 10T+
+4T
MVI C,47H
DCR C JNZ
7T 4T
4T
4T
*N2
7T Inicio
Bucle
Fin
7T+4TN2
+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.
=14TN2N1+25TN1+4T 7
7
=0AH= 10 =14T*71*10+25T*10+4T TT=10940T
TT 9 s
=47H=71
(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. DELAY: REP1: REP2:
FIN: :
MVI B, MVI C, DCR C JNZ REP2 DCR B JZ FIN JNZ REP1 HLT deberán ser convertidos a
7T 7T 4T 7/10T 4T 7/10T 7/10T 4T 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 se refiere al tiempo que ocupa para ejecutar un salto o para ejecutar la siguiente instrucción
Se simplifica el diagrama para recorrer las instrucciones con mayor simplicidad
= 7T+XN1+4TN1+
7T+4TN2
+ 10T+
+4T
+7T
TT=7T+ N1+4TN1+(N1-1)10T+7T+4T =7T+
4T
10T+7T+4T
3.-Se tiene un cristal de 6,1414Mhz determinar el tiempo de ejecución del programa. DELAY:
MVI B,
4T
DEI:
LXI H,1000 DCX H
10T 4T
MOV A,B
4T
ORA H JZ
4T 7/10T
JNZ
7/10T
HLT
4T
FIN:
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
.77
N=1000
TT=(1000*29-1 5s =9421,425s TT=0,00942
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
no puede trabajar con todos los periféricos en forma simultánea. Para por ello el dispositivo lógico discrimina mediante un cortocircuito de alta impedancia. C 0 0 1
A 0 1 X
X 1 0
Fig.-Tabla lógica del TRISTATE Por medio del seleccionamos alguna de las 256 puertas de entrada, si deseamos leer o las 256 puertas de salida si deseamos escribir. El se encargara de señalar la operación, RD, WR, o si trabajará en la memoria principal I0/M.
Se muestra una lectura en el 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 activando una y crear un cortocircuito. El valor que toma X, no tiene importancia porque su operación esta anulada. El CPU solo lee al ,
Acc (port 20) (port 4F)
,
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 y .
Aquí se ha añadido la dirección de control AAA…A7 en la puerta logica
A7 A6 A5 A4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
A3 0 0 0 1 0 0 0 0
A2 0 0 1 0 0 0 0 0
A1 0 1 0 0 0 0 0 0
A0 1 0 0 0 0 0 0 0
0 0 0 0 1 2 4 8
IN 1 2 4 8 0 0 0 0
A7 A6 A5 A4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1
A3 1 1 1 0 1 1 1
A2 1 1 0 1 1 1 1
A1 1 0 1 1 1 1 1
A0 0 1 1 1 1 1 1
IN F E F D F B F 7 E F D F B F
0
1
1
1
1
7 F
1
1
1
Este ejemplo muestra que valores tendrá de salida el selector 74138, donde los valores A2,A1,A0 se irán incrementándo y generará una señalal en la puerta de salida correspondiente valor binario de dicho incremento. Asi se tiene A2A1A0=000, generá una señal en I0=0. A2A1A0=011
Seleccionador A2
A1
A0
0
0
0
1
1
1
1
1
1
1
0
0
0
1
1
1
1
1
1
1
0
1
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
Se tiene un selector cuyo valor de A2A1A0=000, genera señal en I0=0 . xx=00.
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
Encontrar el correspondiente direccionamiento si se desea una señal de lectura en la puerta I0. 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 II…I7 en 1, de esta forma realizamos un corto circuito por alta impedancia en las otras puertas.
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
1
1
1
1
1
1
1
0
Nota: 1
1
1
1
1
0
0
0
F8H
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.
1
1
0
1
1
1
1
1
0
0
1
0
1
1
0
1
2DH
Dado la siguiente dirección diseñar e implementar un circuito lógico.
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 x
1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
28H 29H 2ª 2B 2C 2D 2E 2F
Por medio de los direccionamientos podemos deducir el siguiente esquema:
Un interfaz es un dispositivo electrónico que permite conectar, los periféricos con la CPU.
Transferencia simultáneas de 8 bits
: Transferencia bit a bit
00= Timer no opera 01= Stop timer 10= Stop timer despues de completar 1 cuesta
Proceso diálogo Proceso diálogo
Para programar las puertas de entrada y salidas del , debemos saber 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
De momento vamos a considerar esta puerta Don’t Care.
Esta puerta controla el tiempo y dependiendo del requerimiento se va configurar los valores de cada estado lógico esta en recuadro de arriba.
El interfaz posee un TIMER de , que puede producir ondas cuadradas continuas, pulsos continuo, una onda cuadrada y un pulso.
TH 4 0 1 0 0 1 0 Modo 00= una onda cuadrada 01= onda cuadradas continuas 10= un pulso 11= pulsos continuo.
TL 9
C 0
1
0 0 14 bits
4 0
0
0
0
0
0
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 del selector 74138.
0
1
0
1
1
0
0
0
58H
0
1
0
1
1
0
0
1
59H
CS (Control status) 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
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
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.
Se tiene un set de 7 leds conectados a una señal de entrada. Si el estado lógico de es FOH, el esquema es el siguiente:
D7
D6
D5
D4
D3
D2
D1
D0
1
1
1
1
0
0
0
0
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
Tabla GENERAL Cátodo común
Display
Valor hexadecimal
Xgfe dcba
Display
Valor hexadecimal
Xcde gbaf
0 1
3FH 06H
0011 1111 0000 0110
0 1
77H 44H
0111 0111 0100 0100
2
5BH
0101 1011
2
3EH
0011 1100
3
6EH
0110 1110
3
6EH
0110 1110
4
66H
0110 0110
5
6DH
0110 1101
4 5
4DH 6BH
0100 1101 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
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 X
X
PC X
X
0
0
PB
PA
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)
0
1
0
1
1
0
0
0
58H
0
1
0
1
1
0
0
1
59H
C/S (Control Status) 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 los direccionamientos del XX :IN 5BH lo envía al ANI JNZ MVI OUT A, el valor JMP
;C/S Control Status
designado por
; 8155 y el 74138 ;Lee en la puerta C el contenido y Acc (ver tabla arriba) 01H ; Aisla el bit menos significativo XX A,00H 59H ; Escribe el contenido de la puerta contenido en el Acc INICIO
MVI A,FF OUT 5A B, el valor del Acc=FF
;Escribe el contenido de la puerta
posee un TIMER de posee un selector de tipo de onda.
, que puede programar. Ademas
TH
TL
4 0 1 Modo
9 0
0
1
0
C 0
1
1 1 14 bits
4 0
0
Modo :
0
1
0
0
:2
0
0
Solo una onda cuadrada
0
1
Ondas cuadradas continuas
1
0
Un solo pulso
1
1
Pulsos continuos
Se tiene una onda de pulso continua y una frecuencia de entrada y de salida : 5
5 9
5 5
(5 5
El valor
se envía al Timer programable. TIMER TH
TL
4 0 1 Modo
9 0
0
1
0
C 0
MVI A, C4H ; Asigna el valor 49C4H a TH/TL OUT MVI A, 49H OUT
1
1 1 14 bits
4 0
0
0
1
0
0
;---------------------------------------------------------------------; 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 OUTC/S ; ;
Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits] 74138
8155
A7 0
A6 1
A5 0
A4 1
A3 1
A2 0
A1 0
0
A0
Direcc. 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
Vamos a copiar el siguiente programa en el editor ASM, compilar y seleccionar el display de 7 segmentos y ejecutamos el programa ejecutamos en ;------------------------------------------------------------------------; 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 .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 DCR C YY: JNZ YY YYY: DCR B JNZ DELAY2
RET ;Ensamblado correctamente ©PTRRZA
;Definimos los números de 0-9
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 , PB1 a segmento 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.
Se cuenta con el
, selector
, el interfaz
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
. 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 programar.
Es importante para
Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits] 74138
8155
A7 1
A6 0
A5 1
A4 1
A3 0
A2 0
A1 0
A0 0
Direcc. B0H
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
C/S
(Control Status)
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
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
0
0
0
0
1
1
1
0
0
1
PB
PA
1
0
1
0DH
1
0
1
CDH
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
7 5
MVI A,66H
76
1 6
38
0
19
0
9
1
4
1 6
2
0
1
0
0
1 x 2
OUT
x
MVI A,42H OUT ;____________________________________________
TIMER TH
TL
4 0 1 Modo
2 0
0
0
0
6 1
0
0 1 14 bits
6 1
0
0
1
1
0
Cuando se sobrepasa la capacidad de 14 bits es necesario otro
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
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 código ANSII.(5=35H).
Teclado ANSII Teclado ANSII 0
30H
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
;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 XX C JNZ RET ;____FIN PROGRAMA_____________ ;Ensamblado correctamente ©EIEE
El simulador 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 a,b ;inicializo in 00h ;ingreso por teclado un numero inicio:mov 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 LXI MVI OUT
SP, 3000H ;Inicializamos el STACK H,1000H ;Nos posicionamos en la dirección A,0AH TECLADO
HLT ; error
declaramos
el srcen antes de define!!!
.Data 1000h db 10h, f9h .define TECLADO 01H .org 0 ;declaramos el srcen 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
La memoria de pila se puede describir como un queprograma. se utilizanLa para almacenar binaria temporalmente la ejecución de un memoria de información pila es utilizada tanto por P comodurante 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 srcinal comprobando la dirección presente en la pila. Del mismo modo, 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.
. Esta instrucción cargaRAM el registro del utilizar punterocomo de pila la dirección deque memoria de 16 bits. Cualquier área de la memoria se puede pilacon pero para evitar 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 memoria de la pila se basa en el principio del La entrada de datos en la pila se denomina operación y la recuperación de datos de la pila se denomina operación . El puntero de pila siempre tiene la dirección de la pila superior.
Carga el registro de apuntador de pila (16 bits) con 3075H. Esta instrucción carga el registro D con 30H y el registro E con 75H. ;De manera similar, si escribimos:
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 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 la instrucción:
Ejecutan los siguientes pasos: a) El puntero de la pila (SP) 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 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 Stack 2058H Registro D 5AH
Registro E 63H
2055
0
2056
0
2057
0
PC->2058
0
Puntero Stack 2056 Registro D 5AH
Registro E 63H
2055
0
PC->2056
63H
2057
5AH
2058
0
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. 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:
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.
Despues de POP
Antes de POP
Puntero Stack 2058 Registro B 5AH
Puntero Stack 2056 Registro X
Registro C X
2055
0
2055
0
PC->2056
63H
2056
63H
2057
5AH
2057
5AH
2058
0
PC-> 2058
Registro C 63H
0
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 . ;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
Cada PUSH viene asociado con un POP, y debe programarse en base a una pila tipo LIFO.
PUSH PSW PUSH H PUSH B . . B POP H POP PSW . .
sobre los
No puedes colocar PUSH C, PUSH L o PUSH E ! ya que estamos trabajando : HL, BC, DE, PSW.
No programar sin un orden LIFO ya que trabajanos en una pila. EJ:
Error
Orden LIFO
PUSH B PUSH H
PUSH B PUSH H
POP B
POP H
POP H
POP B
…
….
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). y debemos tener presente que siempre emplean el stack.
;Programa que llama a una subrutina sin usar el Stack Pointer (SP) ;y sufre perdidas de los valores en los registros srcinales .ORG 0 MVI H,0AH MVI L,10H MVI C,0AH CALL SUBRUTINA XX: DCR C JNZ XX HLT ;Se pierde el valor srcinal 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 CALL SUBRUTINA POP H
;PUSH guarda en el Stack el valor HL=0A10H ;En la subrutina HL=00FF y se pierde el valor srcinal ;POP restaura el valor ORIGINAL HL=0A10H
XX
;Programa principal del contador
:DCR C JNZ XX HLT
SUBRUTINA: MVI H,00H ;valor MVI L,FFH
RET
;retorna al programa principal
;Ensamblado correctamente ©EIEE
Salva los registros en el Stacks.
Una interrupción puede ser definida como cualquier señal al P que . 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 ca mbia 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
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.
Hay cinco interrupciones de hardware en 8085. Son: Tabla dirección de llamadas a INTERRUPTS 1 2 3 4 5
TRAP RST 7.5
0024H 003CH
INTR
Non-vectored interrupt
Las interrupciones también se clasifican como: a) 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)
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)
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)
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.|
̅.
Serial Imput Data
If bit=1 Then the interrupt are pending
Flip-is Flop set
̅.
̅.
If anyone of the three bits (D0,D1 and D2)=1 then it implies that the respective interrupt is masked. More than one interrupts can also be masked
Características del Para poder acceder a las diferentes interrupciones debemos llamar a las instruccione: , (set Interrup Mask) y (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
…
̅ .
̅ .
̅.
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
RST5.5, RST6.5, RST7.5 RST5.5, RST6.5, RST7.5
.
Operation
Enable
Serial Output data
1
Serial data Enable if D6=1 Then serial output is enable
1
Don´t care If
0/1 Additional control to reset
then
and
are
1
D2
0 RST7.5 is
/ RST7.5
0
D1
0 RST6.5 is
/ RST6.5 is
0
D0
RST5.5 is
/
RST5.5 is
0
All the three interrupts are vectored and maskable interrupts. In order to enable these interrupts the P requires two instructions: a) b)
(Enable Interrupt) (Set Interrupt Mask)
Besides these three interrupts are sensitive to different types of triggering as explained below: 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. 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 Dflip-flop. 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 lxi sp,FFFFh
del programa principal
mvi a,0Bh; Enmascaramos sin resetear RST F/F /M75 = 0000 1011 ;Para explicar en términos visuales esta interrupción sim
x1:
ei ;De momento habilitaremos las interrupciones mvi a,F0H ;Corresponde al contenido del programa principal 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. Se debe tener cuidado con las direcciones de retorno y salto . Sería nefasto perderse en el programa y por ende debemos tener cuidado de usar las instrucción . Como se trabaja con datos dentro de una pila, muchas veces es necesario almacenarlos en el STACK, y por ello se usa las instrucciones
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
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