Professional Documents
Culture Documents
ED 15
AUTOR:
PAUL TERRAZAS L.
ARICA-CHILE
2016
INTRODUCCION
He querido dejar los últimos programas planteados para que uds, puedan
modificarlos, he transcrito guías de anteriores semestres y material que me han
entregado algunos compañeros, mi objetivo en ningún caso es reemplazar las
clases del Profesor y por ende deben asistir a todas las clases porque allí se
tratarán temas puntuales y materias para las evaluaciones.
He creado un libro, llamado apuntes del microprocesador el que uso como base para
esta nueva edición.
I ARQUITECTURA DEL MICROPROCESADOR
1.-El computador
4.-Tri-state
5.- Bit
1. EL COMPUTADOR
1.1.-IN: Esta unidad permite leer (READ) información por unidades de entrada,
como teclados, mouse, USB (Modo lectura), lector de disco, micrófono. Etc.
1.3.-Memoria Principal: La CPU tiene una memoria principal que contiene, los
programas, datos, Stacks (Pila). Antes de ejecutar cualquier instrucción deberá
ser almacenada en la memoria principal. = 65536 direcciones.
-Bus de datos
-Bus de direcciones
-Bus de control
2.-Arquitectura Von Newmann
2.1.2.-Banco de registros
Proporciona un espacio de almacenamiento para los datos con los que trabaja la
CPU. Los registros se deben cargar con información que proviene de la memoria
principal antes de comenzar a operar, cuando se necesita dejar espacio libre en el
banco de registros para operar con nuevos datos su valor debe escribirse en la
memoria principal.
Operar con datos en el banco de registros es mucho más rápido que operar con
datos que se encuentran en la memoria principal, por eso, cuanto mayor sea el
banco de registros se requerirán menos trasvases con la memoria principal y la
tarea se realizará antes.
2.1.3-Unidad de control
2.2.2.-Memoria ROM (Read Only Memory): Memoria de acceso aleatorio que sólo
permite la lectura de los datos que almacena. Se trata de un medio de
almacenamiento persistente, pues no pierde su contenido cuando cesa la
alimentación.
Ejemplo:
El bus PCI cuenta con la siguiente especificación:
Ancho del bus: 32 bits
Reloj: 33 Mhz
Fácilmente podemos calcular la cantidad máxima de información que puede
transportar en un segundo. Simplemente necesitamos multiplicar la información
que mueve en cada ciclo (32 bits = 4 Bytes) por el número de ciclos que tienen
lugar en un segundo (33*106).
Si el bus fuese capaz de utilizar tanto el flanco de subida como el de bajada para
transmitir información, se doblaria la capacidad útil.
2.4.1.-Bus de datos:
2.4.2.-Bus de direcciones:
3.2.1-Registros de direccionamiento.
3.3.1.- FLAGS
La denominación y situación de cada flag se muestra en el siguiente esquema.
S Z X AC X P X CY
S: (Signo)
S es el flag de signo. Si el resultado es negativo S=1y si el resultado del flag es
positivo S=0. Considerando que el bit más significativo es el que se toma como bit
de signo.
Ejemplo: Ejemplo:
Z: (Cero)
Ejemplo: Ejemplo:
P: (Paridad )
Ejemplo: Ejemplo:
1 []
CY: (Carry)
(2) Bus de datos: Posee un Bus de datos de 8 bits que intercambian información
entre sus distintos bloques internos y para comunicarse con el exterior.
(3) Bus de control: compuesto por una serie de líneas, variable en número según el
componente de que se trate. Contiene las líneas de sincronización de funciones,
pudiendo ser unas de salida y otras de entrada al microprocesador. Algunas
señales de control pueden ser, las de lectura, escritura, reloj o clock, etc.
WR=0 )
Ejercicios resueltos
C A X
0 0 1
0 1 0
1 X
5.- bit
Un es la unidad mínima de información empleada en informática, en cualquier
dispositivo digital, o en la teoría de la información, es una señal electrónica que
puede estar encendida (1) o apagada (0).
5.1.-Byte
Byte, término creado por Werner Buchholz como una unidad de información
digital equivalente a ocho bits. La palabra byte proviene de bite, que significa
mordisco, como la cantidad más pequeña de datos que un ordenador podía
"morder" a la vez. El símbolo de byte es un B mayúscula, para distinguir de bit,
cuyo símbolo es b minúscula.
Recapitulando
A : Acumulador
F : Flags
B,C,D,E,H,L: Registros generales
PC : Program Counter
SP : Stack Pointer
HL : Apuntador datos de memoria.
2.2.-Set op.code
2.3.-Tamaño de instrucciones
4 CPI 24 XRI 44 CC 64 IN
18 SUB 38 JZ 58 RP
20 SBI 40 JM 60 RPO
Fuente: https://es.scribd.com/document/337573426/SET-de-Instrucciones-Del-8085
Bits afectados: MOV es una instrucción de 1 byte, El contenido del registro R2 es transferido al registro R1.
Direccionamiento: R1 y R2 pueden ser los registros B, C, D, E, H, L o el acumulador A.
Registro indirecto
Supongamos que el registro B contiene 00H y el egistro C contiene 30H
MOV B,C
Acumulador
Entonces MOV A,M mueve el contenido de la posición de memoria indicado por el registro
HL=18AAH al acumulador.
Posición de memoria .
HL= 18 AA H 55H
Resultado: A=55H
MOV M, Reg
Direccionamiento registro indirecto.
El contenido del registro R es transferido a la dirección de memoria indicada por los
registros H-L.
Supongamos que el registro H contiene 00H y el registro L contiene 30H. La instrucción
MOV M, A
..
Posición de memoria
MVI M, dato
Cargar en la posición de memoria contenida por el registro H-L un dato inmediato
MVI M, 2AH
carga en la posición de memoria 3344H (dirección aportada por los registros H y L) el valor
2AH.
Registro 05H 0 0 0 0 0 1 0 1
Comp. 1 C-1: 1 1 1 1 1 0 1 0
Comp. 2 C-2: + 1
Dato comp. FBH 1 1 1 1 1 0 1 1
Acc 0AH: 0 0 0 0 1 0 1 0
Dato comp. FBH: 1 1 1 1 1 0 1 1
+
Nuevo Acc 05H 0 0 0 0 0 1 0 1
Z=0 Cy=0
Z 0 1 0
Cy 0 0 1
4. CPI dato Comparar el contenido del acumulador con un dato Inmediato.
Flags afectados: Z, S, Compara el valor del byte especificado con el contenido del acumulador y posiciona los bits
P, CY, AC de cero y acarreo para indicar el resultado. El bit de cero indica igualdad.
Direccionamiento: Un 0 en el acarreo indica que el contenido del acumulador es mayor que DATOS.
Registro indirecto. Un 1 en el acarreo indica que el acumulador es menor que DATOS. Sin embargo, el
significado del bit de acarreo es contrario cuando los valores tienen diferente signo o cuando
uno de los valores está complementado.
El valor de DATOS no debe exceder de un byte.
Si tenemos la secuencia de instrucciones
(1).MVI A, 25H
(2).CPI 20H
Dato 20H 0 0 1 0 0 0 0 0
Comp. 1 C-1: 1 1 0 1 1 1 1 1
Comp. 2 C-2: + 1
Dato comp. E0H 1 1 1 0 0 0 0 0
Acc 25H: 0 0 1 0 0 1 0 1
Dato comp E0H: + 1 1 1 0 0 0 0 0
Nuevo Acc 05H 0 0 0 0 0 1 0 1
Cy=1
Z 0 1 0
Cy 0 0 1
El primer operando debe especificar el par de registros a ser cargados, pueden ser los pares
BC, DE, HL, o el SP.
LXI B, 00FFH
STAX B
Posición de memoria
STA es una instrucción de bytes; STA DIR almacena una copia del contenido actual del
acumulador en la posición de memoria especificada por DIR.
STA 0080H
Posición de memoria .
.
0080 H 1FH
.
Podemos concluir que tanto STAX como STA almacenan el contenido del acumulador en la
posición de memoria, y lo realizaran por medio de un registro o por medio de una dirección
respectivamente.
Posición de memoria .
.
3F16 H 10H
.
Resultado A=10H
9. LDA DIR Carga directa en el acumulador
LDA DIR carga el acumulador con el contenido de la memoria direccionada por DIR. La
dirección puede ser puesta como un número, una etiqueta previamente definida o una
expresión.
LDA 1000H
Posición de memoria .
.
1000 H 12H
.
Resultado A=12H
Podemos concluir que tanto LDAX como LDA cargan el acumulador con el contenido de la
posición de memoria. Lo realizaran por medio de un registro o por medio una dirección
respectivamente.
DCR A
DCX H
Reg. B 3AH: 0 0 1 1 1 0 1 0
Acc 6CH: + 0 1 1 0 1 1 0 0
Nuevo Acc A6H 1 0 1 0 0 1 1 0
2. La instrucción
ADD A
Registro B 30H 0 0 1 1 0 0 0 0
Acc 76H: 0 1 1 1 0 1 1 0
Bit de acarreo :+ 0
Nuevo Acc A6H 1 0 1 0 0 1 1 0
El nuevo contenido del acumulador será A6H, mientras que todos los bits de condición
quedarán puestos a cero excepto los de signo y paridad. Si el bit de acarreo hubiera sido 1
(Cy=1) antes de realizar la operación, hubiera tenido lugar la siguiente suma
Registro B 30H 0 0 1 1 0 0 0 0
Acc 76H: 0 1 1 1 0 1 1 0
Bit de acarreo :+ 1
Nuevo Acc A7H 1 0 1 0 0 1 1 1
El acumulador contiene A7H y todos los bits de condición excepto el de signo, estaría puesto a
cero.
Ejemplo
A continuación presentamos un ejemplo con 3 instrucciones:
(1).MVI A, 34
(2).ADI 20
(3).ADI -20
En todas las instrucciones se utilizan datos en base decimal. Así, por ejemplo, en la
instrucción (2) el valor 20 es 14H.
La instrucción (1) carga en el acumulador el valor 22H.La instrucción (2) realiza la siguiente
suma
Acc 22H: 0 0 1 0 0 0 1 0
Dat. Inmediat. 14H: + 0 0 0 1 0 1 0 0
Nuevo Acc 36H 0 0 1 1 0 1 1 0
El bit de paridad se pone a uno y el resto se quedan a cero. La instrucción (3) restaura el valor
del acumulador realizando la siguiente suma:
Acc 36H: 0 0 1 1 0 1 1 0
Dat. Inmediat. ECH: + 1 1 1 0 1 1 0 0
Ahora los bits de paridad, acarreo y acarreo auxiliar se quedan a uno y el resto a cero.
SUB E
realizará la siguiente operación de resta: (Registro B)+(-28H)
Registro 28H 0 0 1 0 1 0 0 0
Comp. 1 C-1: 1 1 0 1 0 1 1 1
Comp. 2 C-2: + 1
Dato comp. D8H 1 1 0 1 1 0 0 0
Acumulador 60H: 0 1 1 0 0 0 0 0
Dato comp. D8H: 1 1 0 1 1 0 0 0
+
Nuevo Acc 38H 0 0 1 1 1 0 0 0
A=38H
Registro B3H 1 0 1 1 0 0 1 1
Comp. 1 C-1: 0 1 0 0 1 1 0 0
Comp. 2 C-2: + 1
4DH 0 1 0 0 1 1 0 1
Dato comp.
Acumulador B3H: 1 0 1 1 0 0 1 1
Como era de esperar el resultado final del acumulador es cero ya que le estamos restando su
propio valor. El valor 6DH del dato inmediato corresponde al complemento a dos del valor B3H
que estamos restando.
Debido a que existe desbordamiento del séptimo bit se produce acarreo y se pone el bit de
acarreo a cero. El bit de paridad se pone a uno mientras que los demás permanecen inactivos.
20. SBI
Restar del acumulador un dato Inmediato con arrastre
Acumulador 00H 0 0 0 0 0 0 0 0
Dato inmed. FFH: 1 1 1 1 1 1 1 1
Bit acarreo :+ 0
Nuevo Acc. FFH 1 1 1 1 1 1 1 1
Cy=1
Z=0
Ca=0
No hay acarreo, por lo que el bit de acarreo se pone a uno. Los bits de cero y acarreo auxiliar
están a cero, mientras que los de signo y paridad se ponen a uno.
A B F
0 0 0
0 1 0
1 0 0
1 1 1
Acumulador 3AH: 0 0 1 1 1 0 1 0
Dato comp. 6CH: 0 1 1 0 1 1 0 0
Nuevo Acc 28H 0 0 1 0 1 0 0 0
A=28H
(1).MVI A, A0H
(2).ANI 0FH
Acumulador A0H: 1 0 1 0 0 0 0 0
Dato inmediato 0FH: 0 0 0 0 1 1 1 1
Nuevo Acc 00H 0 0 0 0 0 0 0 0
La instrucción ANI del ejemplo pone a cero los cuatro bits de mayor peso, dejando invariables
los cuatro menores. Ya que los cuatro bits de menor peso del acumulador eran cero, el
resultado final es 00H con lo que el bit de cero se pondrá a cero.
A B F
0 0 0
0 1 1
1 0 1
1 1 0
Acumulador 3AH: 0 0 1 1 1 0 1 0
Registro B 6CH: 0 1 1 0 1 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
XRA B
produce el complemento a uno del contenido del registro B, y lo guarda en el acumulador.
En algunas ocasiones, un byte se utiliza para reflejar los estados de ciertas condiciones dentro
de un programa, donde cada uno de los ocho bits puede responder a una determinada
condición de falso o verdadero, actuado o inhibido, etc.
Mediante la función O-EXCLUSIVO podemos determinar cuántos bits de la palabra han
cambiado de estado en un determinado lapsus de tiempo.
24. XRI Dato Bits 1.-Instrucción Función lógica O-EXCLUSIVO entre el acumulador y un dato Inmediato
afectados: Z, S, P, CY,
AC Se realiza la función lógica O-EXCLUSIVO bit a bit entre un byte de datos inmediatos y el
contenido del acumulador. El resultado se guarda en el acumulador. El bit de acarreo se pone a
cero.
Ejemplo
Esta instrucción se suele utilizar para complementar bits específicos del acumulador dejando
los restantes en su estado original. De este modo y suponiendo que el acumulador contiene
ABH, la instrucción
XRI 80H
complementa el bit de más peso del acumulador, tal y como se muestra en la siguiente figura:
Acumulador ABH: 1 0 1 0 1 0 1 1
Dato 80H: 1 0 0 0 0 0 0 0
inmediato
Nuevo Acc 2BH 0 0 1 0 1 0 1 1
25. ORA Reg Función lógica OR entre registro o memoria con acumulador
Bits afectados: Se realiza la función lógica AND bit a bit entre el contenido del registro o posición de
Z, S, P, CY, AC memoria especificados y el contenido del acumulador, quedando en este último el resultado. El
bit de acarreo se pone a cero. La tabla de verdad de la función lógica OR es:
Direccionamiento: A B F
Registro indirecto 0 0 0
0 1 1
1 0 1
1 1 1
Como sea que la función OR de cualquier bit con un uno da como resultado uno, y de cualquier
bit con cero, lo deja invariable, esta función se utiliza frecuentemente para poner a uno grupos
de bits.
Si el registro B contiene OFH y el acumulador almacena 33H, la instrucción
ORA B
realiza la siguiente operación:
Acumulador 33H: 0 0 1 1 0 0 1 1
Dato inmediato 0FH: 0 0 0 0 1 1 1 1
Nuevo Acc 3FH 0 0 1 1 1 1 1 1
Este ejemplo concreto garantiza que los cuatro bits de menos peso del acumulador son unos,
mientras que los demás permanecen invariables.
26. ORI dato Bits Función lógica OR entre el acumulador y un dato Inmediato.
afectados: Z, S, P, CY, ORI desarrolla una operación lógica OR entre el contenido especificado por DATOS y el
AC contenido del acumulador. El resultado se deja en el acumulador. Los bits de acarreo y acarreo
auxiliar se ponen a cero.
Ejemplo
Si el acumulador inicialmente contiene 3CH, la instrucción
ORI F0H
Acumulador 3CH: 0 0 1 1 1 1 0 0
Dato inmediato F0H: 1 1 1 1 0 0 0 0
Nuevo Acc FCH 1 1 1 1 1 1 0 0
Como vemos la instrucción ORI de nuestro ejemplo activa los cuatro bits de menor peso,
dejando invariables los restantes.
(2).Si los cuatro bits más significativos del acumulador representan ahora un número mayor
que 9, o si el bit de acarreo es uno, los cuatro bits más significativos se incrementan en seis
unidades. Asimismo, si no tienen lugar las
circunstancias expuestas, el contenido del acumulador no se incrementa. Si hay acarreo de los
cuatro bits menos significativos durante el paso (1), el bit de acarreo auxiliar se pone a 1; si no
lo hay, se pone a 0. Por otra parte, si hay acarreo de los cuatro bits más significativos durante el
paso (2), se activará el bit de acarreo, poniéndose a cero si no se produce acarreo.
Esta instrucción se utiliza en las operaciones de suma de números decimales. Es la única
instrucción cuya operación depende del bit de acarreo auxiliar.
Supongamos que queremos realizar una suma decimal de dos números (40 + 80).
Ambos bits de acarreo están a cero.
; Bit de acarreo = 1
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.
31. RLC
Bits afectados: CY
Desplazar el acumulador a la izquierda Rotate Left Carry
RLC rota un bit hacia la izquierda todo el contenido del acumulador, transfiriendo el bit de
más alto orden al bit de acarreo y al mismo tiempo a la posición de menor orden del
acumulador.
Ejemplo
32 RRC
Bits afectados: CY Desplazar el acumulador a la derecha Rotate Rigth Carry
RRC rota el contenido del acumulador un bit a la derecha, transfiriendo el bit de más bajo
orden a la posición de más alto orden del acumulador, además pone el bit de acarreo igual al bit
de menor orden del acumulador.
33. RAL
Bits afectados: CY (Rotate Arraund Left)
Desplazar el acumulador hacia la izquierda a través del bit de acarreo
RAL hace girar el contenido del acumulador y el bit de acarreo un espacio de un bit hacia la
salida (izquierda). El bit de acarreo que es tratado como si fuera del acumulador, se transfiere
el bit de menor orden del acumulador. El bit de mayor orden del acumulador se transfiere al bit
de acarreo. No tiene operandos.
Supongamos que el acumulador contiene B5H. La instrucción RAL efectuará las siguientes
modificaciones en el registro acumulador y en el bit de acarreo:
34. RAR
Rotate Arround the Rigth
RAR rota el contenido del acumulador y del bit de acarreo 1 bit de posición a la derecha. El bit
de acarreo que es tratado como si fuera parte del acumulador se transfiere al bit de más alto
orden del acumulador. El bit de menor peso del acumulador se carga en el bit de acarreo. No
existen operandos en la instrucción RAR
Ejemplo
En este caso el acumulador contendrá el valor 6AH. La instrucción RAL efectuará las siguientes
modificaciones en el registro acumulador y en el bit de acarreo:
36. JC dir La instrucción JC DIR comprueba el valor del bit de acarreo. Si es un 1 la ejecución del
programa continúa en la dirección especificada por DIR. Si es un 0 el programa continúa su
ejecución normal de forma secuencial.
38. JZ dir
Saltar si hay cero
La instrucción JZ DIR comprueba el bit de cero. Si está a 1 el programa continúa en la
dirección expresada por DIR. Si está a 0 continúa con la ejecución secuencial normal.
40. JM dir
Saltar si hay signo negativo
La instrucción JM DIR comprueba el estado del bit de signo. Si el contenido del acumulador es
negativo (bit de signo = 1) la ejecución del programa continúa en la dirección especificada por
DIR. Si el contenido del acumulador es positivo (bit de signo = 0) continúa la ejecución de la
secuencia normal.
41. JP dir
Salta si hay signo positivo
La instrucción JP DIR comprueba el estado de bit del signo. Si el contenido del acumulador es
positivo (bit de signo = 0) la ejecución del programa continúa con la dirección especificada por
DIR. Si el contenido del acumulador es negativo (bit de
signo = 1) continúa el programa con su ejecución normal.
CALL guarda el contenido del contador de programa (la dirección de la próxima instrucción
secuencial) dentro del stack y a continuación salta a la dirección especificada por DIR.
Cada instrucción CALL o alguna de sus variantes implica una instrucción RET (retorno), de lo
contrario el programa podría "perderse" con consecuencias impredecibles. La dirección debe
ser especificada como un número, una etiqueta, o una
expresión. La etiqueta es lo más normal (El ensamblador invierte los bytes alto y bajo de
dirección durante el proceso de ensamblado). Las instrucciones CALL se emplean para
llamadas a subrutinas y debemos tener presente que siempre emplean el stack.
45 CNC dir
Llamar si no hay acarreo.
CNC chequea el valor del bit de acarreo. Si está en cero CNC carga el contenido de contador de
programa en el stack y a continuación salta a la dirección especificada por la instrucción en
DIR. Si el bit está a 1, el programa continúa con su secuencia normal.
Aunque el uso de una etiqueta es lo más común, la dirección puede también estar indicada por
un número o por una expresión.
46 CZ dir
Llamar si hay cero
CZ chequea el bit de cero. Si el bit esta a 1 (indicando que el contenido del acumulador es cero),
CZ carga el contenido del contador de programa en el stack y salta a la dirección especificada
en DIR. Si el bit está a 0 (indicando que el contenido del
acumulador es distinto de cero) el programa continúa su desarrollo normal.
47 CNZ dir
Llamar si no hay cero
CNZ chequea el bit de Cero. Si está en 0 (indicando que el contenido del acumulador no
es cero), CNZ manda el contenido del contador de programa al stack y salta a la
dirección especificada por DIR. Si el bit está a 1 el programa continúa su desarrollo
normal.
48 CM dir
Llamar si hay signo negativo
CM comprueba el estado del bit del signo. Si el bit esta a 1 (indicando que el contenido del
acumulador es negativo) CM manda el contenido del contador de programa al stack y salta a la
dirección especificada por DIR. Si el bit es 0 la ejecución del programa continúa con su
secuencia normal. El uso de la etiqueta es lo más corriente, pero la dirección puede
especificarse también por un número o una expresión.
49 CP dir
Llamar si hay signo positivo
CP chequea el valor del bit de signo. Si está a 0 (indicando que el contenido del
acumulador es positivo), CP envía el contenido del contador de programa al stack y
salta a la dirección especificada por DIR. Si el bit tiene un 1, continúa el programa
normalmente con la instrucción siguiente.
50 CPE dir
Llamar si la paridad es par.
Existe paridad en un byte si el número de unos que tiene es par. El bit de paridad se
pone a 1 para indicar esta condición. CPE chequea el valor del bit de paridad. Si tiene
un 1, CPE envía el contenido del contador de programa al stack y salta a la dirección
especificada por la instrucción en DIR. Si el bit tiene un cero, el programa continúa
normalmente.
51 CPO dir
Llamar si la paridad es impar
CPO chequea el bit de paridad. Si el bit esta a 0, CPO carga el contenido del contador
de programa en el stack y salta a la dirección especificada en DIR. Si el bit está a 1 el
programa continúa su desarrollo normal.
52 RET
Retorno incodicional
Se realiza una operación de retorno incondicional.
La instrucción RET echa fuera dos bytes de datos del stack y los mete en el
registro contador de programa. El programa continúa entonces en la nueva dirección.
Normalmente RET se emplea conjuntamente con CALL.
61 RST
Es una instrucción CALL para usar con interrupciones. RST carga el contenido del
contador de programa en el stack, para proveerse de una dirección de retorno y salta
a una de las "ocho" direcciones determinadas previamente.
Un código de tres bits incluido en el código de operación de la instrucción RST
especifica la dirección de salto. Esta instrucción es empleada por los periféricos
cuando
intentan una interrupción.
Para volver a la instrucción en que ha tenido lugar la interrupción, se debe
utilizar una instrucción de RETORNO.
62 EI Activar interrupciones
La instrucción EI pone en servicio el sistema de interrupciones a partir de la siguiente
instrucción secuencial del programa. Esta instrucción activa el flip-flop INTE.
Se puede desconectar el sistema de interrupciones poniendo una instrucción DI
al principio de una secuencia, puesto que no se puede predecir la llegada de una
interrupción.
Al final de la secuencia se incluye la instrucción EI que vuelve a habilitar el
sistema de interrupciones. (RESET también pone fuera de servicio el sistema de
interrupciones además de poner el contador de programa a cero).
63 DI
Desactivar interrupciones
Esta instrucción desactiva el flip-flop INTE. Después de la ejecución de una
instrucción DI, el sistema de "interrupciones" esta sin posibilidad de ponerse en
marcha. En aplicaciones que empleen las interrupciones, la instrucción DI se emplea
solamente cuando una determinada secuencia no debe ser interrumpida. Por
ejemplo, se puede poner fuera de servicio el sistema de interrupciones incluyendo
una instrucción DI el principio del código de secuencia.
La interrupción TRAP del 8085 no puede ser puesta fuera de servicio. Esta
interrupción especial esta prevista para serios problemas que pueden presentarse
independientemente del bit de interrupción (fallo de alimentación, etc.).
64 IN port Entrada
La instrucción IN PORT lee los 8 bits de datos que hay en el "PORT" especificado y los
carga en el acumulador. El operando debe ser un número o una expresión que
produzca
un valor comprendido entre 00H y FFH.
1. La instrucción
IN 2
deposita en el acumulador los datos de entrada del puerto 2.
65 OUT port Salida
OUT PORT pone el contenido del acumulador en el bus de datos de 8 bits del puerto
seleccionado. El número de puertos oscila de 0 a 255 y es duplicado en el bus de
direcciones. Es la lógica externa la encargada de seleccionar el puerto y aceptar el
dato
de salida. El operando (PORT) debe especificar el número del puerto de salida
seleccionado.
1. La instrucción OUT 2 envía el contenido del acumulador al puerto de salida número
2.
66 HLT
La instrucción HLT detiene el procesador.
El contador de programa contiene la dirección de la próxima instrucción secuencial.
Por otro lado los bits y registros permanecen inactivos. Una vez en estado de parada
el procesador puede volver a ser arrancado solamente por un acontecimiento
externo, es decir una interrupción. Por tanto debemos asegurarnos que las
interrupciones estén en disposición de ser activadas antes de ejecutar la instrucción
HLT.
Si se ejecuta HLT estando las interrupciones fuera de servicio, la única manera de
volver arrancar el procesador será mediante un RESET o a través de la interrupción
TRAP.
El procesador puede salir temporalmente del estado de parada para servir un acceso
directo a memoria, sin embargo terminado el acceso directo vuelve al estado de
parada.
Un propósito básico de la instrucción HLT es permitir una pausa al procesador
mientras espera por la interrupción de un periférico.
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.
Antes de PUSH
Despues de PUSH
Puntero Puntero
Stack Stack
2030 2030
Registro B Registro C Registro B Registro C
3F 16 3F 16
00 2028 16 2028
00 2029 3f 2029
00 2030 00 2030
2. Supongamos ahora que el acumulador contiene 33H, el puntero de pila tiene 102AH, y los bits de
condición de cero, acarreo y paridad están a uno, mientras que los de signo y acarreo auxiliar están a cero.
La instrucción
PUSH PSW
Almacena el contenido del acumulador en la posición de memoria 1028H, y coloca el valor 47H,
correspondiente a los citados estados de los bits de condición, en la posición 1029H, mientras que en el
puntero de pila queda el valor 1028H.
68 POP pr Sacar datos del stack
Supongamos que las posiciones de memoria 2028H y 2029H contienen respectivamente 16H y 3FH,
mientras que el puntero de pila contiene 2028H. La instrucción
POP B
Carga el registro C con el valor de 16H de la posición de memoria 2028H, carga el registro B con el valor
3FH de la posición 2029H, e incrementa dos unidades el puntero de stack, dejándolo en 2030H.
Gráficamente podemos ver este proceso:
16 2028 16 2028
3F 2029 3f 2029
00 2030 00 2030
POP PSW
carga 00H en el acumulador y pone los bits de estado de la siguiente forma:
S Z X Ca X P X Cy
0 0 0 1 1 1 1 0
=16H
69 DAD pr Suma doble
DAD RP suma el valor de un dato de 16 bits contenido en un determinado par de registros (PR) al
contenido del par de registros HL. El resultado es almacenado en el par HL. Los operandos (PR) pueden ser
B = BC, D = DE, H = HL, SP. Téngase en cuenta que la letra H debe ser empleada para especificar que el par
de registros HL debe ser doblado. DAD pone el bit de acarreo a 1 si hay una salida de acarreo de los
registros HL. Y además no afecta a ningún otro bit.
1. Supuesto que los registros D, E, H y L contienen 33H, 9FH, A1H y 7BH
respectivamente, la instrucción
Realiza la siguiente suma:
B–C: 339FH
H–L: + A17BH
__________________________
H–L 051AH
70 XCHG
Intercambiar datos entre registros
XCHG cambia el contenido de los registros H y L con el contenido de los registros D y E.
Si los registros H, L, D y E contienen respectivamente 01H, 02H, 03H y 04H, la instrucción XCHG realiza el
siguiente intercambio:
Antes de ejecutar XCHG
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
CC 40B4 CC 40B4
DD 40B5 DD 40B5
00 40B6 00 40B6
Almacena una copia del registro L en la posición de memoria especificada por DIR, a
continuación almacena una copia del registro H en la siguiente posición de memoria (DIR+1).
Suponiendo que los registros H y L contienen respectivamente los valores 3CH y 54H, la
instrucción
SHLD 34B3
efectuará las siguientes modificaciones en memoria:
FF 34B3 54 34B3
FF 34B4 3C 34B4
FF 34B5 54 34B5
74
LSHD
75
SBB
76
DAD
77
ORG 0 ; Posicion de programa en la DIRECTIVA
ORG 0 .data DIR ; Direccion donde empiezo a colocar mis datos, Ej: 2000H
.DATA
dB ; Directiva asociada a adatos
DB
DW
dW ; Directiva asociada a datos exadecimales.
Ejemplo:
dB 1,2,5 ;Coloca los datos 1,2,5 en forma secuencial en la tabla.
dW 1,3,4,4,1234H ;Coloca datos en la tabla pero ocupa 2 bytes
.
2.2.-TABLA SET OP.CODE
2.3.-Tamaño de instrucciones [Bytes ]
Ejercicio de ensamble.
Posición de memoria .
.
.
55 dato
34 Dato
12 dato
Ejercicio de DES-ensamble. Dado los siguientes nemónicos
desensamblar.
3E5506150E22616877
Solución: Con la tabla SET OP CODE podemos identificar la instrucción. Deducir la
posición de la siguiente instrucción a partir del número total de Bytes que ocupa
cada instrucción.
https://www.4shared.com/rar/ZvqlPSQPba/8085.html
Dir Pila
.
.
PC> dato
.
.
.
SP> FFFF
2.- SALTO DENTRO DE LA INSTRUCCIÓN
Un salto dentro de un programa, pueden estar condicionadas o no. Generalmente
el programador designa algún label, o etiquetado para señalar a la dirección al que
quiere saltar. Ej: …
XX: MVI A,B
JUMP XX ; Salto incondicional al label o etiquetado XX
HLT
…
2.5.- EJERCICIOS RESUELTOS Y ENSAMBLADO
Copia y pega en el editor ASM del simulador 8085 para el análisis más detallado de
cada ejemplo. Enssamblar.
.ORG 0
MVI C,10; El compilador transforma el 10 decimal a 0A H de
;forma interna
LOOP:DCR C
JNZ LOOP ;Si no se cumple la condición de cero salta a LOOP
HLT
;Ensamblado correctamente ©EIEE
.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.
;-------------------------------------------------------
; Ingresa los valores en una tabla dada
;--------------------------------------------------------
.data 1000H
dB 1h,2h,3h,4h,5h,6h,7h,8h,9h,Ah
.ORG 0
MVI A,00H
MVI L,10 ;COUNTER
LXI B,1000H ;POSICIONAMIENTO
LXI D,100AH ;POSICIONAMIENTO
XX: LDAX B
STAX D
INX B
INX D
DCR L
JNZ XX
HLT
4.-Suma en el contador la cantidad de unos que hay en una tabla usando CPI.
.data 2000H
dB 1h,0h,1h,1h, 1h,0h,1h,0h,1h,0h
.ORG 0
MVI A,00H ; 0E 00
LDA 3610H ; 3A3610
MOV B,A ; 47
LDA 3710H ; 3A37 10
ADD 80H ; 80
JNC 0E00H ; D2 0E 00
INR C ; 0C
STA 3810H ; 323810
MOV A,C ; 79
STA 3910H ; 323910
HLT ; 76
6.- Crear un contador que busque los numero ’s que posea en un tabla de tamaño
10.
;---------------------------------------------------------
; 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
;-----------------------------------------------------------------------------
; PROGRAMA QUE CUENTA LOS 1’S EN UN REGISTRO
;-----------------------------------------------------------------------------
.ORG 0
;INGRESO DE DATOS
MVI C,0 ; inicializamos el counter en cero
MVI B,8 ; Contador de tamaño de bits del dato (en exadecimal 08H)
MVI A,7FH ; Almacenamos el dato en registro A
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
;----------------------------------------------------------------------------
; RECORRIDO DEL DATO EN LA DIRECCION HL
;----------------------------------------------------------------------------
Resultado C=A
3.- TIEMPO DEL PROGRAMA
3.1 Ejecución de un Programa. Hasta ahora se estudiaron la arquitectura de una CPU, el
formato de las instrucciones y los distintos tipos de instrucciones. Veremos ahora cómo se
ejecuta un programa almacenado en memoria. Un programa almacenado en memoria está
listo para ser ejecutado por el microprocesador. Para ser ejecutado, es necesario cargar el PC
con la dirección de la primera instrucción a ser ejecutada. Luego, el PC se incrementa
automáticamente recorriendo secuencialmente los sucesivos lugares de memoria donde se
halla el programa.
3.2.1.-Ciclo de instrucción
Es el tiempo total, medido en números de períodos de reloj, de duración de un ciclo de
búsqueda más uno de ejecución de la instrucción teniendo en cuenta los sucesivos accesos a
memoria en el caso de ser una instrucción de más de un byte.
3.2.2.-Ciclo de máquina
Es el tiempo, medido en números de períodos de reloj de duración de una operación de
lectura, de escritura o de búsqueda (Fetch) de una instrucción. Un ciclo de instrucción está
compuesto por uno o varios ciclos de máquina (M1, M2, M3,M4), dependiendo del tipo de
instrucción. Se denomina M1 al ciclo de búsqueda, pues siempre es el primero de cada ciclo
de instrucción. Los ciclos de máquina más comunes son: Fetch, Memory Read, Memory Write,
I/O Read, I/O Write, INA, etc.
TIMING DIAGRAM for various machine cycles Los ciclos de la máquina son las operaciones
básicas realizadas por el procesador, mientras que las instrucciones se ejecutan. El tiempo
necesario para realizar cada ciclo de la máquina se expresa en términos de Tstates. Un T-
estado es el período de tiempo de un ciclo de reloj del microprocesador.The various machine
cycles are (los diferentes ciclos de la máquina son):
7T
4T 4T 4T *N
4T
TT=8T+14TN
TT=8T+14*3*T
TT=8T+42T R: TT=50T
2.7.- Metodo de Columnas (DETALLES).
a a N a*N
a a b N-1 a*(N-1)+b
a a a N a*N
b b a N b*(N-1)+a
b a c b+a+c
Tipos de columnas: Como te habrás dado cuenta, al efectuar este tipo de operaciones habra un inicio,
luego un salto condicional que lleva a un ciclo recursivo, que se repite constantemente sin variar y
solo cuando se cumple una condición se continua hasta el fin del programa.
| | | |
Inicio: Corresponde a los tiempos T del primer recorrido de la instrucción.
Bucle: Es el ciclo T que se repite constantemente sin variar y en forma recursiva.
Fin: Cuanto se cumple la condición para recorrer las últimas instrucciones hasta HLT
1.-Calcular la duración del programa, para un procesador 8085, que usa un cristal de 6 Mhz.
--------------------------------------------------------------------------------------------------
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T
7T
X X X *N1
4T 4T 4T *N1
7T 7T 10T *N1-1
7T
4T 4T 4T *N2
X=7T+4TN2+10T(N2-1)+7T
X=7T+4TN2+10TN2-10T+7T
X=14TN2+4T
TT= 7T+XN1+4TN1+(N1-1)7T+ 10T+(N1-1)10T+4T Reemplazando X:
TT= XN1+21TN1+4T
TT= (14TN2+4T)N1+21TN1+4T
TT= 14TN2N1+4TN1+21TN1+4T
TT=14TN2N1+25TN1+4T
N1=02H= N2=02H=
TT=14T*(2)*(2)+25T*(2)+4T
TT=110T
Mhz
.
2.-Calcular la duración del programa, para un procesador 8085, que usa un cristal de 6 Mhz.
DCR B 4T
JZ FIN 7/10T
JNZ REP1 7/10T
FIN: HLT 4T
7T
X X X *N1
4T 4T 4T *N1
7T 7T 10T *N1-1
7T
4T 4T 4T *N2
X=7T+4TN2+10T(N2-1)+7T
Puesto que es el mismo ejercicio pero solo con los valores de N distintos se
procede a calcular N1,N2 como en el ejercicio anterior.
TT=14TN2N1+25TN1+4T
7 7
N1=0AH= 10 N2=47H=71
TT=14T*71*10+25T*10+4T
TT=10940T
TT 9 s
TT=0,0036 [s]
2.8.-Método del Flujograma.
(1) Se procede a hacer un flujograma completo del programa
(2) Las rutinas se desglosan de tal forma que podamos hacer un recorrido mas simple del
programa.
(3) Habiendo hecho esto se procede a unificar en una ecuación
El esquema debe representar correctamente el programa.
Se recorre el programa sumando los tiempos T. Se multiplica por N cuando ingresa a un ciclo o N-1
si ha retornado en una dirección. Recordando que 7T/10T se refiere al tiempo que ocupa para
ejecutar un salto (10T) o para ejecutar la siguiente instrucción (7T).
X=7T+4TN2+10T(N2-1)+7T
TT=7T+XN1+4TN1+(N1-1)10T+7T+4T
TT=7T+(7T+4TN2+(N2-1)10T+7T)N1+4TN1+(N1-1)10T+7T+4T
TT =0,0036 [s]
3.-Se tiene un cristal de 6,1414Mhz determinar el tiempo de ejecución del
programa.
Label Mnemónico Comentario
ORA H 4T
JZ FIN 7/10T
JNZ DEI 7/10T
FIN: HLT 4T
4T
10T
7T 7T 10T *N-1
TT= TT=29NT-11T=(29N-11)T
. 7 7
N=1000
TT=(1000*29-1 5 s =9421,425 s
TT=0,00942
III PERIFERICOS, PUERTAS DE ENTRADA, PUERTAS DE
SALIDA, PROGRAMACION POR DIRECCIONAMIENTO
3.2.-interfaz
3.3.-led
C A X
0 0 1
0 1 0
1 X
Ejemplo IN/OUT
2B Op.code D3 Op.code
20 Direc. 4F Direc.
b) Periférico de entrada y salida.
Este esquema ilustra una lectura (RD), y una escritura (WR) en las puertas IN y
OUT. Debido a que el TRISTATE tiene un C=0 no hay alta impedancia y por
ende no existe un cortocircuito.
A7 A6 A5 A4 A3 A2 A1 A0 IN
0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 1 0 0 2
0 0 0 0 0 1 0 0 0 4
0 0 0 0 1 0 0 0 0 8
0 0 0 1 0 0 0 0 1 0
0 0 1 0 0 0 0 0 2 0
0 1 0 0 0 0 0 0 4 0
1 0 0 0 0 0 0 0 8 0
A7 A6 A5 A4 A3 A2 A1 A0 IN
1 1 1 1 1 1 1 0 F E
1 1 1 1 1 1 0 1 F D
1 1 1 1 1 0 1 1 F B
1 1 1 1 0 1 1 1 F 7
1 1 1 0 1 1 1 1 E F
1 1 0 1 1 1 1 1 D F
1 0 1 1 1 1 1 1 B F
0 1 1 1 1 1 1 1 7 F
e) Lógica de un selecctor.
A7 A6 A5 A4 A3 A2 A1 A0 I
1 1 1 x x 0 0 0 0
1 1 1 x x 0 0 1 1
1 1 1 x x 0 1 0 2
1 1 1 x x 0 1 1 3
1 1 1 x x 1 0 0 4
1 1 1 x x 1 0 1 5
1 1 1 x x 1 1 0 6
1 1 1 x x 1 1 1 7
SALIDA Direccionamiento
I7 I6 I5 I4 I3 I2 I1 I0
A15 A14 A13 A12 A11 A10 A9 A8
1 1 1 1 1 1 1 0 IN
A7 A6 A5 A4 A3 A2 A1 A0
Nota: A A8 A A9…A7 A 5
1 1 1 1 1 0 0 0 F8H
SALIDA
Direccionamiento
I7 I6 I5 I4 I3 I2 I1 I0
A15 A14 A13 A12 A11 A10 A9 A8
1 1 0 1 1 1 1 1
IN
A7 A6 A5 A4 A3 A2 A1 A0
0 0 1 0 1 1 0 1 2DH
Ejercicio 3.- Dado la siguiente dirección diseñar e implementar un circuito lógico.
A7 A6 A5 A4 A3 A2 A1 A0 IN
0 0 1 0 1 0 0 0 28H
0 0 1 0 1 0 0 1 29H
0 0 1 0 1 0 1 0 2ª
0 0 1 0 1 0 1 1 2B
0 0 1 0 1 1 0 0 2C
0 0 1 0 1 1 0 1 2D
0 0 1 0 1 1 1 0 2E
0 0 1 x 1 1 1 1 2F
Solución.
2.-Interfaz en paralelo.
Transferencia simultáneas de 8 bits
Nota: La puerta C solo dispone de 6 bits, los otros restantes 2 bits son
considerado Don’t Care.
3.-Interfaz en serie: Transferencia bit a bit
2.-Registro control C/S
Este registro ayuda a direccionar el control status, programando las funciones de las puertas
como entrada o salida, la operación del timer y la Interrupción.
Timer Interrup. PC PB PA
Puerta C Puerta B Puerta A
2.2.2.-Puerta Interrup
De momento vamos a considerar esta puerta Don’t Care.
2.2.3.-Puerta Time
Esta puerta controla el tiempo y dependiendo del requerimiento se va configurar los valores
de cada estado lógico esta en recuadro de arriba.
TH TL
4 9 C 4
0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
Modo 14 bits
00= una onda cuadrada
01= onda cuadradas continuas
10= un pulso
11= pulsos continuo.
Ejercicio Dado el siguiente circuito implementar las direcciones del Ship Select, las puertas
PA,PB,PC, TH y TL, si se tiene la interface 8155 y una señal de salida en I3 del selector 74138.
Solución:
Direccionamiento de las puertas del 8155 con el ship selector 74138
Direccionamiento en I3 [8 bits]
74138 8155
A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H CS (Control
status)
0 1 0 1 1 0 0 1 59H PA (Puerta A)
0 1 0 1 1 0 1 0 5AH PB (Puerta B)
0 1 0 1 1 0 1 1 5BH PC (Puerta C)
0 1 0 1 1 1 0 0 5CH TL
0 1 0 1 1 1 0 1 5DH TH
Direccionamiento en I5
74138 8155
A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 1 0 1 0 0 0 68H CS (Contro Status)
0 1 1 0 1 0 0 1 69H PA (Puerta A)
0 1 1 0 1 0 1 0 6AH PB (Puerta B)
0 1 1 0 1 0 1 1 6BH PC (Puerta C)
0 1 1 0 1 1 0 0 6CH TL
0 1 1 0 1 1 0 1 6DH TH
3.3.-Periféricos
3.3.1.-LED
Un led (LIGHT EMITER DIODE) es un un cuerpo semiconductor de gran resistencia que al
recibir una corriente eléctrica de muy baja intensidad, emite luz de forma eficiente y con alto
rendimiento.
Anodo Catodo
En un circuito lógico los estados de encendido del led dependerá si hay un flujo de
corriente en polarización directa, en caso contrario estará apagado. De allí que se
enciende un led cuando hay un cero lógico en el Cátodo y un 1 lógico en el Ánodo.
Ejemplo. Se tiene un set de 7 leds conectados a una señal de entrada. Si el estado lógico de
encendido (ON) es FOH, el esquema es el siguiente:
D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 1 0 0 0 0
3.1.-Display de 7 segmentos
ANODO COMUN: Los leds se encienden con 0.
CATODO COMUN: Los leds se encienden con 1.
Tabla GENERAL Cátodo común Tabla del simulador SIM 8085 Cátodo común
Display Valor hexadecimal Xgfe dcba Display Valor hexadecimal Xcde gbaf
0 3FH 0011 1111 0 77H 0111 0111
1 06H 0000 0110 1 44H 0100 0100
2 5BH 0101 1011 2 3EH 0011 1100
3 6EH 0110 1110 3 6EH 0110 1110
4 66H 0110 0110 4 4DH 0100 1101
5 6DH 0110 1101 5 6BH 0101 1011
6 5FH 0101 1111 6 7BH 0111 1011
7 07H 0000 1111 7 46H 0 100 0110
8 7FH 0111 1111 8 7FH 0111 1111
9 6FH 0110 1111 9 6FH 0110 1111
a) Ejercicio con CONTROL STATUS
REGISTRO CONTROL
Si X=0 PC PB PA
X X X X 0 0 1 1 03H
Programa:
MVI A, 03H
OUT 58H
Lo que realiza este pequeño programa es mover al acumulador el valor lógico
de las puertas PA, PB,PC (03H) para controlar las puertas del 8155. Se le
asigna 58H al Control Status (C/S), lógica ingresada por el direccionamiento del
uP74138 y el uP8155. De momentos hemos considerado el Time y el Interr.
como Don´t care (X=0)
Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits]
74138 8155
A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H C/S (Control
Status)
0 1 0 1 1 0 0 1 59H PA (Puerta A)
0 1 0 1 1 0 1 0 5AH PB (Puerta B)
0 1 0 1 1 0 1 1 5BH PC (Puerta C)
0 1 0 1 1 1 0 0 5CH TL
0 1 0 1 1 1 0 1 5DH TH
;--------------------------------------------------------------
;-------------------------------------------------------------
TH TL
4 9 C 4
0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0
Modo 14 bits
Modo :
2500 : 2
5 2 0
1 0
1
Calcular el TH y el TL
Solucion: Se calcula N
5
5
5 9 ( 5 5
El valor 9C4H se envía al Timer programable.
TIMER
TH TL
4 9 C 4
0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0
Modo 14 bits
Programa
OUT TL
MVI A, 49H
OUT TH
;----------------------------------------------------------------------
; programa con puertas
;---------------------------------------------------------------------
Direccionamiento de las puertas del 8155 con el ship selector 74138 en I3 [8 bits]
74138 8155
A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
0 1 0 1 1 0 0 0 58H C/S (Control Status)
0 1 0 1 1 0 0 1 59H PA (Puerta A)
0 1 0 1 1 0 1 0 5AH PB (Puerta B)
0 1 0 1 1 0 1 1 5BH PC (Puerta C)
0 1 0 1 1 1 0 0 5CH TL
0 1 0 1 1 1 0 1 5DH TH
3.3.1.1.-Mi primer display
Vamos a copiar el siguiente programa en el editor ASM, compilar y seleccionar el display de
7 segmentos y ejecutamos el programa ejecutamos en RUN>>:
;-------------------------------------------------------------------------
; Programa mi primer display de 7 segmentos
;-------------------------------------------------------------------------
.ORG 0
MVI A, 77H
OUT 00H
HLT
;-----------------------------------------------------------------------------
; Programa mi primer display de 7 segmentos de 0 a 9 con retardo (DELAY)
;-----------------------------------------------------------------------------
.DATA 1000H
DB 77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH ;Definimos los números de 0-9
.ORG 0
OTRO: INR D
CALL MOSTRAR
CALL DELAY
MOV A,D
CPI 9
JNZ OTRO
HLT
En la puerta C, hay conectado un led que se activa cuando se presiona una tecla.
Si se presiona la tecla 5, deberá generarse una serie de onda cuadradas de 5000 hz.
La Puerta A, esta conectada a un display de siete segmentos: PA0 a segmento a, PB1 a
segmento b y así sucesivamente, por lo cual deberá mostrarse en el display la información
correcta. Puede generarse una tabla donde este almacenada la información de cada digito
asociada al display.
Solución:
Se cuenta con el Up 8085, selector 74138, el interfaz 8155 y los periféricos, teclado,
display de 7 segmentos y un LED.
1.- Direccionamiento.
3.- Timer
5.-Programación
1.-Direccionamiento
Permite direccionar el C/S,PA,PB,PC,TH, TL. Requieres del selector 74138 y la interfaz
8155.
El selector genera una señal en I3 con A6A5A7=011=3, y para se activen los ENABLES
requiere que de allí que A4,A3=10. La señal del selector llega al
Chip Select del interfaz el que contiene los valores A2A1A0=XXX, que irán
incrementándose en forma binaria. Todos estos valores se trasladarán a una tabla, que nos
dará las direcciones de las puertas según sea las condiciones iniciales. Es importante para
programar.
74138 8155
A7 A6 A5 A4 A3 A2 A1 A0 Direcc.
1 0 1 1 0 0 0 0 B0H C/S (Control Status)
1 0 1 1 0 0 0 1 B1H PA (Puerta A)
1 0 1 1 0 0 1 0 B2H PB (Puerta B)
1 0 1 1 0 0 1 1 B3H PC (Puerta C)
1 0 1 1 0 1 0 0 B4H TL
1 0 1 1 0 1 0 1 B5H TH
REGISTRO CONTROL
TIMER INTERR. PC PB PA
0 0 0 0 1 1 0 1 0DH
1 1 0 0 1 1 0 1 CDH
3.-Programación del TIMER
Se define conforme a los requerimientos del problema, para ello se requiere saber cuál es la
frecuencia del cristal, y cuanto nos pide generar.
Datos
614: 2
307 0
7 153 1
76 1 6
38 0
19 0
9 1
7
5 4 1 6
2 0
;___________PROGRAMACION TIMER________ 1 0
0 1
MVI A,66H
x 2
OUT TIMER_L
x
MVI A,42H
OUT TIMER_H
;____________________________________________
TIMER
TH TL
4 2 6 6
0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0
Modo 14 bits
*NOTA: Cuando se sobrepasa la capacidad de 14 bits es necesario otro TIMER
4.- Perifericos
4.1.-Display de 7 segmentos
ANODO COMUN: Los leds se encienden con 0.
CATODO COMUN: Los leds se encienden con 1.
2 32 7 37H
0 1 2
3 4 5 3 33H 8 38H
6 7 8 4 34H 9 39H
9
Tabla completa código ANSII
5.- Programa Ejercicio Final
;PROGRAMA QUE LEE UN TECLADO Y GENERA UN PULSO CON LA TECLA 5
.data 1030
db C0H, F9H, A4H, B0H, 99H, 92H, 83H, F8H, 80H,98H
.define
CS B0H
TECLADO B1H
DISPLAY B2H
LED B3H
TIMERL B4H
TIMERH B5H
;_____________________
; INICIO PROGRAMA
.org 0
LXI SP,3000H ;Inicializamos el STACK
LXI H,1000H ;Nos posicionamos en la dirección
;____________________
;PROGRAMA TIMER
MVI A,0DH
OUT CS
MVI A,66H
OUT TIMERL
MVI A,42H
OUT TIMERH
;______________________
;LEER TECLADO
INICIO : IN TECLADO
MOV L,A
MOV A,M
OUT DISPLAY
MVI A,01
OUT LED
; ________________________
CALL Delay
MVI A,00H
OUT LED
;________________________ ;si se presiona la tecla 5=35H ESTE salta a la
MVI A,35H ;subrutina TIMER
CMP L
JZ TIMER
JMP INICIO
;________________________
TIMER: MVI A, CDH ;aqui se inicia un ciclo reloj de ondas cuadradas continuas
OUT CS ;se modifica CS
JMP INICIO
Delay: mvi C,00H
XX: DCR C
JNZ XX
RET
;____FIN PROGRAMA_____________
;Ensamblado correctamente ©EIEE
Nota del autor: El simulador no cuenta con un interfaz real por lo que el ejercicio anterior no se
podrá verificar y sólo será posible realizarlo en el laboratorio, sin embargo los resultados teóricos
no tendrían que variar mucho con los reales.
;---------------------------------------------------------------------------
;Programa que presionando 0 se muestra en el display de 7 segmentos
;---------------------------------------------------------------------------
.org 0
mvi b,00h
mov a,b ;inicializo
inicio:in 00h ;ingreso por teclado un numero
cpi 30h ;comparo el contenido del acumulador con 30h que en ansi ii es 0
jnz inicio ; si es cero el contenido podremo salir del ciclo
mvi a,77h ;el valor (out) es 77h para el display de 7 segmentos es 0
out 00h ; este valor es llevado a la puera
;---------------------------------------------------------------------------
;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
.org 0
.Data 1000h
db 10h, f9h
.define
TECLADO 01H
.Data 1000h
db 10h, f9h
.define
TECLADO 01H
Del mismo modo, el contenido del registro puede ser almacenado en la pila y recuperado
por el programador. Durante la ejecución de un programa a veces es necesario guardar el
contenido de ciertos registros y datos en la memoria para que los registros puedan ser
utilizados para otras operaciones. Después de completar estas operaciones, los contenidos
guardados en la memoria se pueden transferir de nuevo a los registros. Las localizaciones de
la memoria para este propósito son reservadas por el programador en el principio.
El puntero de la pila se inicializa siempre al principio del programa utilizando la instrucción LXI
SP,dir. Esta instrucción carga el registro del puntero de pila con la dirección de memoria de 16 bits.
Cualquier área de la memoria RAM se puede utilizar como pila pero para evitar que el programa sea
destruido por la información de la pila, es una práctica general que el comienzo de la pila se
encuentre en la ubicación de memoria disponible más alta (FFFFH). La memoria de la pila se basa en
el principio del último en entrar es lo primero (LIFO). La entrada de datos en la pila se denomina
operación 'PUSH' y la recuperación de datos de la pila se denomina operación 'POP'. El puntero de
pila siempre tiene la dirección de la pila superior.
LXI SP, 3075H ; Carga el registro de apuntador de pila (16 bits) con 3075H.
LXI D, 3075H ; Esta instrucción carga el registro D con 30H y el registro E con 75H.
;De manera similar, si escribimos:
6.1.1 INSTRUCCIÓN PUSH Rp
Empuja el par de registros en la pila: Es una instrucción de 1 byte que se usa para
copiar el contenido del par de registros en la pila. la dirección de ubicación de memoria
presente en el registro del puntero de pila se decrementa 2 veces.
PUSH D
Ejecutan los siguientes pasos:
a) El puntero de la pila (SP) se decrementa en uno, es decir (SP-1), que aquí pasa a ser
2057H. El contenido del registro D (registro de orden alto), es decir, 5AH, se copian en
la posición de memoria 2057H (MSP-1)
b) El puntero de la pila es nuevamente decrementado por uno, es decir (SP-1), que ahora se
convierte en 2056H. El contenido del registro E (registro de orden inferior) se copia en
el nuevo valor de la posición de memoria 63H.
Antes de PUSH
Despues de PUSH
Puntero
Puntero
Stack
Stack
2058H
2056
Registro D Registro E
Registro D Registro E
5AH 63H
5AH 63H
DIRECCION SP MEMORIA
DIRECCION SP MEMORIA
2055 0
2055 0
2056 0
PC->2056 63H
2057 0
2057 5AH
PC->2058 0
2058 0
Ejemplo Supongamos que el puntero de pila contiene la dirección del ejemplo anterior
2056H y contiene 63H. La posición de memoria 2057H contiene 5AH y luego utilizando POP
D se ejecutan los pasos siguientes:
La instrucción: POP D
a) El contenido de la posición de memoria 2056H, se transfiere 63H al registro E, y el
puntero de la pila se incrementa en uno para (SP + 1), es decir, 2057H
b) El contenido de la posición de memoria 2057H, se transfiere 5AH al registro D y
ahora el contenido del par de registros BC =5A63H.
* El puntero de pila se incrementa de nuevo para obtener un nuevo valor (SP + 1), es decir,
2058H recuperando así los valores originales del registro par DE.
Antes de POP Despues de POP
Puntero Puntero
Stack Stack
2056 2058
Registro Registro C Registro B Registro C
X X 5AH 63H
6.4.1 Resumen
Cada vez que usamos las instruccion PUSH debemos considerar el orden con su
respectivo POP, ya que estamos programando sobre una pila tipo LIFO en el STACK, por lo
tanto lo ultimo que ingresamos es lo primero que colocamos.
*Nota del autor: No puedes colocar PUSH C, PUSH L o PUSH E ! ya que estamos trabajando
sobre los registros pares : HL, BC, DE, PSW.
PUSH B PUSH B
PUSH H PUSH H
POP B POP H
POP H POP B
… ….
6.2.-PROGRAMACIÓN CON SUBRUTINAS
6.2.1.- INTRUCCION CALL dir
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).
EJEMPLOS
;Programa que llama a una subrutina sin usar el Stack Pointer (SP)
;y sufre perdidas de los valores en los registros originales
.ORG 0
MVI H,0AH
MVI L,10H
MVI C,0AH
CALL SUBRUTINA
XX: DCR C
JNZ XX
HLT ;Se pierde el valor original HL=0A10 con HL=00FF
SUBRUTINA:
MVI H,00H
MVI L,FFH
RET
;Ensamblado correctamente ©EIEE
;Para corregir este error ocuparemos el STACK y las instrucciones
PUSH y POP.
;Programa que guarda datos en el SP
SUBRUTINA:
MVI H,00H ;valor
MVI L,FFH
RET ;retorna al programa principal
A) Interrupciones de software
B) Interrupciones de hardware
Esta interrupción no es possible vectoriazarlas, debido a que possee 8 direcciones dentro del
hardware.
SID I7 I6 I5 IE ̅̅̅̅̅̅̅̅
. ̅̅̅̅̅̅̅̅
. ̅̅̅̅̅̅̅̅
.
Para poder acceder a las diferentes interrupciones debemos llamar a las instruccione:
MVI Acc, dir, SIM (set Interrup Mask) y EI (Enable Interrup).
…
mvi Acc,dir ;dir puede activar las interrupciones /M7.5 /M6.5 /M5.5
D7 D6 D5 D4 D3 D2 D1 D0
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
MSE: Mask Set Enable If D3=1 then D0, D1 and D2 are enable 1
RST 7.5, RST 6.5, RST 5.5: All the three interrupts are vectored and maskable interrupts. In
order to enable these interrupts the P requires two instructions:
a) EI (Enable Interrupt)
b) SIM (Set Interrupt Mask)
Besides these three interrupts are sensitive to different types of triggering as explained
below:
RST 5.5 and RST 6.5: These are level sensitive interrupts which implies that the
triggering level should be on until the P completes the execution of current instruction. If
the P is not able to respond immediately to these interrupts then they should be stored by
external hardware.
RST 7.5: It is positive-edge sensitive and can be triggered with a short pulse. In this
case if the P is unable to respond immediately then the request is stored internally by D-
flip-flop.
TRAP: It is vectored, non-maskable interrupt. It is level-and edge-sensitive, which
implies that the input should go high and remain in that state until it is acknowledged by the
P. In case of TRAP the instructions like EI (Enable interrupt), DI (Disable interrupt) and
SIM (Set Interrupt Mask) are not required i.e. it need not be enabled, and it cannot be
disabled. The triggering of various interrupts can be
summarized in the form of diagram as shown below:
;------------------------------------------------------------------------
; Programa de retardo con interrupcion /M 7.5
;-----------------------------------------------------------------------
.org 0
jmp 40h ;Dirección del programa principal
mvi a,0Bh; Enmascaramos sin resetear RST F/F /M75 = 0000 1011
;Para explicar en términos visuales esta interrupción
sim
ei ;De momento habilitaremos las interrupciones
mvi a,F0H ;Corresponde al contenido del programa principal
x1: out 0
call delay
rlc
jmp x1
.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
Nota: Se debe tener cuidado con las direcciones de retorno y salto, para no sobrescribir
las direcciones de las interrupciones. Sería nefasto perderse en el programa y por ende
debemos tener cuidado de usar las instrucción RET cuando sea necesario. Como se trabaja
con datos dentro de una pila, muchas veces es necesario almacenarlos en el STACK, y por
ello se usa las instrucciones PUSH y POP.
7.-Conclusiones finales.
He querido dejar este material a disposicion a cualquier alumno que desee aprender
sobre programación en lenguaje assembler. Espero haber sido de algún aporte en el camino
de la enseñanza, he rescatando ejemplo de mis compañeros de curso, notas del profesor, la
WEB, y ejercicios propios. He corregido y compilado los ejercicios para que puedan ser mas
fácil copiar y pegar en el simulador cada programa paso a paso.
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