La pila es un grupo de localizaciones de memoria que se reservan para tener espacio de almacenamiento temporal cuando el programa se ejecuta, según Mosquera H. (2013) “las pilas son definidas como un tipo de estructuras de datos lineal condicionadas, compuestas de elementos del mismo tipo donde las inserciones y eliminaciones se realizan por un mismo extremo, el extremo superior de la pila, que también se le conoce como Cima o Tope.
Se considera como un grupo ordenado de elementos clasificados de acuerdo al tiempo en que han sido insertados o almacenados en la pila, el elemento que se elimina de la cabeza es siempre el que lleve menos tiempo en ella. En resumen una pila es una lista en la cual los elementos solo pueden ser insertados y eliminados por un único extremo.” Siendo que estos se utilicen de gran manera para invertir el orden de datos, reservar datos fuera de registros y demas.
En ensamblador existen dos intrucciones vitales para la manipulacion de la pila, esta siendo PUSH y POP.
PUSH es la instrucción que permite almacenar el contenido del operando dentro de la ultima posicion de la pila. Ejemplo: PUSH R1 El valor contenido en r1 es almacenado en el ultimo espacio de la pila, esto pudiendose hacer de forma repetida agregando mas y mas valores a cima.
POP es la instrucción que permite obtener el valor contenido en el ultimo espacio de la pila, almacenandolo en el regitro designado. Ejemplo: POP R2 El valor que estaba contenido de ultimo en la pila pasa a R2, siendo que el POP se pueda usar repetidas veces para extraer uno por uno los valores de la pila.
La pila se puede utilizar de otras maneras, como la conserva de un grupo de registros, o la direccion de la ultima etiqueta de la cual saltamos.
Para conservar registros se suele usar la misma intruccion de PUSH y POP pero usando llaves en la intruccion conteniedo los registros que vamos a guardar. Ejemplo: PUSH {r0, r1} estos registros quedarian en la pila y a la hora de usar la instrucción POP {r0, r1} regresarian los valores guardados a los registro de forma respectiva. Esto da chance a guardar los estados de registros especificos y despues modificar los registros, siendo que despues con un POP regresen al estado guardado anteriormente guardado.
La otra funcion mencionada es el regreso a la etiqueta de origen, esto es posible con el salto especial BL (Salto con Enlace) que permite saltar a otra etiqueta guardando la direccion de ese salto en el registro lr (Registro de Enlace), al guardar en la pila esto se puede mantener esta direccion para despues llamarlo con un POP, Ejemplo: PUSH {lr} se guarda la direccion del ultimo salto hecho en la pila desde el registro de enlace, POP {pc} se extrae la direccion de la siguiente instrucción despues del salto de forma que se salte a la linea siguiente del ultimo salto que se realizo. Este uso de la pila es otra forma de retornar de la etiqueta, diferente al metodo de BL y BX.
Dos de estos usos de la pila se pueden utilizar en conjunto, para agilizar el programa creando metodos en las etiquetas para generar valores y retornarlo desde el punto de llamada mediante un registro. Ejemplo: PUSH {r1, r2, lr} guardado estos dos registros junto con la direccion de retorno se realiza operaciones con estos, una vez realizados el resultado se guarda en R0 y se retorna usando PUSH {r1,r2, pc} los estados que tenian r1 y r2 antes de saltar a la etiqueta se renuevan y el resultado se mantiene en el registro R0 para diferentes usos.
Estos usos de la pila maximisan la capacidad del uso de los registros, siendo que estos bajen su rigidez al usarse, esto haciendo que se puedan modificar sin miedo a perder datos guardados que necesitaras usar en otro momento, con todo esto se puede concluir que la pila es un elemento fundamental a la hora de aprender ensamblador ya que sin este programas complejos serian imposibles de realizar.
Referencias
Mosquera, H. (2013, noviembre). Estructuras de datos Lineales/ Pilas. Estructuras De Datos. https://hhmosquera.wordpress.com/estructuras-de-datos-lineales/