Reguły i ograniczenia dotyczące używania funkcji Naked
Specyficzne dla firmy Microsoft
Następujące zasady i ograniczenia dotyczą funkcji naked:
Instrukcja return nie jest dozwolona.
Konstrukcje obsługi wyjątków strukturalnych i obsługi wyjątków C++ są niedozwolone, ponieważ muszą one odwijać całą ramkę stosu.
Z tego samego powodu, jakakolwiek forma setjmp jest zabroniona.
Korzystanie z funkcji _alloca jest zabronione.
W celu zapewnienia braku inicjowania kodu dla zmiennych lokalnych pojawiających się przed sekwencją prologu, zainicjowanie zmiennych lokalnych nie jest dozwolone w zakresie funkcji.W szczególności, deklaracja obiektów C++ nie jest dozwolona w zakres funkcji.Jednak, mogą być zainicjowanymi danymi w zagnieżdżonym zakresie.
Optymalizacja ramki wskaźnika (opcja kompilatora /Oy) nie jest zalecana, ale nie jest automatycznie pomijana dla funkcji naked.
Nie można zadeklarować obiektów klasy języka C++ w zakresie leksykalnym funkcji.Można jednak zadeklarować obiekty w zagnieżdżonym bloku.
Słowo kluczowe naked jest ignorowane podczas kompilacji z /clr.
Dla funkcji naked __fastcall, gdy istnieje odwołanie w kodzie C/C++ do jednego z argumentów rejestru, kod prologu powinien przechowywać wartości rejestru do lokalizacji stosu dla tej zmiennej.Na przykład:
// 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
}
}