Zagadnienia dotyczące pisania kodu prologu/Epilog
Programu Microsoft
Przed pisania własnych prologu i epilog sekwencji kodu, jest ważne, aby zrozumieć, jak określonymi ramek stosu.Warto również wiedzieć, jak używać __LOCAL_SIZE symbol.
Układ ramek stosu
W tym przykładzie pokazuje kod standardowy prologu, który może pojawić się w funkcji 32-bitowych:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
localbytes Zmienna reprezentuje liczbę bajtów, potrzebne na stosie dla zmiennych lokalnych oraz <registers> zmienna jest symbolem zastępczym reprezentującym listę rejestrów, które mają być zapisywane na stosie.Po pchania rejestrów, można umieścić inne odpowiednie dane na stosie.Poniżej przedstawiono odpowiedni kod epilog:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
Stos powiększa się zawsze w dół (z wysokiego na adresy z małą ilością pamięci).Wskaźnik bazowy (ebp) wskazuje wartość barki ebp.Obszar zmiennych lokalnych rozpoczyna się od ebp-4.Aby uzyskać dostęp do zmiennych lokalnych, obliczyć przesunięcie z ebp przez odjęcie odpowiednią wartość z ebp.
__LOCAL_SIZE
Kompilator zawiera symbol, __LOCAL_SIZE, do użytku w bloku assembler wbudowanej funkcji prolog kodu.Ten symbol jest używana do alokowania miejsca dla zmiennych lokalnych na ramce stosu w prologu niestandardowego kodu.
Kompilator określa wartość __LOCAL_SIZE.Jego wartość jest całkowita liczba bajtów wszystkich generowanych przez kompilator tymczasowych zmiennych i zmiennych lokalnych zdefiniowanych przez użytkownika.__LOCAL_SIZE mogą być używane tylko jako argumentem; Każde pozwolenie na wywóz nie można użyć w wyrażeniu.Nie należy zmienić lub ponownie zdefiniować wartość tego symbolu.Na przykład:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
Poniższy przykład funkcji bez nadruku, zawierające niestandardowe prologu i epilog sekwencji zastosowań __LOCAL_SIZE symbol w prologu sekwencji:
// 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
}
}