使用 __declspec(naked) 定义的函数,编译器只会负责参数压栈、执行CALL指令,和释放参数的内存(堆栈平衡),除此之外啥也没有,比如提升堆栈,寄存器的保存和恢复,或者是函数返回,这些都要自己添加。

上图是一个裸函数,因为连参数都没有,编译器做的事情就是一个CALL。由于没有RET,所以程序会出错。
调用处生成的CALL

跳转到函数体,全是INT3,没有RET,函数无法返回到调用处,程序出错。

下面给出一个裸函数实现加法的例子。

返回值通过 EAX 返回给主函数。
本文详细解析了使用__declspec(naked)定义的函数特性,指出编译器仅负责参数压栈、执行CALL指令及堆栈平衡,而提升堆栈、寄存器保存与恢复等操作需自行添加。并通过一个裸函数实现加法的例子,展示了如何正确使用这种函数。
1061

被折叠的 条评论
为什么被折叠?



