Vous êtes sur la page 1sur 15

Alrededor de los Microcontroladores

Capitulo 6. Pilas

PILAS

La pila (stack) es un grupo de posiciones de memoria para almacenamiento


generalmente temporal en el cual el dato puede ser almacenado y retirado despus. En
ese sentido, la pila es algo as como una memoria. La diferencia entre la pila y otras
formas de memoria es el mtodo de acceso del dato, siendo este una ventaja
comparativa importante. Comentaremos ahora, la Pila en Cascada (MPU) y la Pila en
Memoria (RAM).
6.1 Pila en Cascada (MPU)
Algunos microprocesadores tienen un grupo especial de registros ( usualmente 8 16 )
llamado Pila en Cascada como parte del MPU. Entonces el tamao de pila es pequeo y
puede perderse informacin s es que se apila ms datos de la capacidad de pila, aqu la
pila no puede ser definido por el usuario.
Recuerde que cuando un dato (un byte) es almacenado en memoria, una direccin es
requerida.

Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

MPU
------------------------------------------------------------------------------------------ACC

Cabecera de Pila

Pila de 8 Registros

PILA EN CASCADA.

Esto es, para almacenar el contenido del acumulador en memoria se requieren


instrucciones de 2 3 bytes. Dependiendo del modo de direccionamiento, el ltimo o
los dos ltimos bytes representan la direccin. Despus, si el dato es devuelto, otra
instruccin es requerida que tambin tiene una direccin. Una ventaja es que el dato
puede ser almacenado dentro de la pila y ledo de la pila con instrucciones de un byte.
Esto es, las instrucciones usadas con la pila no necesitan direccin.
En la pila en cascada, todos los datos son cargados y retirados simultneamente por
transferencia entre el acumulador y la cabecera de la pila. Esto es, el acumulador se
comunica solamente con la cabecera de la pila. El dato es transferido a la pila por una
instruccin especial llamada PUSH.
Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

8.2 Apilando y desapilando la Pila en Cascada


Apilando en la Pila en Cascada
Supongamos que se tiene el nmero $01 en el acumulador y deseamos almacenarlo
temporalmente en la pila. Mientras almacenar este dato en memoria, requerira 2 3
bytes para la instruccin, en lugar de eso, usamos la instruccin PUSH para ubicar este
nmero en la pila. Note que en el caso A, el nmero permanece all hasta que lo
retiremos o hasta que coloquemos otro byte dentro de la pila. En el caso B se muestra lo
que sucede s, un tiempo despus, ponemos otro byte dentro de la pila. El acumulador
ahora contiene $03. Si la instruccin PUSH es ejecutada, el contenido del acumulador
es colocado en la cabecera de la pila y el nmero original $01 es colocado ms adentro.

ACUMULADOR

ACUMULADOR

$ 01

ACUMULADOR

$ 03

ACUMULADOR

$ 07

$ 09

$ 01

$ 03

$ 07

$ 09

$ 01

$ 03

$ 07

$ 01

$ 03
$ 01

APILANDO DATOS HACIA LA PILA EN CASCADA.


En los casos C y D, dos datos estn siendo apilados dentro de la pila. Cada dato nuevo
es colocado en la cabecera de la pila y el dato antiguo es cargado ms adentro de la
pila. Este arreglo es frecuentemente llamado pila en cascada o pila Push Down.
Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

Desapilando de la Pila en Cascada


El MPU retira datos de la pila (desapila) mediante el uso de la instruccin PULL. La
figura siguiente muestra como el dato es retirado de la pila. En el caso A, la pila aparece
despus de la ltima operacin PUSH. Note que l contiene 4 bytes de datos y el ltimo
byte de dato que fue almacenado est en la cabecera de la pila. La instruccin PULL
retira el byte que est en la cabecera de la pila . Como este byte es retirado de la pila,
todos los otros bytes se mueven hacia arriba llenando el espacio dejado por ese byte.
En el caso B, el dato $09 es retirado de la pila y $07 est ahora en la cabecera de la pila.
En el caso C y D, se muestran como los prximos bytes pueden ser desapilados, en cada
caso los bytes restantes se mueven hacia arriba dentro de la pila, llenando el registro
vaco debido al byte removido. Si se compara ambas instrucciones notar que el dato
debe ser retirado de la pila en orden inverso. Esto es, el ltimo byte almacenado en la
pila, es el primer byte que es retirado de la pila.

ACUMULADOR

ACUMULADOR

ACUMULADOR

ACUMULADOR

$ 09

$ 07

$ 03

$ 09

$ 07

$ 03

$ 01

$ 07

$ 03

$ 01

$ 03

$ 01

$ 01

DESAPILANDO DATOS DESDE LA PILA EN CASCADA


Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

