Test Base de Datos
Enviado por Pepito328 • 27 de Abril de 2020 • Apuntes • 1.316 Palabras (6 Páginas) • 108 Visitas
En esta sesión, terminaremos con la comprensión de la gestión del bloque de activación de las subrutinas.
Como ya hemos visto, el bloque de activación de una subrutina está ubicado en memoria y se implementa mediante una estructura tipo pila. El bloque de activación visto hasta ahora se muestra en la siguiente figura:
Un aspecto que influye definitivamente en la eficiencia de los programas que manejan subrutinas y sus respectivos bloques de activación es el modo en el que se accede a la información contenida en los respectivos bloques de activación (el acceso a la memoria en un programa siempre resulta un aspecto clave de cara a la eficiencia del mismo).
El modo más sencillo de acceder un dato en un bloque de activación es utilizando el modo de direccionamiento indexado. Mediante este modo, la dirección de un dato se calcula sumando una dirección base y un desplazamiento. Como dirección base se puede utilizar el contenido del puntero de pila, que apunta a la posición más baja del bloque de activación. El desplazamiento sería entonces la posición relativa del dato con respecto al puntero de pila. Así pues, si sumamos el contenido del registro $sp y un determinado desplazamiento, obtendríamos la dirección de memoria de cualquier dato que se encontrara en el bloque de activación. Como ya hemos visto en sesiones anteriores, si hemos apilado una palabra en la posición 8 por encima del $sp, podríamos recuperar su valor utilizando la instrucción “lw $t0, 8($sp)”. Algunos de vosotros ya habréis detectado que utilizar el registro $sp como registro base para calcular la dirección de los datos tiene un inconveniente: el contenido del registro $sp puede variar durante la ejecución de la subrutina, por lo que habría que variar de manera acorde el desplazamiento necesario para acceder a cada uno de los datos.
Para conseguir que el desplazamiento de cada uno de los datos permanezca constante durante la ejecución de la subrutina, es necesario disponer de una referencia fija al bloque de activación. Dicha referencia puede almacenarse en un registro específico que deberá ser utilizado como dirección base para el cálculo de las direcciones en lugar de $sp.
En ensamblador del MIPS32 existe un registro que cumple esta función: $fp (frame pointer o puntero de marco), que se corresponde con el registro $30 del banco de registros.
Por convenio, se utiliza como referencia fija al bloque de activación la dirección de memoria que indica el registro $sp cuando se entra en la subrutina menos 4. Así pues, cuando se requiera acceder a algún dato apilado por la subrutina, se utilizará un desplazamiento negativo respecto a dicha referencia. Si lo que queremos es acceder a algún dato apilado por el programa invocador justo antes de llamar a la subrutina, se utilizará un desplazamiento positivo respecto a dicha referencia.
Dado que $fp mantiene una referencia fija al bloque de activación de la subrutina en ejecución, el valor de dicho registro debe ser preservado entre llamadas a subrutinas. Esto significa que el valor previo de $fp debe ser apilado por la subrutina para poder restaurarlo antes de devolver el control al programa invocador.
Convenio para llamada a subrutinas:
En las sesiones dedicadas a la gestión de subrutinas (I a IV) hemos desglosado las diferentes acciones necesarias para respetar el convenio de llamada a subrutinas establecido en el ensamblador MIPS32. A continuación haremos un resumen con el objetivo final de recapitular todas las acciones necesarias para invocar correctamente a una subrutina:
Tanto el programa invocador como el invocado intervienen en la creación y gestión del bloque de activación de una subrutina. La gestión del bloque se produce, fundamentalmente en los siguientes momentos:
• Justo antes de que el programa invocador pase el control a la subrutina.
• En el momento en el que la subrutina toma el control.
• Justo antes de que la subrutina devuelva el control al programa invocador.
• En el momento en el que el programa invocador recupera el control.
Para gestionar correctamente el bloque de activación, habrá que realizar las siguientes acciones en los 4 momentos descritos anteriormente:
Justo antes de que el programa invocador pase el control a la subrutina:
1. Almacenar en la pila los registros que deben ser salvados por el invocador. Deberá apilar cualquiera de los $a0 a $a3 y $v0 a $v1 que necesite después. Además, según el convenio, si al invocador le
...