Articulo de referencia

Función prólogo y epílogo

En la programación en lenguaje ensamblador , el prólogo de una función son unas pocas líneas de código al principio de una función, que preparan la pila y los registros para su ...

En la programación en lenguaje ensamblador , el prólogo de una función son unas pocas líneas de código al principio de una función, que preparan la pila y los registros para su uso dentro de la función. De manera similar, el epílogo de la función aparece al final de la función y restaura la pila y los registros al estado en el que se encontraban antes de que se llamara a la función.

El prólogo y el epílogo no forman parte del lenguaje ensamblador en sí, sino que representan una convención utilizada por los programadores de lenguaje ensamblador y los compiladores de muchos lenguajes de nivel superior . Son bastante rígidos y tienen la misma forma en cada función.

El prólogo y el epílogo de la función a veces también contienen código para protección contra desbordamiento de búfer .

Prólogo

Un prólogo de función normalmente realiza las siguientes acciones si la arquitectura tiene un puntero base (también conocido como puntero de marco) y un puntero de pila:

  • Inserta el puntero base actual en la pila para que pueda restaurarse más tarde.
  • El valor del puntero base se establece en la dirección del puntero de la pila (que apunta a la parte superior de la pila) de modo que el puntero base apunte a la parte superior de la pila.
  • Mueve el puntero de pila más lejos disminuyendo o aumentando su valor, dependiendo de si la pila crece hacia abajo o hacia arriba. En x86, el puntero de pila se reduce para dejar espacio para las variables locales de la función.

Se pueden escribir varios prólogos posibles, lo que da como resultado una configuración de pila ligeramente diferente. Estas diferencias son aceptables, siempre que el programador o el compilador utilicen la pila de la forma correcta dentro de la función.

A modo de ejemplo, aquí se muestra un prólogo de función de lenguaje ensamblador x86 típico producido por GCC.

	empujar ebp mover ebp , esp sub esp , N 
		 
		 

El valor inmediato N es el número de bytes reservados en la pila para uso local.

El mismo resultado se puede lograr utilizando la enterinstrucción:

	Ingrese N , 0	 

Se pueden obtener prólogos más complejos utilizando valores diferentes (distintos de 0) para el segundo operando de la enterinstrucción. Estos prólogos introducen varios punteros base/marco para permitir funciones anidadas , como lo requieren lenguajes como Pascal . Sin embargo, las versiones modernas de estos lenguajes no utilizan estas instrucciones porque limitan la profundidad de anidamiento en algunos casos. [ cita requerida ]

Epílogo

El epílogo de la función revierte las acciones del prólogo de la función y devuelve el control a la función que la llama. Normalmente realiza las siguientes acciones (este procedimiento puede variar de una arquitectura a otra):

  • Suelta el puntero de la pila al puntero base actual, de modo que se libere el espacio reservado en el prólogo para las variables locales.
  • Extrae el puntero base de la pila, de modo que se restablece a su valor anterior al prólogo.
  • Regresa a la función de llamada, sacando de la pila el contador de programa del cuadro anterior y saltando a él.

El epílogo dado revertirá los efectos de cualquiera de los prólogos anteriores (ya sea el completo o el que utiliza enter). Bajo ciertas convenciones de llamada, es responsabilidad del receptor limpiar los argumentos de la pila, por lo que el epílogo también puede incluir el paso de mover el puntero de la pila hacia arriba o hacia abajo.

Por ejemplo, estos tres pasos se pueden realizar en lenguaje ensamblador x86 de 32 bits mediante las siguientes instrucciones:

	movimiento esp , ebp pop, ebp ret	 
		
	

Al igual que el prólogo, el procesador x86 contiene una instrucción incorporada que ejecuta parte del epílogo. El código siguiente es equivalente al código anterior:

	dejar 
ret	

La leaveinstrucción ejecuta las instrucciones movy pop, como se describe anteriormente.

Una función puede contener varios epílogos. Cada punto de salida de la función debe saltar a un epílogo común al final o contener su propio epílogo. Por lo tanto, los programadores o compiladores suelen utilizar la combinación de leavey retpara salir de la función en cualquier punto. (Por ejemplo, un compilador de C sustituiría una returnsentencia por una secuencia leave/ ).ret

Lectura adicional

  • de Boyne Pollard, Jonathan (2010). "Los perílogos de la función genómica". Respuestas frecuentes .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Función_prólogo_y_epílogo&oldid=1193813755"