6.3 Pila en Memoria (RAM)


Si bien es cierto la pila en cascada

es til,

ella tiene algunas limitaciones que

comentaremos. Como el tamao de la pila en cascada es limitado, s ms de 8( 16


bytes) datos son almacenados dentro de la pila , los bytes ms antiguos se perdern.
Entonces, cuando un byte es retirado de la pila en cascada, ya no existe ms dentro de la
pila. Esto es fundamentalmente diferente de leer un byte de la memoria del sistema.
Debido a estas limitaciones, el MCU no usa la pila en cascada. En lugar de ello, una
zona de la memoria RAM debe reservarse para la pila. Esto tiene sus ventajas.
Se puede habilitar ms de una pila y el tamao puede ser mayor; adems se tiene la
posibilidad de acceder a los datos de la pila usando cualquiera de las instrucciones que
traten con memoria.
6.4 Puntero de Pila (Stack Pointer)
El MCU tiene un registro de 16 bits llamado SP puntero de pila (stack pointer) , el cual
define o seala la direccin de una posicin de memoria que representa la Cabecera de
la pila.
La pila en cascada no requiere de un puntero de pila, puesto que la cabecera de la pila
es determinado por hardware. Durante las operaciones de apilamiento PUSH y
desapilamiento PULL, los datos presentes se mueven de un registro a otro. Esto es, la
cabecera de la pila permanece estacionaria y el dato se mueve hacia arriba o hacia abajo
en relacin a la pila .
En la Pila en RAM, el dato no puede ser transferido fcilmente de una posicin a la
siguiente. En lugar de mover los datos hacia arriba o abajo con relacin a la pila, es
mucho ms fcil mover el puntero de la pila con respecto a la pila.
Entonces, cuando se plantea el sistema, una parte de la memoria RAM es reservada para
la pila. Este bloque de memoria asignado para la pila no debe ser usado para ningn
otro propsito. Se recomienda usar las direcciones de memoria de usuario ms alta para
la pila.
Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

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

APILANDO DATOS HACIA LA PILA EN RAM .

$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

DESAPILANDO DATOS DESDE LA PILA EN RAM.

Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

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

RAM Y REGISTROS ANTES DE LA INSTRUCCIN PSHA.


Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

MPU

Capitulo 6. Pilas

BUS

RAM

SP $090F
A

$AA

$ AA

$090E
$090F cabecera de la pila
$0910
$0911
$0912

RAM Y REGISTROS DESPUS DE LA INSTRUCCIN PSHA

Esto quiere decir que el contenido del acumulador A es transferido a la posicin de


memoria especificada por el puntero de la pila. Tambin, el contenido del puntero de
pila es reemplazado por el contenido previo menos 1. En otras palabras, despus que
ocurre la transferencia del acumulador A a la pila, el puntero de pila es decrementado
en uno. Las operaciones realizadas en el apilamiento del acumulador A son:
Inicialmente: Acumulador A (MPU) Pila (RAM) y en seguida: SP = SP 1.
Asuma ahora que el MPU ejecuta la instruccin PSHB, la cual es ilustrada en la figura
siguiente. Antes que la instruccin PSHB sea ejecutada, el acumulador B contiene $BB
y el puntero de la pila est todava apuntando a la direccin $090F. Cuando PSHB es
ejecutada, el contenido del acumulador B es almacenado dentro de la pila y el puntero
de la pila es decrementado en 1 (direccin $090E). La ejecucin de las instrucciones
PSHX y PSHY es similar a la instruccin de almacenamiento del acumulador en la pila,
excepto que ahora los contenidos de los registros ndice son almacenados en la pila.

Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

MPU
SP

$090F

$BB

Capitulo 6. Pilas

BUS

RAM

$090E
$090F
$ AA

cabecera de la pila

$0910
$0911
$0912

RAM Y REGISTROS ANTES DE LA INSTRUCCIN PSHB.

MPU

BUS

RAM

SP $090E
B

$ BB

$ 090E
$ BB

$ 090F

$ AA

$ 0910

cabecera de la pila

$ 0911
$ 0912

RAM Y REGISTROS DESPUS DE LA INSTRUCCIN PSHB.

Pontificia Universidad Catlica del Per

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

Cuando PSHX o PSHY es ejecutado, primero el byte de menor peso es almacenado


dentro de la pila (en la direccin contenida en el puntero de pila). El puntero de pila es
entonces decrementado en 2 ( los registros ndice son de 16 bits). Las operaciones
realizadas en el apilamiento de los registros ndice son:
Inicialmente: Registro Indice (MPU)

Pila (RAM) y enseguida: SP = SP - 2

Desapilando la Pila en Memoria


