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
}
}
Microsoft 固有の仕様はここまで