Está en la página 1de 1

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!

También podría gustarte