【C++进阶】__stdcall 详解

发布时间:2016-12-7 0:01:08 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"【C++进阶】__stdcall 详解",主要涉及到【C++进阶】__stdcall 详解方面的内容,对于【C++进阶】__stdcall 详解感兴趣的同学可以参考一下。

【C++进阶】__stdcall 详解     __stdcall用来修饰函数,被该关键字修饰的函数,其参数都是从右向左依次被压入到栈中,函数调用在返回前需要清理堆栈,被调函数在返回前负责清理堆栈。 函数调用约定         函数调用约定主要约束了两件事: 1. 参数传递的顺序 2. 调用堆栈由谁(调用函数或被调用函数)负责清理     __stdcall是函数调用约定的一种。__stdcall表示: 1. 参数从右向左压入堆栈(这样当函数参数出栈时,刚好是先拿到最左边的参数) 2. 函数被调用者修改堆栈,负责清理自己在堆栈中的参数 3. 函数名(在编译器层次)自动加前导下划线,[email protected],其后紧跟着参数的尺寸。因此,声明为 int func( int a, int b ) 的函数修饰如下所示:[email protected] 以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成: push 2 第二个参数入栈 push 1 第一个参数入栈 call function 调用参数,注意此时自动把cs:eip入栈 而对于函数自身,则可以翻译为: push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp 保存堆栈指针 mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向a add eax,[ebp + 0CH] 堆栈中ebp + 12处保存了b mov esp,ebp 恢复esp pop ebp ret 8 而在编译时,[email protected] [email protected]的通用性,但是大体代码如此。其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。 从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。函数结束后,ret 8表示清理8个字节的堆栈,函数自己恢复了堆栈。 注:以上内容参考了网络上的其它内容,如有错误,请在回复中指出。

上一篇:ASTreeView Demo:Add, Edit & Delete nodes
下一篇:机器学习第七课--SVM(2)拉格朗日算子

相关文章

相关评论