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