User: alciro    User
 

Microcontroladores 8051

Share |

5.3. Stack o pila

Stack o pila es una estructura de datos con acceso del tipo LIFO (Last In First Out), último en entrar, primero en salir. Como similitud se puede asociar a un almacenamiento de libros formando una pila, en la que se almacenan uno sobre otro, los nuevos elementos se apilan sobre el último, y cunado se retiran se extrae el último que se ha apilado.

Este tipo de estructura de datos es fácil de desarrollar por los sistemas microprocesadores y resulta de gran utilidad para trabajar con listas de datos y es imprescindible para el trabajo interno del microprocesador en las subrutinas e interrupciones.

Algunos microprocesadores pueden tener el Stack en su interior, representando un sistema muy rápido pero de tamaño limitado, la mayoría de microprocesadores disponen el stack en la memoria externa, hecho que proporciona una gran capacidad de almacenamiento y el control de su ubicación, aunque el acceso sea más lento.

5.3.1. Puntero de la pila (stack pointer)

El puntero del stack SP (stack pointer) como su propio nombre indica es un registro apuntador a la posición de memoria donde se encuentra la pila. En la familia 8051 el registro SP se encuentra en la zona de memoria SFR 81H.

Al realizar un reset el registro SP se pone de forma automática con el valor 07H, por lo que la pila se establece por defecto en la posición 08H, zona que es utilizada por los bancos de registros. Es recomendable cambiar la pila a otra zona de memoria, por ejemplo a la posición 30H (fuera de la zona de registros). Para situar el puntero del stack se pone como primera instrucción del programa:

MOV SP,#2FH ; Situar el puntero del stack en la posición 30H

 

Puntero de la pila (stack pointer)

5.3.2. PUSH

La instrucción PUSH, sitúa en la pila el contenido de la dirección indicada, primero se incremente el puntero de la pila y acto seguido el contenido de la dirección se copia en la RAM que indica el apuntador de la pila SP.

Instrucción PUSH Dir


 (SP) = (SP)+1  Incrementa el puntero del Stack a la siguiente posición

 ((SP)) = (Dirección)
 Situar en la pila (dirección apuntada por SP) el contenido de la dirección

Ejemplo:

MOV A,#3 ; Cargar el acumulador con la constante 3
MOV B,#5 ; Cargar el registro B con la constante 5
...
...
PUSH A ; Situar en el Stack el contenido del Acumulador
PUSH B ; Situar en el Stack el contenido del registro B

Instrucción PUSH

5.3.3. POP

La instrucción POP, lee el contenido de la dirección de la pila que índica el SP (apuntador del stack) y lo sitúa en la dirección especificada, después decrementa el apuntador de la pila SP dejándolo en la posición anterior.

Instrucción POP Dir


 (Dirección) = ((SP))
 Recupera en la dirección indicada el contenido de la pila (apuntado por SP)

 (SP) = (SP)-1 Decrementa el puntero del Stack a la posición anterior

Se ha de tener en cuenta que por el propio funcionamiento de la pila, el último dato que se ha introducido ha de ser el primero en recuperarse, si nos centramos en el ejemplo anterior, se ha puesto en la pila el contenido del registro A y después el B, a la hora de recuperar los datos se ha de hacer en orden inverso al introducido, primero el B y después el A.

Ejemplo:

...
...
POP B ; Recupera en el registro B el contenido del Stack
POP A ; Recupera en el acumulador el contenido del Stack

Instrucción POP
Loading

copyright © 2007-2024  www.alciro.org  All rights reserved.         
Share |