Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Wywołania funkcji Naked