Regole e limitazioni per le funzioni naked
Specifici di Microsoft
Le seguenti regole e limitazioni valgono per le funzioni naked:
return l'istruzione non è valido.
I costrutti di gestione delle eccezioni C++ e di gestione delle eccezioni strutturata non sono consentiti in quanto è necessario rimuovere attraverso lo stack frame.
per lo stesso motivo, qualsiasi form di setjmp è consentito.
Utilizzo di _alloca la funzione viene impedita.
Per assicurarsi che nessun codice di inizializzazione per le variabili locali senza che la sequenza di prologo, variabili locali inizializzate non sia valida all'ambito della funzione.In particolare, la dichiarazione di oggetti C++ non è valida all'ambito della funzione.È possibile, tuttavia, essere dati inizializzati in un ambito annidato.
Il puntatore a frame che l'ottimizzazione (l'opzione del compilatore /Oy) non è consigliato, ma automaticamente eliminato per una funzione naked.
Non è possibile dichiarare gli oggetti di classi C++ ambito lessicale di funzione.È possibile, tuttavia, dichiarare gli oggetti in un blocco annidato.
naked la parola chiave viene ignorata durante la compilazione con /clr.
per __fastcall le funzioni naked, ogni volta che si verifica un riferimento nel codice C/C++ a uno degli argomenti del registro, il codice di prologo memorizzare i valori del registro nel percorso dello stack per tale variabile.Di seguito è riportato un esempio:
// 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
}
}