Share via


Overwegingen voor het schrijven van Prolog-/Epilog-code

Microsoft-specifieke

Voordat u uw eigen prolog- en epilog-codereeksen schrijft, is het belangrijk om te begrijpen hoe het stackframe is ingedeeld. Het is ook handig om te weten hoe u het __LOCAL_SIZE symbool gebruikt.

Indeling stapelframe

In dit voorbeeld ziet u de standaard prolog-code die kan worden weergegeven in een 32-bits functie:

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

De localbytes variabele vertegenwoordigt het aantal bytes dat nodig is op de stack voor lokale variabelen en de <registers> variabele is een tijdelijke aanduiding die de lijst met registers vertegenwoordigt die moeten worden opgeslagen op de stack. Nadat u de registers hebt gepusht, kunt u alle andere geschikte gegevens op de stack plaatsen. Hier volgt de bijbehorende epilogcode:

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

De stack groeit altijd omlaag (van adressen met hoog tot laag geheugen). De basispointer (ebp) verwijst naar de gepushte waarde van ebp. De lokale bevolking begint bij ebp-4. Als u toegang wilt krijgen tot lokale variabelen, berekent u een verschuiving van waaruit ebp u de juiste waarde wilt ebpaftrekken.

__LOCAL_SIZE

De compiler biedt een symbool, __LOCAL_SIZEvoor gebruik in het inline assembly-blok van functie prolog-code. Dit symbool wordt gebruikt om ruimte toe te wijzen voor lokale variabelen in het stackframe in aangepaste prolog-code.

De compiler bepaalt de waarde van __LOCAL_SIZE. De waarde is het totale aantal bytes van alle door de gebruiker gedefinieerde lokale variabelen en door compiler gegenereerde tijdelijke variabelen. __LOCAL_SIZE kan alleen worden gebruikt als een onmiddellijke operand; het kan niet worden gebruikt in een expressie. U mag de waarde van dit symbool niet wijzigen of opnieuw definiƫren. Voorbeeld:

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

In het volgende voorbeeld van een naakte functie met aangepaste prolog- en epilog-reeksen wordt het __LOCAL_SIZE symbool in de prolog-reeks gebruikt:

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

Microsoft-specifieke beƫindigen

Zie ook

Naakte functie-aanroepen