stringtranslate.com

Función prólogo y epílogo.

En la programación en lenguaje ensamblador , el prólogo de la función son unas pocas líneas de código al comienzo 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 la función.

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

Las funciones prólogo y epílogo a veces también contienen código para protección contra desbordamiento del 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 dará como resultado una configuración de pila ligeramente diferente. Estas diferencias son aceptables, siempre y cuando el programador o compilador utilice la pila de forma correcta dentro de la función.

Como ejemplo, aquí hay un prólogo típico de una función en lenguaje ensamblador x86 producido por el GCC.

empujar ebp mov ebp , esp sub esp , norte   

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

Se puede lograr el mismo resultado utilizando la enterinstrucción:

introduzca 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 necesaria ]

Epílogo

El epílogo de la función invierte las acciones del prólogo de la función y devuelve el control a la función que llama. Normalmente realiza las siguientes acciones (este procedimiento puede diferir 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 usa enter). Según ciertas convenciones de llamada, es responsabilidad del destinatario 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:

mov esp , ebp pop ebp ret 

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

dejar retir

La leaveinstrucción realiza las instrucciones movy pop, como se describió anteriormente.

Una función puede contener múltiples epílogos. Cada punto de salida de 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 momento. (Por ejemplo, un compilador de C sustituiría una returndeclaración por una secuencia leave/ ret).

Otras lecturas