Compartir a través de


Consideraciones para escribir código de Prólogo/epílogo

Específicos de Microsoft

Antes de escribir poseer secuencias de código de prólogo y de epílogo, es importante entender cómo se muestra el marco de pila.También es útil saber utilizar el símbolo de __LOCAL_SIZE .

Diseño del marco de pila

Este ejemplo muestra el código estándar de prólogo que puede aparecer en una función de 32 bits:

push        ebp                ; Save ebp
mov         ebp, esp           ; Set stack frame pointer
sub         esp, localbytes    ; Allocate space for locals
push        <registers>        ; Save registers

La variable de localbytes representa el número de bytes necesarios en la pila para las variables locales, y la variable de <registers> es un marcador de posición que representa la lista de registros que se guarden en la pila.Después de insertar los registros, puede colocar cualquier otro dato adecuado en la pila.A continuación se muestra el código correspondiente de epílogo:

pop         <registers>   ; Restore registers
mov         esp, ebp      ; Restore stack pointer
pop         ebp           ; Restore ebp
ret                       ; Return from function

La pila crece siempre siguiente (de mayor a las direcciones de memoria baja).Los puntos bases de puntero (ebp) al valor presionado de ebp.el área de valores locales comienza en ebp-4.para tener acceso a variables locales, calcule un desplazamiento de ebp restando el valor apropiado de ebp.

__LOCAL_SIZE

El compilador proporciona un símbolo, __LOCAL_SIZE, para su uso en el bloque en línea de código ensamblador de código del prólogo de la función.Este símbolo se utiliza para asignar espacio para las variables locales del marco de pila en código personalizado de prólogo.

el compilador determina el valor de __LOCAL_SIZE.Su valor es el número total de bytes de todas las variables locales definidas por el usuario y variables temporales compilador-generadas.__LOCAL_SIZE se puede utilizar como operando inmediato; no se puede utilizar en una expresión.No debe cambiar o volver a definir el valor de este símbolo.Por ejemplo:

mov        eax, __LOCAL_SIZE           ;Immediate operand--Okay
mov        eax, [ebp - __LOCAL_SIZE]   ;Error

El ejemplo siguiente de una función naked que contiene secuencias personalizadas de prólogo y de epílogo utiliza el símbolo de __LOCAL_SIZE en la secuencia de prólogo:

// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
   int i;
   int j;

   __asm {      /* prolog */
      push   ebp
      mov      ebp, esp
      sub      esp, __LOCAL_SIZE
      }
      
   /* Function body */
   __asm {   /* epilog */
      mov      esp, ebp
      pop      ebp
      ret
      }
}

Vea también

Referencia

Llamadas de función descubiertas