Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Wywołania funkcji bez nadruku