Freigeben über


Regeln und Einschränkungen für Naked-Funktionen

Microsoft-spezifisch

Die folgenden Regeln und Einschränkungen treffen auf naked-Funktionen zu:

  • Die return Anweisung ist nicht zulässig.

  • Konstrukte für die strukturierte Ausnahmebehandlung und C++-Ausnahmebehandlung sind nicht zulässig, da sie über den Stapelrahmen entladen werden müssen.

  • Aus demselben Grund ist jede Form von setjmp nicht zulässig.

  • Die Verwendung der _alloca-Funktion ist nicht zulässig.

  • Um sicherzustellen, dass kein Initialisierungscode für lokale Variablen vor der Prologsequenz vorkommt, sind initialisierte lokale Variablen im Funktionsbereich nicht zulässig. Insbesondere ist die Deklaration von C++-Objekten im Funktionsbereich nicht zulässig. Es können jedoch initialisierte Daten in einem geschachtelten Bereich vorhanden sein.

  • Framezeigeroptimierung (die Compileroption "/Oy") wird nicht empfohlen, sie wird jedoch für eine naked-Funktion automatisch unterdrückt.

  • Sie können C++-Klassenobjekte nicht im lexikalischen Bereich der Funktion deklarieren. Sie können jedoch Objekte in einem geschachtelten Block deklarieren.

  • Die naked Schlüsselwort (keyword) wird beim Kompilieren mit /clr ignoriert.

  • Bei __fastcall nackten Funktionen sollte der Prologcode bei jedem Verweis in C/C++-Code auf eines der Registerargumente die Werte dieses Registers in der Stapelposition für diese Variable speichern. Beispiel:

// nkdfastcl.cpp
// compile with: /c
// processor: x86
__declspec(naked) int __fastcall  power(int i, int j) {
   // calculates i^j, assumes that j >= 0

   // prolog
   __asm {
      push ebp
      mov ebp, esp
      sub esp, __LOCAL_SIZE
     // store ECX and EDX into stack locations allocated for i and j
     mov i, ecx
     mov j, edx
   }

   {
      int k = 1;   // return value
      while (j-- > 0)
         k *= i;
      __asm {
         mov eax, k
      };
   }

   // epilog
   __asm {
      mov esp, ebp
      pop ebp
      ret
   }
}

Ende Microsoft-spezifisch

Siehe auch

Naked-Funktionsaufrufe