Teoría 7

Anuncio
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:
En assembler:
11011011
00110011
= DBh
= 33h
(opcode)
(dir. puerto entrada, de 8 bits)
A Å (puerto 33h)
IN 33h
OUT dir_puerto
Lenguaje de máquina:
En assembler:
11010011
01000101
OUT 45h
= D3h
= 45h
(opcode)
(dir. puerto salida, de 8 bits)
(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
Ejemplo: parpadeo de un bit en el puerto 33h
(puerto 33h) Å 00000000b
B Å 100
B Å B-1
delay
activó Z?
delay
(puerto 33h) Å 00000001b
B Å 100
B Å B-1
activó Z?
2000h:
2002h:
2004h:
2006h:
2007h:
200Ah:
200Ch:
200Eh:
2010h:
2011h:
2014h:
2015h:
MVI
OUT
MVI
DCR
JNZ
MVI
OUT
MVI
DCR
JNZ
JMP
A,00000000b
33h
B,100
B
2006h
A,00000001b
33h
B,100
B
2010h
2000h
Cálculo de tiempos de ejecución
Solución usando una subrutina:
programa
principal
subrutina
zona de RAM
dedicada al
stack
1000h:
.
.
.
2000h:
2002h:
2004h:
2007h:
2009h:
200Bh:
200Eh:
2011h:
.
.
.
3000h:
3002h:
3003h:
3006h:
.
.
.
4000h:
.
.
.
4100h:
LXI
SP,4100h
MVI
OUT
CALL
MVI
OUT
CALL
JMP
A,00000000b
33h
3000h
A,00000001b
33h
3000h
2000h
MVI
B,100
DCR
B
JNZ 3002h
RET
Ejercicio 1: decodificación y acceso a puertos
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, 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
A15 .
Dirección
. .
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)
Parte a):
COM
ASSEMBLER:
Leer puerto
de entrada
Enviar valor a
puerto de salida
DIR:
HEXA:
2000
2001
DB
8F
2002
2003
D3
2F
OUT
h’2F
2004
2005
2006
C3
00
20
JMP
h’2000
2000h: IN
h’8F
Ejercicio: decodificación y acceso a puertos
Parte b):
COM
ASSEMBLER:
DIR:
Leer puerto
de entrada
Invertir
Enviar valor a
puerto de salida
HEXA:
2100
2101
DB
2F
2100h: IN
h’2F
2102
2F
CMA
2103
2104
D3
8F
OUT
h’8F
2105
2106
2107
C3
00
21
JMP
h’2100
¿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ón
(puerto 33h) Å 00000000b
B Å 100
B Å B-1
programa
principal
activó Z?
(puerto 33h) Å 00000001b
subrutina
B Å 100
B Å B-1
activó Z?
zona de RAM
dedicada al
stack
1000h:
.
.
.
2000h:
2002h:
2004h:
2007h:
2009h:
200Bh:
200Eh:
2011h:
.
.
.
3000h:
3002h:
3003h:
3006h:
.
.
.
4000h:
.
.
.
4100h:
LXI
SP,4100h
MVI
OUT
CALL
MVI
OUT
CALL
JMP
A,00000000b
33h
3000h
A,00000001b
33h
3000h
2000h
MVI
B,100
DCR
B
JNZ 3002h
RET
Mismo ejemplo pero en lenguaje assembler:
pilaini:
tiempo:
puerto:
.EQU
.EQU
.EQU
4100h
100
33h
;------------------------------------; Programa principal
parpadear:
.ORG
1000h
LXI
SP,pilaini
MVI
OUT
CALL
MVI
OUT
CALL
JMP
A,00000000b
puerto
demora
A,00000001b
puerto
demora
parpadear
; inicializo el stack
; para poder usar CALL
; apaga el LED
; enciende el LED
;-------------------------------------; Subrutina de delay, T=tiempo*14*Tclock (aprox.)
demora:
repetir:
MVI
DCR
JNZ
RET
.END
B,tiempo
B
repetir
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 .
Salida de arriba
X
Salida de abajo
X
COM
Leer registro B
Invertir
Escribir puerto de arriba
Leer registro C
Invertir
Escribir puerto de abajo
. .
A8
A7 A6 A5 A4 A3 A2 A1 A0
. . .
X
1
1
1
1
0
1
0
1
(F5)
. . .
X
1
1
1
1
0
1
0
0
(F4)
ASSEMBLER:
Parte a):
DIR:
0000
0001
0002
.
.
.
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
010A
HEXA:
C3
00
01
.
.
.
78
2F
D3
F5
79
2F
D3
F4
C3
00
01
.ORG
JMP
.
.
.
h’0000
START
.ORG
START: MOV
CMA
OUT
h’0100
A,B
h’F5
MOV
CMA
OUT
A,C
JMP
START
h’F4
Ejercicio 2: decodificación y algo mas…
ASSEMBLER:
Parte b):
COM
Inicializar variables
Sumar A+B+C
Escribir puerto de arriba
Escribir puerto de abajo
DIR:
0000
0001
0002
.
.
.
1F00
1F01
1F02
1F03
1F04
1F05
1F06
1F07
1F08
1F09
1F0A
1F0B
1F0C
1F0D
1F0E
1F0F
1F10
1F11
1F12
1F13
HEXA:
C3
00
1F
.
.
.
26
00
80
D2
07
1F
24
81
D2
0C
1F
24
D3
F4
7C
D3
F5
C3
00
1F
START:
SALTO:
.ORG
JMP
.
.
.
h’0000
START
.ORG
MVI
h’1F00
H,0
ADD
JNC
B
SALTO
INR
ADD
JNC
H
C
SALTO1
INR
SALTO1: OUT
H
h’F4
MOV
OUT
A,H
h’F5
JMP
START
Descargar