Вы находитесь на странице: 1из 9

08/11/2011

Pila
2

UNIDAD 5 4A PARTE
PROGRAMANDO EN EL
ENSAMBLADOR DEL Z80
Otoo 2011

La pila es un grupo de locaciones de memoria


definidas por medio de carga una direccin al
apuntador a la pila (SP)
La pila es usada para almacenar informacin
temporal durante la ejecucin del programa
En teora, el tamao de la pila esta restringido al
tamao de la RAM disponible
La definicin de la pila se inicia cargando la
direccin de inicio de la pila LD SP,16-bits

Microprocesadores

Pila
3

Pila
4

La pila se localiza en la memoria RAM del sistema


y se utiliza como almacenamiento temporal durante
la ejecucion del programa

El contenido de un par de registros se almacena en


la locacion (SP-1)

La pila crece hacia arriba en la memoria, es decir


en orden decreciente de las direcciones de
memoria

Pila
5

La pila puede ser


inicializada en
cualquier lugar de la
memoria de usuario.
Un buen habito es
inicializar la pila a la
direccin de memoria
mas alta para evitar
que interfiera con la
memoria de datos del
programa

Memoria
0000H

0100H

Pagina 0
Rutinas de Inicio
Programa

Crecimiento
de la Pila
Pila
FFFFH

Pila
6

La instruccion PUSH almacena el contenido de un par


de registros en la pila

POP recupera la informacion de la pila


El apuntador a la pila (SP) siempre apunta al tope de
la pila
El apuntador SP es decrementado o incrementado
segun se almacene o recupere informacion.

El almacenamiento y
recuperacin de los
bytes en la pila se
realiza siguiendo un
formato LIFO (Last Input
First Output)
La informacin en la
locaciones de la pila no
son destruidas hasta que
nueva informacin es
almacenada

Dato 4
Dato 3
Dato 2
Dato 1

08/11/2011

Instrucciones de la Pila

Datapath del Z80

OPCODE OPERANDO
LD

SP,16-bits

PUSH

RP

PUSH

IX

POP

RP

POP

IX

DESCRIPCION
Carga una direccin de 16 bits en el registro apuntador a
la pila. Define la direccin de inicio de la pila
Copia el contenido del par de registros o de los registros
ndice en la pila.
Esta instruccin primero decrementa el apuntador a la pila y
copia la parte alta del registro en la locacin SP-1. Despus
decrementa nuevamente el apuntador y almacena la parte
baja del apuntador en SP-2
Copia el contenido de las dos locaciones de memoria de la
parte alta de la pila hacia par de registros especificados o
hacia los registros ndice .
Esta instruccin copia el contenido de la pila especificado
por SP dentro del registro de la parte baja (en BC, seria C)
incrementa el apuntador SP + 1. Copia el contenido de
SP+1 en la parte alta del registro e incrementa SP (SP + 2)

PUSH

POP

10

PUSH BC

B
C

PUSH HL

PUSH AF

21 H

Memoria
POP AF

10 H

22 H

A2 H

POP HL

A
F

Memoria

POP BC

22 H

A2 H

21 H

10 H

Banderas

23FA

Banderas

23FA

(A)

23FB

(A)

23FB

A2 H

23FC

A2 H

23FC

22 H

23FD

22 H

23FD

10 H

23FE

10 H

23FE

21 H

23FF

21 H

23FF

2400

SP

2400

SP

Manipulando Banderas
11

SP

SP

Manipulando banderas
12

El conjunto de instrucciones del Z80 no contiene


ninguna instruccin que nos permita cambiar
directamente el contenido de las banderas.
Sin embargo podemos examinar y modificar las
banderas por medio de la pila
Podemos obtener el contenido del registro de
banderas por medio de almacenarlo en la pila y
posteriormente recuperarlo en un registro de
propsito general

START:

LD SP, STACK

; Inicializa la pila

LD DE, 0000H

