다음을 통해 공유


규칙과 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
   }
}

참고 항목

참조

Naked 함수 호출