4.3. La pila(2.1.2)

Aparte de los componentes de la arquitectura presentados en las secciones anteriores, la mayor parte de procesadores ofrecen la infraestructura necesaria para manipular una estructura de datos organizada y almacenada en memoria que se denomina “la pila”.

La pila es una zona de la memoria sobre la que se pueden escribir y leer datos de forma convencional. Esta zona tiene una posición especial que se denomina “la cima de la pila”. El procesador contiene dos instrucciones de su lenguaje máquina para realizar las operaciones de “apilar” y “desapilar” datos de la pila. Los datos que se pueden apilar y desapilar, en el caso del Intel Pentium son siempre de tamaño 4 bytes.

4.3.1. Instrucciones de manejo de la pila

La instrucción para apilar un dato en la pila tiene el formato push dato. Es una instrucción con un único operando que deposita el dato especificado como parámetro en la cima de la pila. Supóngase que la cima de la pila está en la posición @cima. La instrucción push dato produce el siguiente efecto.

• Se resta 4 a la dirección de la cima de la pila, se obtiene, por tanto @cima - 4.

• Se escribe el dato de 32 bits dado como único operando en la posición de memoria indicada por @cima - 4 y la dirección de la cima se asigna a este nuevo valor. El dato que estaba previamente almacenado en esas posiciones se ha perdido.

La figura 4.15 muestra la pila antes y después de ejecutar la instrucción push dato. Figura 4.15. Efecto de la instrucción push

De la descripción de la instrucción push se deduce que efectúa una operación de escritura en memoria RAM. Si a continuación de esta instrucción se ejecuta otra del mismo tipo, el dato se almacena a partir de la cuarta posición de memoria antes del último valor depositado en de la pila.

La instrucción pop destino ejecuta el procedimiento complementario al de push dato. Tiene un único operando que, en este caso, especifica el lugar en el que almacenar el dato que se encuentra en la cima de la pila. Supóngase que la cima de la pila está en la posición de memoria @code. La ejecución de la instrucción pop destino tiene el siguiente efecto.

• Se lee el dato de 32 bits almacenado en la posición de memoria indicada por la dirección de la cima @cima y se almacena en el lugar especificado como operando de la instrucción.

• Se suma 4 a la dirección de la cima de la pila, se obtiene, por tanto @cima + 4.

La figura 4.16 muestra la pila antes y después de ejecutar la instrucción pop destino.

Figura 4.16. Efecto de la instrucción pop

Nótese que las instrucciones push y pop tienen estructura y efectos complementarios. La instrucción push recibe como operando el dato a depositar, no es preciso especificar el destino pues se deposita automáticamente en la nueva cima. La instrucción pop, por contra, recibe como parámetro el lugar en el que almacenar el dato obtenido y no es preciso indicar de dónde se obtiene pues se lee automáticamente de la cima de la pila. La instrucción push ajusta la cima restando 4 al valor actual, mientras que pop suma 4 a ese valor. Además, una instrucción realiza una operación de lectura en memoria y la otra una operación de escritura. El dato que la instrucción pop lee de la cima de la pila no desaparece de esa posición de memoria, pues lo único que se hace es leer ese valor. Sí es cierto que la cima de la pila ya no apunta a ese dato, pero este sigue almacenado en la misma posición.

Los destinos posibles que se pueden especificar en la instrucción pop dependen del lenguaje máquina del procesador, pero en el Pentium se permite especificar cualquier registro de propósito general de 32 bits como operando de esta instrucción. Por ejemplo, la instrucción pop edx y ajusta la dirección de la cima.

4.3.2. El puntero de pila

Del funcionamiento de las instrucciones push y pop se deduce que en algún lugar del procesador debe estar almacenada la dirección de la cima de la pila y que dicho valor es modificado por ambas instrucciones. En el caso del Intel Pentium, esta dirección de memoria está guardada por defecto en el registro de propósito general %esp. Las dos últimas letras del nombre de este registro corresponden con las iniciales de las palabras stack pointer o “apuntador de pila”. La primera consecuencia de esta característica del procesador es que, a pesar de que dichos registros están, en principio, disponibles para almacenar valores de forma temporal, el caso de %esp es especial, pues es donde las instrucciones de manipulación de la pila asumen que se encuentra la dirección de la cima. El tamaño de este registro es de 32 bits que coincide con el tamaño de toda dirección de memoria del Intel Pentium.

Si en el instante antes de ejecutar una instrucción push esp contiene el valor v2, tras su ejecución contendrá el valor v2 + 4. La figura 4.17 muestra el efecto de la ejecución de dos instrucciones consecutivas sobre la pila tanto en memoria como en los registros de propósito general.

Figura 4.17. Ejecución de instrucciones de pila

El que la dirección de la pila esté contenida en un registro de propósito general permite que su contenido sea manipulado como cualquier otro registro. Un programa, por tanto, puede leer y escribir cualquier valor de %esp, tan sólo se debe tener en cuenta que el procesador obtiene de ese registro la dirección de memoria necesaria para ejecutar las instrucciones push y pop.

Supóngase que se ha depositado un cierto dato en la pila mediante la instrucción push y que se encuentra, por tanto en la cima. La instrucción pop deposita ese valor en el lugar especificado pero, ¿es posible ejecutar la instrucción pop sin ningún operando?. En otras palabras, la operación que se quiere ejecutar no es la de copiar el dato de la cima, sino simplemente corregir el valor de la cima al igual que haría pop pero sin depositar el dato en ningún lugar. La instrucción pop, por definición, debe incluir un único operando, con lo que no se puede utilizar para hacer esta operación.

La solución se deriva del hecho de que esp. La instrucción ADD $4, esp su valor incrementado en cuatro unidades. El efecto que esta instrucción tiene sobre la pila es el deseado. La siguiente instrucción asume que la cima está en la nueva posición contenida en %esp.

by:lupita y peter


Google