函数调用方式小结

来源:互联网 发布:mysql数据库备份还原 编辑:程序博客网 时间:2024/06/05 22:48

我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,windows下栈的大小是2M(也有的说是1M),如果申请的空间超过栈的剩余空间时,将提示overflow。
在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

下面以函数int fun(int a, int b)举例来说明:
表格

注:
1.C的函数名的修饰约定规则均不改变输出函数名中的字符大小写,而PASCAL约定输出的函数名是无任何修饰且全部大写。
2.关键字 __stdcall、__cdecl和__fastcall可以直接加在要输出的函数前,也可以在编译环境的Setting…/C/C++ /Code Generation项选择。当加在输出函数前的关键字与编译环境中的选择不同时,直接加在输出函数前的关键字有效。它们对应的命令行参数分别为 /Gz、/Gd和/Gr。缺省状态为/Gd,即__cdecl。

下面以实际例子来说明__stdcall、__cdecl和__fastcall修饰名的不同:
代码
使用LordPE查看导出表:
导出表

0 0
原创粉丝点击