Partager via


Règles et limitations pour les fonctions naked

Spécifique à Microsoft

Les règles et des restrictions suivantes s'appliquent aux fonctions naked :

  • l'instruction d' return n'est pas autorisée.

  • Les éléments de gestion structurée des exceptions et de gestion des exceptions C++ ne sont pas autorisés car ils doivent les dérouler sur le frame de pile.

  • Pour la même raison, un formulaire d' setjmp est interdit.

  • l'utilisation de la fonction d' _alloca est interdite.

  • Pour s'assurer qu'aucun code d'initialisation des variables locales n'apparaît avant la séquence du prologue, des variables locales initialisées ne soient pas autorisées à la portée de la fonction.En particulier, la déclaration d'objets C++ n'est pas autorisée à la portée de la fonction.Il peut, toutefois, y avoir des données initialisées dans une portée imbriquée.

  • Le pointeur de frame que l'optimisation (l'option du compilateur /Oy) n'est pas recommandée, mais il est supprimée automatiquement pour une fonction naked.

  • Vous ne pouvez pas déclarer des objets de classe C++ à la portée lexicale de fonction.Vous pouvez, toutefois, déclarer des objets dans un bloc imbriqué.

  • Le mot clé d' naked est ignoré lors de la compilation avec /clr.

  • Pour les fonctions naked de __fastcall , toutes les fois qu'une référence dans du code C/C++ à l'un des arguments de registre, le code du prologue doit stocker les valeurs de ce registre dans l'emplacement de pile pour cette variable.Par exemple :

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

Voir aussi

Référence

Appels de fonction naked