; Carga 0 para limpiar el registro de banderas

PUSH DE

; Almacena 0 en la pila

POP AF

; Limpia el acumulador y el registro de banderas

LD A,FFH

; Carga el mximo numero en A

INC A

; Incrementa A mas all de FFH

PUSH AF

; Almacena las banderas en la pila

POP DE

; Recupera las banderas

LD A,E

; Copia las banderas al acumulador

AND 11000001B

; Enmascara todo el registro menos S, Z y CY

OUT (PORT1),A

; Despliega las banderas

HALT

; Fin del programa

08/11/2011

Manipulando Banderas

Intercambio

13

La instruccin INC incrementa el contenido del


acumulador de FFH a 00H sin afectar la bandera
del CY
Por lo tanto el valor de las banderas ser el
siguiente
S

P/V

CY

Acumulador

H
0

AND C1H

Resultado

80 H

FF H

2097 H

Contenido de la Pila
2097 H

32H

2098 H

A2H

2099 H

EX (SP),HL

A2 H

Intercambia el contenido del acumulador y el registro de


banderas con el contenido de los registros alternativos
correspondientes

EX (SP),IX
EX (SP),IY
EX (SP),HL

Intercambio el contenido de un registro ndice o el registro HL


con el contenido del tope de la pila

EX DE,HL

Intercambio el contenido del registro DE con el contenido del


registro HL

La subrutina consiste en un grupo de instrucciones


escritas fuera del programa principal para
desempear una funcin especifica
Las funciones que se realizan repetidamente en el
en el programa principal son candidatas para
subrutinas
Retardos.

Contenido de los registros

SP

EX AF,AF

Subrutinas

Contenido de los registros


H

EXX

DESCRIPCION
Intercambio el contenido de los registros de propsito
general (BC,DE, HL) con el contenido de los registros
alternativos correspondientes

40H

Intercambio

SP

INSTRUCCION

32 H

2097 H

Los retardos pueden ser requeridos en


diferentes partes del programa
Mximo, encontrar el numero mximo dentro de una
secuencia

Contenido de la Pila
2097 H

FF H

2098 H

80 H

2099 H

Subrutina

Subrutina

Cuando una subrutina es llamada, el contenido del


program counter es guardado en el stack y la
ejecuciones transferida a la subrutina
PC

2050H

LD B, C

PC

2051H

CALL DELAY

PC

2054H

CP (HL)

PC

2070H

XOR A
RET

SP

Subrutina
DELAY

20 H
54 H

Cuando la instruccin de regreso de la subrutina es ejecutada,


la direccin previamente guardada en el stack es recuperada.
Continua con la ejecucin del programa principal
2050H

LD B, C

2051H

CALL DELAY

PC

2054H

CP (HL)

PC

2070H

XOR A

PC

2080H

RET

SP

20 H
54 H

Subrutina
DELAY

08/11/2011

Subrutina

Subrutina

19

20

OPCODE

CALL

OPERANDO BYTES DESCRIPCION

16-bits

RET

Llama a la subrutina localizada en la


direccin de memoria especificada por el
operando de 16-bits.
Esta instruccin almacena la direccin de la
siguiente instruccin en la pila y transfiere
la ejecucin del programa a la direccin
de la subrutina

Regresa de la subrutina.
Esta instruccin obtiene la direccin de
regreso del tope de la pila y transfiere la
ejecucin del programa de regreso al
programa que realizo el llamado

OPCODE OPERANDO DESCRIPCION


CALL
Z,16-bits Llama a la subrutina si Z =1
CALL
NZ,16-bits Llama a la subrutina si Z =0
CALL
C,16-bits Llama a la subrutina si CY =1
CALL
NC,16-bits Llama a la subrutina si CY =0
CALL
M,16-bits Llama a la subrutina si S =1 (Negativo)
CALL
P,16-bits Llama a la subrutina si S =0 (Positivo)
CALL
PE,16-bits Llama a la subrutina si P/V =1 (Par)
CALL
PO,16-bits Llama a la subrutina si P/V =0 (Impar)