Los datos pueden ser retirados o desapilados de la pila y ubicados en cualquier
acumulador ( A o B) o en cualquier registro ndice ( IX o IY ). La instruccin PULA
permite al microprocesador retirar el dato de la pila para cargar el acumulador A.
Mientras que la instruccin PULB opera en forma similar excepto que los datos van
hacia el acumulador B.
En cada caso, el dato es cargado desde una posicin de memoria cuya direccin es el
puntero de la pila. El dato que utiliza el MPU es el ltimo byte que fue ubicado en la
pila. La figura adjunta muestra lo que sucede cuando la instruccin PULA es ejecutada.
Primero, la cabecera de la pila es automticamente incrementado en 1 (SP +1) es decir
$090F. Luego, el contenido de la posicin de memoria sealado por el puntero de pila es
transferido al acumulador A. Es decir, $BB se carga al acumulador A.
El puntero de la pila es incrementado antes de que el byte sea retirado de la pila.
Considere que sucede si la instruccin PULB es ahora, ejecutada. La figura muestra
que el puntero de la pila es automticamente incrementado a $0910 (SP +1). El
contenido de esa posicin es entonces devuelto al acumulador B. Luego, las operaciones
realizadas en el desapilamiento son:
Inicialmente: SP = SP + 1 y enseguida: Acumulador B (MPU)

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

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

puntero de pila ms uno. Entonces, la cabecera de la pila es incrementada en 2 para


cargar el byte de menor peso (IXl). Las operaciones realizadas en el desapilamiento de
los registros ndice son:
Inicialmente: SP = SP + 2 y enseguida: Registro Indice IX(MPU)

Pila (RAM).

La figura adjunta muestra la transferencia de datos entre registros y memoria usando


instrucciones de apilamiento y desapilamiento. Se puede observar tambin la variacin
del registro SP puntero de la pila.

MPU

BUS

RAM

SP $ 090E
A

$090E
$BB

$090F

$AA

$0910

SP $090F

puntero de la pila

PULA ; ejecutado

$ BB
A

Pontificia Universidad Catlica del Per

$ BB

$ 090F Cabecera de la pila

$ AA

$ 0910

11

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

SP $ 0910
$BB

$AA

PULB

;ejecutado

$ BB

$ 090F

$ AA

$ 0910 puntero de la pila

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

Asuma que A = $AA y el acumulador B = $BB. La primera instruccin almacena en la


pila $AA. Luego $BB es colocado dentro de la pila. La tercera instruccin retira $BB de
la cabecera de la pila y lo ubica dentro del acumulador A. Finalmente, la ltima
instruccin retira $AA desde la pila y lo ubica en el acumulador B. Los contenidos de
los acumuladores se han cambiado entre s.
Ejemplo 6.2: El siguiente segmento de programa hace lo mismo qu en el caso anterior
pero con una instruccin menos:
Pontificia Universidad Catlica del Per

12

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

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

y considere ahora el siguiente segmento de programa:


LDS

#$0910;

LDD #$51C2;
LDX #$0500;
PSHB

PSHX

PULA

PULY

Muestre la variacin de los registros despus de la ejecucin de cada instruccin y los


contenidos de la memoria :
Despus de ejecutar: LDS

#$0910 ; SP= $0910,

LDD #$51C2; $51

A y $C2

LDX #$0500;

IXh y $00

IXl

$05

PSHB

; $C2 ($0910), SP = $090F

PSHX

$00 ($090F), SP = $090E

$05 ($090E), SP = $090D

PULA

SP = $090E,

PULY

SP = $090F,

($090F ) IYh

SP = $0910 ,

($0910) IYl

Pontificia Universidad Catlica del Per

13

$05 A

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

Capitulo 6. Pilas

Luego, los contenidos finales de la memoria son:


$090E 05

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.

Pontificia Universidad Catlica del Per

14

Jos A. Dvalos Pinto

Alrededor de los Microcontroladores

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

#$0900; definir el puntero.

LDAA

$0531 ; consigue el dato1.

TAB

; A =B

MUL

; cuadrado. dato1*dato1

ADCA

#$00 ; redondeo a 8 bits.

PSHA
LDAA

$0532 ; consigue el dato2

TAB

; A =B

MUL

; cuadrado. dato2*dato2

ADCA

PARA

; guarda el resultado

#$00 ; redondeo a 8 bits.

PULB

; retira el primer resultado.

ABA

; suma

BRA

PARA ; detener el programa.

Se supone que los datos estn escalados de 0 a 1. Por ejemplo, un resultado en el


acumulador A = $1C representa el valor 0,1094 en el rango de 0 a 1. El resultado con
aritmtica entera en 8 bits es impreciso.

Pontificia Universidad Catlica del Per

15

Jos A. Dvalos Pinto

Vous aimerez peut-être aussi