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