Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Específicos de Microsoft
Las reglas y las siguientes limitaciones se aplican a las funciones descubiertas:
La instrucción de return no está permitido.
Las construcciones de control estructurado de excepciones y el control de excepciones de C++ no se permiten porque deben desenredar a través del marco de pila.
por la misma razón, cualquier formulario de setjmp se prohíbe.
el uso de la función de _alloca se prohíbe.
Para asegurarse de que ningún código de inicialización para las variables locales se produzca antes de la secuencia de prólogo, las variables locales inicializadas no se permiten en el ámbito de la función.En particular, la declaración de objetos de C++ no se permite en el ámbito de la función.puede, sin embargo, haber datos inicializados en un ámbito anidado.
El puntero de capítulo que la optimización (la opción del compilador /Oy) no se recomienda, sólo que automáticamente se suprime en una función naked.
No se puede declarar objetos de clase de C++ en el ámbito léxico de la función.Puede, sin embargo, declarar objetos en un bloque anidado.
Se omite la palabra clave de naked al compilar con /clr.
Para las funciones descubiertas de __fastcall , siempre que haya una referencia en código de C/C++ en uno de los argumentos del registro, el código de prólogo debe almacenar los valores del registro en la ubicación de la pila para esa variable.Por ejemplo:
// 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
}
}