c语言裸函数,裸函数的规则和限制

本文详细介绍了裸函数在Microsoft平台下的使用规则和限制,包括不允许使用return语句、禁止结构化异常处理、不允许使用alloca函数等。同时,强调了初始化的局部变量和C++对象的声明规定。在裸函数的epilog部分,需要手动恢复寄存器状态。当使用/clr编译时,naked关键字被忽略。

裸函数的规则和限制

11/04/2016

本文内容

Microsoft 专用

以下规则和限制适用于裸函数:

return 不允许使用该语句。

不允许结构化异常处理和 C++ 异常处理构造,因为它们必须在堆栈帧中展开。

出于同一原因,禁止任何形式的 setjmp。

禁止使用 _alloca 函数。

若要确保局部变量的初始化代码不在 prolog 序列之前出现,函数范围中不允许存在初始化的局部变量。 具体而言,函数范围中不允许有 C++ 对象的声明。 但是,嵌套的范围中可能有初始化的数据。

不建议使用帧指针优化(/Oy 编译器选项),但会自动为裸函数将其取消。

不能在函数词法范围中声明 C++ 类对象。 但是,可以在嵌套的块中声明对象。

naked 当用 /clr编译时,将忽略关键字。

对于 __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 专用

请参阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值