ciclos de máquina - unslpmp/archivos/teoria7_bol4.pdf · dado el siguiente circuito, escribir un...
TRANSCRIPT
Acceso a periféricos: función del pin IO/M• Este μP cuenta con dos instrucciones específicas para I/O, llamadas IN y OUT.
• Cuando se ejecuta un IN en lugar de un LDA, la línea IO/M se pone en alto (lo mismo ocurre con OUT frente a STA).
• Además, en estos casos, solo se utilizan direcciones de 8 bits:
IN dir_puerto
Lenguaje de máquina: 11011011 = DBh (opcode)00110011 = 33h (dir. puerto entrada, de 8 bits)
En assembler: IN 33h A (puerto 33h)
OUT dir_puerto
Lenguaje de máquina: 11010011 = D3h (opcode)01000101 = 45h (dir. puerto salida, de 8 bits)
En assembler: OUT 45h (puerto 45h) A
Terminales del μP 8085(vistos hasta ahora)
Buses de direcciones y datos
Bus de control
Alimentación, clock, reset
Acceso a memorias lentas: función del pin READY• Diferencias en ciclos de lectura con y sin estados de espera (TW):
Cálculo de tiempos de ejecución
(puerto 33h) 00000000b
B 100
B B-1
activó Z?
(puerto 33h) 00000001b
B 100
B B-1
activó Z?
2000h: MVI A,00000000b2002h: OUT 33h2004h: MVI B,1002006h: DCR B2007h: JNZ 2006h200Ah: MVI A,00000001b200Ch: OUT 33h200Eh: MVI B,1002010h: DCR B2011h: JNZ 2010h2014h: JMP 2000h2015h:
delay
delay
Ejemplo: parpadeo de un bit en el puerto 33h
Cálculo de tiempos de ejecución1000h: LXI SP,4100h
.
.
.2000h: MVI A,00000000b2002h: OUT 33h2004h: CALL 3000h2007h: MVI A,00000001b2009h: OUT 33h200Bh: CALL 3000h200Eh: JMP 2000h2011h:
.
.
.3000h: MVI B,1003002h: DCR B3003h: JNZ 3002h3006h: RET
.
.
.4000h:
.
.
.4100h:
programaprincipal
subrutina
zona de RAMdedicada al
stack
Solución usando una subrutina:
Ejercicio 1: decodificación y acceso a puertosDado el siguiente circuito, escribir un programa en assembler y hexadecimal para el 8085 a
partir de la dirección que se ejecuta después de un reset, de modo que:
a) Encienda los leds de salida que correspondan a los contactos que permanezcan cerrados.
b) Encienda los leds de salida que correspondan a los contactos que permanezcan abiertos.
Ejercicio: decodificación y acceso a puertos
Dirección A15 . . . A8 A7 A6 A5 A4 A3 A2 A1 A0
Puerto entrada . . . 0 0 1 X 1 1 1 1 (2F)Puerto salida . . . 1 0 0 X 1 1 1 1 (8F)
Leer puerto de entrada
Enviar valor apuerto de salida
COMASSEMBLER:
DIR: HEXA:
2000 DB 2000h: IN h’8F2001 8F
2002 D3 OUT h’2F2003 2F
2004 C3 JMP h’20002005 002006 20
Parte a):
Ejercicio: decodificación y acceso a puertos
Leer puerto de entrada
Enviar valor apuerto de salida
COMASSEMBLER:
DIR: HEXA:
2100 DB 2100h: IN h’2F2101 2F
2102 2F CMA
2103 D3 OUT h’8F2104 8F
2105 C3 JMP h’21002106 002107 21
Parte b):
Invertir
¿Se podría leer o escribir esos puertos con instrucciones LDA o STA?
¿Que le cambiaría al circuito para lograrlo?
Lenguaje Assembler• Es más fácil de manejar que el lenguaje de máquina.
• Consiste esencialmente de las mismas instrucciones que el μP (los mnemónicos).
• Se agregan otras instrucciones propias del lenguaje, llamadas pseudo-instrucciones o directivas del ensamblador (empiezan con un punto).
• Se hace uso de las llamadas etiquetas (o labels) para efectuar saltos o señalar una dirección.
Algunas pseudo-instrucciones son:
.ORG dir(Indica que el código que sigue a continuación ha de ubicarse a partir de la dirección dir)
.END(Indica el fin del programa)
label .EQU data(le asigna a la etiqueta label el valor data)
Cálculo de tiempos de ejecución1000h: LXI SP,4100h
.
.
.2000h: MVI A,00000000b2002h: OUT 33h2004h: CALL 3000h2007h: MVI A,00000001b2009h: OUT 33h200Bh: CALL 3000h200Eh: JMP 2000h2011h:
.
.
.3000h: MVI B,1003002h: DCR B3003h: JNZ 3002h3006h: RET
.
.
.4000h:
.
.
.4100h:
programaprincipal
subrutina
zona de RAMdedicada al
stack
(puerto 33h) 00000000b
B 100
B B-1
activó Z?
(puerto 33h) 00000001b
B 100
B B-1
activó Z?
Mismo ejemplo pero en lenguaje assembler:pilaini: .EQU 4100htiempo: .EQU 100puerto: .EQU 33h
;-------------------------------------; Programa principal
.ORG 1000h
LXI SP,pilaini ; inicializo el stack; para poder usar CALL
parpadear: MVI A,00000000bOUT puerto ; apaga el LEDCALL demoraMVI A,00000001bOUT puerto ; enciende el LEDCALL demoraJMP parpadear
;--------------------------------------; Subrutina de delay, T=tiempo*14*Tclock (aprox.)
demora: MVI B,tiemporepetir: DCR B
JNZ repetirRET
.END
Ejercicio 2: decodificación y algo mas…Dado el siguiente circuito, escribir un programa en assembler y hexadecimal para el 8085 a
partir de la dirección que se ejecuta después de un reset que:
a) Reproduzca en los 8 leds superiores el contenido del registro B del μP y en los 8 inferiores el contenido del registro C.
b) Indicar el valor de la suma del contenido de los registros A, B y C ( A+B+C ) y colocarlo en binario en los 16 bits formados por los dos puertos (superior mas significativo).
Ejercicio 2: decodificación y algo mas…Dirección A15
. . . A8 A7 A6 A5 A4 A3 A2 A1 A0
Salida de arriba X . . . X 1 1 1 1 0 1 0 1 (F5)Salida de abajo X . . . X 1 1 1 1 0 1 0 0 (F4)
Leer registro B
Invertir
COMASSEMBLER:
DIR: HEXA: .ORG h’00000000 C3 JMP START0001 00 .0002 01 .. . .. .. . .ORG h’0100
0100 78 START: MOV A,B0101 2F CMA0102 D3 OUT h’F50103 F50104 79 MOV A,C0105 2F CMA0106 D3 OUT h’F40107 F40108 C3 JMP START0109 00010A 01
Escribir puerto de arriba
Leer registro C
Invertir
Escribir puerto de abajo
Parte a):
Ejercicio 2: decodificación y algo mas…
Inicializar variables
Sumar A+B+C
COM
ASSEMBLER:
DIR: HEXA: .ORG h’00000000 C3 JMP START0001 00 .0002 1F .
. . .
. .
. . .ORG h’1F001F00 26 START: MVI H,01F01 001F02 80 ADD B1F03 D2 JNC SALTO1F04 071F05 1F1F06 24 INR H1F07 81 SALTO: ADD C1F08 D2 JNC SALTO11F09 0C1F0A 1F1F0B 24 INR H1F0C D3 SALTO1: OUT h’F41F0D F41F0E 7C MOV A,H1F0F D3 OUT h’F51F10 F51F11 C3 JMP START1F12 001F13 1F
Escribir puerto de arriba
Escribir puerto de abajo
Parte b):