Subrutina

Subrutina

21

22

OPCODE

OPERANDO

RET
RET
RET
RET

Z
NZ
C
NC

RET

RET

RET

PE

RET

PO

DESCRIPCION

Mnemnico

Regresa de la subrutina si Z =1
Regresa de la subrutina si Z =0
Regresa de la subrutina si CY =1
Regresa de la subrutina si CY =0
Regresa de la subrutina si S =1
(Negativo)
Regresa de la subrutina si S =0
(Positivo)
Regresa de la subrutina si P/V =1 (Par)
Regresa de la subrutina si P/V =0
(Impar)

LD SP,1895H

CALL 1850H

Direccin de
Memoria

1893

28

31

1800

1894

18

95

1801

1895

XX

18

1802

CD

1825

50

1826

18

1827

1850

Subrutina

1865

RET

Siguiente Instr.
HALT

Reinicio
23

HEX
CODE

SP

1828
76

1840

Reinicio
24

Esta instruccin transfiere la ejecucin del programa


a una locacin especifica en la pagina 00.
El operando especifica la parta baja de la
direccin
Este tipo de direccionamiento es conocido como
Modo de Direccionamiento Modificado de la
Pagina Cero.
Ninguna Bandera es afectada

OPCODE

RST
RST
RST
RST
RST
RST
RST
RST

OPERANDO

00H
08H
10H
18H
20H
28H
30H
38H

DESCRIPCION

Esta instruccin transfiere la ejecucin del


programa a una locacin especifica en la
pagina 00H.
El operando especifica la parta baja de
la direccin
Este tipo de direccionamiento es conocido
como Modo de Direccionamiento
Modificado de la Pagina Cero.
Ninguna Bandera es afectada

08/11/2011

Ejemplo

Ejemplo

Seales

Tiempo

Verde

D0

15 segundos

Amarilla

D2

5 segundos

Roja

D4

20 segundos

Caminar

D6

15 segundos

No Caminar

D7

25 segundos

PUSH DE

D5

D4

D3

D2

D1

D0

(15)

41H

84H

90H

15

Bits

(5)
20
(20)
40

; Esta subrutina realiza un retardo de 0.5 seg. El retardo es repetido el


; numero de veces indicado en B.
; Entrada: Numero de veces a repetir el retardo especificado en B
; Salida: Ninguna
; Registros Modificados: B

DELAY:

D6

Hex
Code

Subrutina Retardo
27

D7

Verde

Secuencia de
tiempo en
segundos

Rojo

El siguiente programa realiza el control de un semforo y dos


seales para peatones
El flujo del trafico y de los peatones es en la misma direccin.
Por lo tanto, los peatones pueden cruzar solo si la luz verde
esta encendida
Las seales son encendidas y apagadas por los siguientes bits

Caminar

Amarillo

26

No
Caminar

25

Ejemplo
28

START:

; guarda el contenido de DE y AF

PUSH AF
; Carga DE para realizar el retardo 0.5 seg

LD

SP,STACK

; Inicializa el Stack Pointer

LD

A,01000001B

; Carga el patron de bits para encender el verde

OUT (PORT1), A

; Enciende las senales apropiadas

LD

; Realiza el retardo de 15 seg por medio

B,30

WAIT:

LD

DE, COUNT

LOOP:

DEC

DE

LD

A,D

; Coloca D en A para checar banderas

OUT (PORT1), A

; Enciende las luces

OR

; Prende bandera del cero si D=E=0

LD

; Realiza el retardo de 5 segundos

JP

NZ,LOOP

; Repite hasta si DE >0

CALL DELAY

DEC

; Decrementa B

LD

; Carga el patron correspondiente a la luz roja

JR

NZ,WAIT

; Si el retardo es suficiente termina

OUT (PORT1), A

; enciende las senales correspondientes

