stringtranslate.com

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 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:

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/de 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):

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