Académique Documents
Professionnel Documents
Culture Documents
Capitulo 6. Pilas
PILAS
Capitulo 6. Pilas
MPU
------------------------------------------------------------------------------------------ACC
Cabecera de Pila
Pila de 8 Registros
PILA EN CASCADA.
Capitulo 6. Pilas
ACUMULADOR
ACUMULADOR
$ 01
ACUMULADOR
$ 03
ACUMULADOR
$ 07
$ 09
$ 01
$ 03
$ 07
$ 09
$ 01
$ 03
$ 07
$ 01
$ 03
$ 01
Capitulo 6. Pilas
ACUMULADOR
ACUMULADOR
ACUMULADOR
ACUMULADOR
$ 09
$ 07
$ 03
$ 09
$ 07
$ 03
$ 01
$ 07
$ 03
$ 01
$ 03
$ 01
$ 01
Capitulo 6. Pilas
es til,
Capitulo 6. Pilas
$0000
LDAA
PSHA
LDX
PSHX
Pila
en RAM
# DATA A
# DATA X
SP -3 ( cabecera actual )
SP - 2
SP - 1
SP ( cabecera anterior)
DATA X h
DATA X l
DATA A
DATA 2
DATA 1
DATA 0
$0000
Pila en
RAM
PULX
PULA
SP (cabecera anterior )
SP + 1
SP + 2
----------------------------------------
SP + 3 ( cabecera actual)
DATA Xh
DATA Xl
DATA A
DATA 2
DATA 1
DATA 0
Capitulo 6. Pilas
La cabecera de la pila o puntero de pila es definida cargando una direccin dentro del
registro SP. Supongamos que deseamos establecer como cabecera de la pila la direccin
$0910, entonces la instruccin en lenguaje de ensamblado ser: LDS
#$0910. Esto
carga la direccin $0910 dentro del registro SP y establece esa direccin como la
cabecera de la pila. Sin embargo, como se ver, el puntero de la pila se mueve cada vez
que un dato es almacenado dentro de la pila o retirado fuera de la pila .
6.5 Apilando y Desapilando la Pila en Memoria (RAM)
Apilando en Pila en Memoria
El MCU tiene instrucciones de apilamiento (almacenamiento en la pila desde los
acumuladores o registros ndice) como: PSHA y PSHB, PSHX y PSHY. Lo mismo para
desapilamiento (retirar los datos de la pila hacia los acumuladores o registros ndice) se
tiene las instrucciones: PULA y PULB, PULX y PULY.
La figura adjunta muestra el efecto de la instrucciones PSHA. Antes que la instruccin
sea ejecutada, el puntero de la pila contiene la direccin $0910 como resultado de una
previa instruccin LDS. El acumulador A contiene $AA. Si la instruccin PSHA es
ahora ejecutada, el contenido de A es almacenado dentro de la posicin de memoria
$0910. Entonces, el puntero de la pila es automticamente decrementado a $090F.
MPU
BUS
RAM
SP $0910
A
$AA
$ 090E
$ 090F
$ 0910 cabecera de la pila
$ 0911
$ 0912
MPU
Capitulo 6. Pilas
BUS
RAM
SP $090F
A
$AA
$ AA
$090E
$090F cabecera de la pila
$0910
$0911
$0912
MPU
SP
$090F
$BB
Capitulo 6. Pilas
BUS
RAM
$090E
$090F
$ AA
cabecera de la pila
$0910
$0911
$0912
MPU
BUS
RAM
SP $090E
B
$ BB
$ 090E
$ BB
$ 090F
$ AA
$ 0910
cabecera de la pila
$ 0911
$ 0912
Capitulo 6. Pilas
Pila (RAM)
Las instrucciones PULX y PULY son similares a las instrucciones PULA y PULB, sin
embargo, ahora son dos los datos retirados de la pila; primero, el byte de mayor peso
(IXh) y cargado dentro del registro ndice. Esto empieza en la direccin contenida en el
Pontificia Universidad Catlica del Per
10
Capitulo 6. Pilas
Pila (RAM).
MPU
BUS
RAM
SP $ 090E
A
$090E
$BB
$090F
$AA
$0910
SP $090F
puntero de la pila
PULA ; ejecutado
$ BB
A
$ BB
$ AA
$ 0910
11
Capitulo 6. Pilas
SP $ 0910
$BB
$AA
PULB
;ejecutado
$ BB
$ 090F
$ AA
Las instrucciones con pila PUSH y PULL, pueden usarse, por ejemplo para, guardar
temporalmente datos de los acumuladores y registros, durante operaciones que podran
destruir el contenido de esos registros y recuperarlos despus.
Ejemplo 6.1: Se desean intercambiar los contenidos de los acumuladores A y B usando
pilas.
; instruccin anterior
LDS #$0500 ;
PSHA
PSHB
PULA
PULB
;
; instruccin siguiente
12
Capitulo 6. Pilas
; instruccin anterior
LDS #$0500 ;
PSHA
TBA
PULB
;
; instruccin siguiente
Ejemplo 6.3: Supongamos que la memoria contiene inicialmente los siguientes datos :
$090E 02
14
89
3B
AB
54
8C
D1
10
FF
#$0910;
LDD #$51C2;
LDX #$0500;
PSHB
PSHX
PULA
PULY
A y $C2
LDX #$0500;
IXh y $00
IXl
$05
PSHB
PSHX
PULA
SP = $090E,
PULY
SP = $090F,
($090F ) IYh
SP = $0910 ,
($0910) IYl
13
$05 A
Capitulo 6. Pilas
00
C2
3B
AB
54
8C
D1
10
FF
Ejemplo 6.4: Usando instrucciones que traten con pila copiar los datos ubicados desde
$0510-$051F a $06F0 -$06FF.
ORG
$0400 ;
LDS
#$06FF ;
LDX
#$051F ;
LDAA
$00, X ;
PSHA
DEX
CPX
#$050F ;
BNE
$F7
STOP
;
;
La primera instruccin carga el puntero de pila con $06FF. Esta es la direccin ms alta
de la nueva lista que ser formada. Recuerde que la nueva lista va ha ser escrita en las
posiciones $06F0 - $06FF. Una vez que la posicin $06FF es establecida como la
cabecera de la pila , nosotros podemos ingresar datos simplemente almacenando datos
dentro de la pila. Como el puntero de pila es decrementado con cada operacin PUSH,
los datos ingresaran ordenadamente. La segunda instruccin carga el registro ndice IX
con la direccin ms alta de la lista de datos originales o sea $051F.
Luego, el acumulador A es cargado usando el modo indexado. Puesto que la direccin
Offset es $00, el acumulador A es cargado con el contenido de la direccin $051F,
que es el dato que ocupa la direccin ms alta de la lista original. La instruccin PSHA
entonces almacena el contenido del acumulador A dentro de la pila. Es decir, el dato
ubicado en la posicin ms alta de la lista original es transferido a la posicin de
memoria $06FF. En el proceso, el puntero de pila es automticamente decrementado a
$06FE y el registro ndice IX es decrementado a $051E por la prxima instruccin.
14
Capitulo 6. Pilas
Entonces, la instruccin compara el contenido del registro ndice IX con $000F para ver
si todas los datos de la lista original han sido movidos. Si no coinciden ambas
cantidades, el MPU hace una bifurcacin (Branch) hacia atrs y toma el siguiente dato
de la lista original. El lazo se repite una y otra vez hasta que la lista original haya sido
movida a su nueva posicin.
Ejemplo 6.5: Usando pila sumar los cuadrados de los datos y colocar el resultado en el
acumulador A (redondeo a 8 bits).
ORG
$0400 ;
LDS
LDAA
TAB
; A =B
MUL
; cuadrado. dato1*dato1
ADCA
PSHA
LDAA
TAB
; A =B
MUL
; cuadrado. dato2*dato2
ADCA
PARA
; guarda el resultado
PULB
ABA
; suma
BRA
15