POP

AF

; Restablece el valor de DE y AF

LD

; realiza el retardo de 20 segundos

POP

DE

CALL DELAY

; de la subrutina DELAY

LD

; Carga el patron correspondiente a la luz amarilla

A,10000100B
B,10
A,10010000B
B,40

CALL DELAY

RET

JP

Multiples llamado a subrutina

START

; Inicia el proceso nuevamente

Subrutinas Anidadas

29

30

Direccin

Programa
Principal

Direccin

XX00
Direccin

01

09

XX50

PUSH AF

CALL DELAY

DELAY

CALL DELAY

Direccin

Subrutina

Subrutina 1

2090

PUSH DE

0C

12

Programa
Principal

2000

Direccin

Subrutina 2

20C2

2050

CALL

209A

CALL

2051

90

209B

C2

209B

2052

20

209C

20

209C

209D

209A

209D

15

1B
1E

POP AF

CALL DELAY

RET

RET

POP DE
61

RET

08/11/2011

Ejemplo

BCD a 7 segmentos

31

32

Este programa implementa un contador de BCD


La cuenta es desplegada en un LED de 7 segmentos
El programa realiza las siguientes acciones

w3 w2 w1 w0
0
0
0
0
0
0
0
0
1
1

Ajusta

el numero binario a un numero decimal por


medio de la instruccin DAA
Busca dentro de una tabla el cdigo asociado a los
siete segmentos
Utiliza diversas subrutinas

b
g

7-segment display

0
0
0
0
1
1
1
1
0
0

0
0
1
1
0
0
1
1
0
0

0
1
0
1
0
1
0
1
0
1

1
0
1
1
0
1
1
1
1
1

1
1
1
1
1
0
0
1
1
1

1
1
0
1
1
1
1
1
1
1

1
0
1
1
0
1
1
0
1
1

1
0
1
0
0
0
1
0
1
0

1
0
0
0
1
1
1
0
1
1

0
0
1
1
1
1
1
0
1
1

Look-up Table

DAA

Contador BCD

33

34

(DAA) Decimal Adjust Accumulator


Despus de una operacin aritmtica, esta
instruccin ajusta un numero de 8 bits en el
acumulador en un numero empaquetado BCD
Esta instruccin usa las banderas H (Half Carry) y
CY (Carry) internamente para ajustar el resultado a
dos dgitos BCD
Ajusta el resultado de un suma o resta BCD
No convierte un numero binario a BCD

UPDATE: ; Esta subrutina actualiza la cuenta BCD y ajusta el numero BCD. Cuando el
; contador llegue a 60, reinicia el contador
; Entrada: Cuenta en B
; Salida: Cuenta actualizada y ajustada a BCD en B
; Registros Modificados: B y el acumulador
LD

DELAY:

; Esta subrutina realiza un retardo de 1 seg.


; Entrada/Salida: Ninguna
; Registros Modificados: Ninguno
PUSH DE

; Actualiza la cuenta

DAA

; Ajusta el numero a BCD

LD

B,A

; Guarda la cuenta en B

CP

60

; Es la cuenta = 60

RET NZ

; Si no lo es regresa al programa principal

LD

; Reinicia el contador

B,00H

Despliega digtos BCD en 7 segmentos


36

Codigo BCD
Empaquetado

; guarda el contenido de DE, BC y AF

PUSH AF
PUSH BC
B,10

WAIT:

LD

DE, COUNT

LOOP:

DEC

DE

LD

A,D

; Coloca D en A para checar banderas

OR

; Prende bandera del cero si D=E=0

JP

NZ,LOOP

; Repite hasta si DE >0

DEC

; Decrementa B

JR

NZ,WAIT

; Si el retardo es suficiente termina

POP

BC

POP

DE

POP

AF

RET

LD

; Carga DE para realizar el retardo 100 s

; obtiene la ultima cuenta

RET

Retardo
35

A,B

ADD A,01H

