Microsoft 专用
以下规则和限制适用于裸函数:
不允许使用
return
语句。不允许结构化异常处理和 C++ 异常处理构造,因为它们必须在堆栈帧中展开。
出于同一原因,禁止任何形式的
setjmp
。禁止使用
_alloca
函数。若要确保局部变量的初始化代码不在 prolog 序列之前出现,函数范围中不允许存在初始化的局部变量。 具体而言,函数范围中不允许有 C++ 对象的声明。 但是,嵌套的范围中可能有初始化的数据。
不建议使用帧指针优化(/Oy 编译器选项),但会自动为裸函数将其取消。
不能在函数词法范围中声明 C++ 类对象。 但是,可以在嵌套的块中声明对象。
在使用 /clr 进行编译时,将忽略
naked
关键字。对于 __fastcall 裸函数,只要 C/C++ 代码中存在对某个寄存器自变量的引用,prolog 代码就应将该寄存器的值存储到该变量的堆栈位置中。 例如:
// 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 专用