次の方法で共有


生の関数の規則と制限

Microsoft 固有の仕様 →

次の規則と制限が生の関数に適用されます :

  • return のステートメントは使用できません。

  • 構造化例外処理と C++ 例外処理の構造はスタック フレームにアンワインドする必要があるため使用できません。

  • 同じ理由からsetjmp 内のフォームが禁止されています。

  • _alloca の関数の使用は禁止されています。

  • プロローグのシーケンスが関数のスコープでは許可されていないローカル変数初期化前にローカル変数の初期化コードが表示されないことを確認します。特にC++ オブジェクトの宣言は関数内では使用できません。ただし入れ子になったスコープに初期化データが含まれる場合があります。

  • 最適化 (/Oy コンパイラ オプション) がお勧めはフレーム ポインターは生の関数に自動的に適用されます。

  • 関数の構文のスコープでの C++ クラス オブジェクトを宣言できません。ただし入れ子になったブロックのオブジェクトを宣言できます。

  • naked のキーワードは /clr でコンパイルする場合は無視されます。

  • __fastcall の生の関数では引数レジスタの 1 つが 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
   }
}

参照

関連項目

生の関数呼び出し