Download - Ciclos de máquina - UNSLpmp/archivos/teoria7_bol4.pdf · Dado el siguiente circuito, escribir un programa en assembler y hexadecimal para el 8085 a partir de la dirección que se

Transcript

Ciclos de máquina• Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP)

DCX rp

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

Ciclos de máquina: instrucción OUT

Ciclos de máquina: instrucción STA

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):