Obtener la parte baja


AND

Cdigo
5

Obtener la parte alta

2000

7E H

2001

30 H

2002

6D H

2003

79 H

2004

33 H

2005

5B H

0001 0101

0000 1111

0001

0101

SRL A

0000

1010

2006

5F H

SRL A

0000

0101

2007

70 H

SRL A

0000

0010

2008

7F H

0001

7B H

SRL A

0000

2009

; Restablece el valor de DE y AF

08/11/2011

Desempaqueta

Despliega digtos BCD en 7 segmentos


37

38

Cdigo BCD
Empaquetado
BCD
desempaquetado

01

L 00

01

2000

7E H

HL +1

2001

30 H

2002

6D H

AND 0FH

; Enmascara la parte alta

2003

79 H

LD

(HL),A

; Almacena el digito menos significativo

2004

33 H

INC

HL

; Incrementa el apuntador

2005

5B H

LD

A,B

; Obtiene el numero BCD empaquetado

2006

5F H

SRL

; Shift el digito mas significativo a la parte

2007

70 H

SRL

; baja del acumulador

2008

7F H

SRL

2009

7B H

SRL

HL + 5

L 01

05

HL

2000

H 20 00 L

L 00

; Esta subrutina desempaqueta el numero BCD almacenado en el acumulador


; y los almacena en direcciones continuas empezando en BUFF
; Entrada: Numero BCD empaquetado en B
; Salida: BCD1 y BCD2 en el buffer BUFF
; Registros Modificados: Acumulador, HL

Codigo
05

HL

UNPACK:

HL

L 05

HL

2001
2005

LD

HL, BUFF1

; apunta HL al buffer BUFF

LD

A, B

; Obtiene el numero en BCD empaquetado

LD

(HL), A

; Almacena el digito mas significativo

RET

Bsqueda

Despliega

39

40

LOOKUP:

; Esta subrutina toma un digito BCD desempaquetado, actualiza el


; apuntador y obtiene el cdigo correspondiente
; Entrada: Digito BCD Desempaquetado en el acumulador
; Salida: Cdigo de 7-segmentos en el acumulador
; Registros Modificados: Acumulador

DISPLAY:

PUSH HL

; guarda el contenido de HL

LD

HL,CODE

; apunto a la tabla del cdigo 7-segmentos

; Esta obtiene digitos BCD del buffer de salida, llama a la subrutina


; LOOKUP y despliega el digito al puerto de salida apropiado
; Entrada: Apuntador al buffer en HL
; Salida: Ninguna
; Registros Modificados: HL
; Subrutinas llamadas: LOOKUP

ADD

A,L

; Suma al apuntador el digito a ser desplegado

LD

LD

L,A

; Actualiza el apuntador

CALL LOOKUP

; Obtiene el cdigo 7-segmentos

LD

A, (HL)

; Obtn el cdigo

OUT

(PORT2), A

; Despliega el cdigo

POP

HL

; Restablece HL

DEC

HL

; Decrementa el apuntador

LD

A, (HL)

; Obtiene el segundo digito

RET
CODE:

A,(HL)

CALL LOOKUP

; Obtiene el cdigo 7-segmentos


; Despliega el cdigo

DEFB

7EH, 30H, 6DH, 79H

; Cdigo para 0, 1, 2, 3

OUT

DEFB

33H, 5BH, 5FH, 70H

; 4, 5, 6, 7

RET

DEFB

7FH, 7BH

; 8, 9

Programa Principal
41

; Obtiene el segundo digito

(PORT1), A

Ejercicio
42

STACK:

EQU 1900H

BUFF:

EQU 1901H

ORG 1800H

MAIN:
NEXT:

LD

SP, STACK

; Inicializa el stack

LD

B, 00H

; Inicializa el contador a 00H

CALL UNPACK

; Desempaqueta el numero BCD y almacena en BUFF

CALL DISPLAY

; Despliega los dgitos BCD en el puerto apropiado

