Condividi tramite


Considerazioni per la scrittura di codice epilogo o di prologo

Specifici di Microsoft

Prima di scrivere del prologo e l'epilogo codificare le sequenze, è importante comprendere come lo stack frame è verificato.È inoltre utile conoscere le modalità di utilizzo __LOCAL_SIZE simbolo.

Layout di stack frame

Questo esempio mostra il codice standard di prologo che venga visualizzata in una funzione a 32 bit:

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

localbytes la variabile rappresenta il numero di byte necessari nello stack per le variabili locali e <registers> la variabile è un segnaposto che rappresenta l'elenco di log da salvare nello stack.Dopo la push log, è possibile posizionare gli altri dati appropriati nello stack.Ecco il codice corrispondente di epilogo:

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

Lo stack si compila sempre giù (dal livello agli indirizzi di memoria insufficiente).il puntatore di base (ebp) punti al valore inserito di ebp.L'area di locali partire da ebp-4.Per accedere alle variabili locali, calcolare un offset da ebp sottraendo il valore appropriato ebp.

__LOCAL_SIZE

il compilatore fornisce un simbolo, __LOCAL_SIZE, per motivi di utilizzo nel blocco l'assembler inline del codice di prologo di funzione.Questo simbolo viene utilizzato per allocare memoria per le variabili locali sullo stack frame nel codice di prologo.

il compilatore determina il valore di __LOCAL_SIZE.Il valore è il numero totale di byte di tutte le variabili locali definite dall'utente e variabili temporanee generati dal compilatore.__LOCAL_SIZE può essere utilizzato solo come operando immediato, non può essere utilizzato in un'espressione.Non è necessario modificare o ridefinire il valore del simbolo.Di seguito è riportato un esempio:

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

Nell'esempio di una funzione naked che contiene il prologo personalizzato e l'epilogo ordina gli utilizzi __LOCAL_SIZE simbolo nella sequenza di prologo:

// 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
      }
}

Vedere anche

Riferimenti

Chiamate di funzione naked