Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Holé volání funkce