Ahora que tenemos las nociones básicas sobre qué es y cómo
funciona la memoria de un ordenador, vamos a dar un paso adelante
para estudiar cómo funcionan los programas en memoria. En particular, aquí nos enfocamos en cómo los programas usan la pila. En primer lugar, es necesario comprender el concepto de "cambio de contexto". Se realiza un cambio de contexto cuando un programa se mueve de una función a otra. En el ejemplo propuesto, la función "sumar" se llama desde la función "main". Luego, cuando se ejecuta la función "sumar", se produce un cambio de contexto. Antes de presentar cómo funciona la pila, se deben recordar dos conceptos. En primer lugar, recuerda que la pila almacena variables temporales de tamaño limitado cuando se ejecutan los programas. En segundo lugar, recuerda que un programa se divide en diferentes instrucciones y se almacenan en diferentes direcciones de memoria. Con estos conceptos en mente, vamos a explicar el contenido de la pila. Cada función tiene una parte privada de la pila. Esta está delimitada por dos punteros: EBP, que apunta a la base, y ESP que apunta a la parte superior de la pila. Al principio, en las direcciones altas de la memoria se encuentran los argumentos. Posteriormente, cuando se realiza un cambio de contexto, se almacenan el EIP y el EBP almacenado. El EIP se refiere al contador de programa, es decir, al registro que almacena la dirección de la siguiente instrucción que se ejecutará. El EBP almacenado se refiere a la dirección de memoria del EBP antes del cambio de contexto. Luego, ambos valores se restauran después de realizar el cambio de contexto, es decir, cuando finaliza la función llamada. El almacenamiento de ambos elementos es esencial para continuar ejecutando el código después de finalizar ese cambio de contexto. Se necesita EIP porque tenemos que saber qué instrucción de programa se debe ejecutar a continuación, es decir, el punto en el que se encontraba el programa antes de llamar a la función. Y dos, se necesita EBP almacenado para volver a la parte de la pila de la función que se ha llamado. Tratando de entender más claramente cómo funciona la pila, vamos a ver un ejemplo. En este programa en C que tiene una función principal en la que se llama a otra función, "sumar", y se proporcionan un par de parámetros para esta función. Suponemos que esta función "sumar" comienza a ejecutarse, en la línea 6 la pila se ve como en la imagen. En la parte superior de la pila se almacenan los argumentos de la función "sumar" (recuerda, en orden inverso, primero a y segundo b). Luego, se ubican EIP y EBP almacenado. En este momento, EBP y ESP apuntan a la base y la parte superior de la pila, respectivamente, de la función principal, la función "main". Ahora, suponemos que la línea 3 se está ejecutando y el estado de la pila se presenta en la imagen. La variable "c" se almacena en el registro eax y EBP y ESP apuntan a la base y a la parte superior de la pila, respectivamente, de la función "sumar". Cuando finaliza la función "sumar", es obligatorio volver a la función principal, a la función "main". Para hacerlo, el EIP guardado, almacenado, informa sobre la siguiente instrucción de programa a ejecutar (línea 6) y el EBP almacenado informa sobre la ubicación de la memoria de la base de la pila para la función "main". Por último, el programa termina. Con este pequeño ejemplo, se muestra que el proceso de cambio de contexto podría anidarse tantas veces como sea necesario. ¡Ahora está claro por qué la pila necesita crecer!