규칙과 Naked 함수에 대 한 제한 사항
Microsoft 전용
Naked 함수에 다음 규칙과 제한 사항이 적용 됩니다.
return 문을 사용할 수 없습니다.
스택 프레임을 가로질러가 해제 해야 합니다 때문에 구조적 예외 처리 및 C++ 예외 처리 구문은 사용할 수 없습니다.
같은 이유로, 모든 형태의 setjmp 허용 되지 않습니다.
사용 하는 _alloca 함수는 금지 합니다.
프롤로그 시퀀스 전에 로컬 변수에 대 한 초기화 코드가 표시 되도록 하려면 지역 변수가 초기화 함수 범위에서 사용할 수 없습니다.특히 C++ 개체는 함수 범위에서 허용 되지 않습니다.그러나, 수도 초기화 된 데이터가 중첩된 범위에 있습니다.
프레임 포인터 최적화 (/Oy 컴파일러 옵션)을 권장 하지 않습니다, 하지만 naked 함수에 자동으로 표시 하지 않습니다.
C + + 클래스 개체 함수 어휘 범위에 선언할 수 없습니다.그러나 중첩 된 블록에 개체를 선언할 수 있습니다.
naked 로 컴파일하는 경우 키워드가 무시 됩니다 /clr.
에 대 한 __fastcall naked 함수 레지스터 인수 중 하나를 C/C++ 코드에서 참조 될 때마다 프롤로그 코드 레지스터는 스택의 위치로 해당 변수에 대 한 값을 저장 해야 합니다.예를 들면 다음과 같습니다.
// 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
}
}