Regeln und Einschränkungen für nackte Funktionen
Microsoft-spezifisch
Die folgenden Regeln und Einschränkungen gelten für nackte Funktionen:
Die return-Anweisung ist nicht zulässig.
Die strukturierte Ausnahmebehandlung und C++-Ausnahmebehandlung die Konstrukte behandeln, sind nicht zulässig, da sie über den Stapelrahmen selbst entladen werden muss.
Aus demselben Grund wird jedes Formular von setjmp verhindert.
Verwendung der _alloca-Funktion wird verhindert.
Um sicherzustellen, dass kein Initialisierungscode für lokale Variablen vor der vorläufige sequence, werden nicht initialisierte lokale Variablen wird im Gültigkeitsbereich der Funktion zulässig.Insbesondere wird die Deklaration von C++-Objekten nicht im Gültigkeitsbereich der Funktion zulässig.Es gibt jedoch möglicherweise initialisierte Daten in einem geschachtelten Bereich.
Framezeiger, die Optimierung (die /Oy-), aber nicht empfohlen wird, wird automatisch für eine nackte Funktion unterdrückt.
C++-Klassenobjekte können Sie gültigkeitsbereich lexikalischen Funktion nicht deklarieren.Sie können jedoch Objekte in einem geschachtelten - Blocks deklarieren.
Das naked-Schlüsselwort wird beim Kompilieren mit /clrignoriert.
Eine nackte Funktionen __fastcall wenn es einen Verweis im C/C++-Code auf eines der Argumente Register vorläufige vorhanden sind, sollte der Code die Werte in den Stapel des Registers Speicherorts für diese Variable speichern.Beispiele:
// 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
}
}