CALL DELAY

; Espera por 1 segundo

CALL UPDATE

; Actualiza la cuenta

JP

; continua

NEXT

Escriba un programa que realice la conversin de un nmero


en BCD a binario
Use la subrutina unpack para desempaquetar el nmero
Escriba una subrutina que realice la conversin de BCD a
binario.
Escriba el programa principal
1
0001

0000

1100

0010
00000001
00000010

10

00001010

00001100

00000010

08/11/2011

BCD a Binario
BCDBIN:
43

; Esta subrutina convierte un numero desempaquetado BCD en binario


; El digito menos significativo esta en BUFF y el mas significativo en BUFF+1
; Entrada: Numero BCD desempaquetado en BUFF y BUFF+1
; Salida: Numero binario en el acumulador A
; Registros Modificados: HL, A

Hitachi HD44780
44

PUSH DE

SUM:

LD

HL,BUFF

INC

HL

LD

D,(HL)

LD

E,10

XOR

ADD

A,D

DEC

JR

NZ,SUM

DEC

HL

ADD

A,(HL)

POP

DE

Pantalla de Cristal
Liquido LCDII con
controlador incluido
HDD44780
Esta pantalla tiene una
variedad de
configuraciones como
son 8X1 (8 caracteres
por 1 rengln), 16X2,
20X2,20X4

RET

Configuracin de Terminales

Rutina de Inicializacin

45

46

1.
2.
3.
4.

5.

6.

Ground
VCC (+3.3 to +5V)
Contrast adjustment (VO)
Register Select (RS). RS=0:
Command, RS=1: Data
Read/Write (R/W).
R/W=0: Write, R/W=1:
Read
Clock (Enable). Falling
edge triggered

7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

Bit 0 (Not used in 4-bit operation)


Bit 1 (Not used in 4-bit operation)
Bit 2 (Not used in 4-bit operation)
Bit 3 (Not used in 4-bit operation)
Bit 4
Bit 5
Bit 6
Bit 7
Backlight Anode (+)
Backlight Cathode (-)

Comunicndose con LCD

Encender
LCD

Esperar 1.5 ms
despus de que
Vdd llega a 4.5V

Enviar
cdigo de
INICIO

00011XXXX

Repetir
cdigo de
INICIO

Esperar por mas


de 4.1 ms

Repetir
cdigo de
INICIO

El cdigo de inicio
indica que la
interfaz se
establece a 8 bits

Esperar 100s

Inicializar
LCD

Apagar y prender
el display

Limpiar pantalla

BF no puede
probarse en este
punto

Establecer modo
de Escritura

Instrucciones

47

48

LCD tiene un bus de


datos de 8 bits (pin 714) por el cual se
transfiere el cdigo
ASCII a escribirse
Se utilizan 3 seales de
control:
Seleccin de Registro
(RS)
Escritura/Lectura (R/W)
Habilitacin de Reloj
(CE)

1.
2.
3.

RS=0: Instruccin, RS=1: Dato


R/W=0: Escritura, R/W=1: Lectura
CE = 1 habilita, CE = 0, deshabilitado
Seleccin
de Registro

RS = 0,
setup

Escritura

RW = 1

Habilita
intercambio

CE = 1

Envi de
datos

Envi de
cdigo
ASCII

Deshabilita
Intercambio

CE = 0

RS = 1,
dato

R/S R/W D7 D6 D5 D4 D3 D2 D1 D0 INSTRUCTION


4

14

13

12

11

10

7 PINS

1 Limpia pantalla

ID

Regresa el cursor al inicio de la


pantalla
Indica la direccin de movimiento del
S
cursor
B Habilita el display/cursor

SC

RL

* Mueve el cursor/ Corre el display

DL

* Establece la longitud del display

Escribe un caracter en la posicin actual


del cursor
Lee el caracter en la posicin actual del
D
cursor

08/11/2011

Interfaz
49

Вам также может понравиться