生の関数の規則と制限
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
}
}