Důležité informace pro psaní kódu Prolog/Epilog
Konkrétní společnosti Microsoft
Před zápisem vlastní prolog a epilog kód číselné řady, je důležité porozumět, jak stanovené snímek zásobníku.Je užitečné vědět, jak použít __LOCAL_SIZE symbol.
Rozložení snímku zásobníku
Příklad prologu standardní kód, který se může zobrazit v 32bitové funkce:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
localbytes Proměnná představuje počet bajtů potřebných v zásobníku pro místní proměnné a <registers> je proměnná představuje seznam registrů uložen v zásobníku.Po předání Registry můžete umístit další příslušná data v zásobníku.Odpovídající kód epilog je:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
Zásobník roste vždy dolů (od velmi málo paměti adresy).Základní ukazatele (ebp) odkazuje na tlačné hodnotu ebp.Oblast locals začíná na ebp-4.Chcete-li získat přístup k místním proměnným, výpočet posunu od ebp odečtením příslušné hodnoty z ebp.
__LOCAL_SIZE
Kompilátor obsahuje symbol, __LOCAL_SIZE, pro použití v bloku assembler vložený kód funkce prologu.Tento symbol se používá k přidělení místa pro lokální proměnné v zásobníku snímku v prologu vlastní kód.
Kompilátor Určuje hodnotu __LOCAL_SIZE.Jeho hodnota je celkový počet bajtů všech uživatelem definovaných místní proměnné a generovaný kompilátorem dočasné proměnné.__LOCAL_SIZE lze použít pouze jako přímým operandem; nelze ji použít ve výrazu.Není musíte změnit nebo znovu definovat hodnotu tohoto symbolu.Příklad:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
Následující příklad holé funkce obsahující vlastní prolog a epilog sequences používá __LOCAL_SIZE symbol v prologu sekvence:
// 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
}
}