关于函数调用约定
来源:互联网 发布:linux find mtime 1 编辑:程序博客网 时间:2024/06/07 19:51
函数调用约定描述了如何以正确的方式调用某些特定类型的函数。包括了函数参数在栈上的分配顺序、有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等。
函数调用约定的几种类型
stdcall,cdecl,fastcall,thiscall,nakedcall,pascal
stdcall调用约定为Win32 API所广泛使用。
1、参数是从右往左传递的,也是放在堆栈中。
2、函数的堆栈平衡操作是由被调用函数执行的,故编译文件比cdecl小,不能实现变参函数。
函数的返回值放在eax寄存器中,如果是返回64位的数,则要使用edx:eax寄存器对。
cdecl调用约定(C语言使用)
1、参数是从右向左传递的,也是放在堆栈中
2、堆栈平衡是由函数调用者来执行的
支持像printf、scanf的变参调用。
fastcall调用约定
fastcall见名知其意,其特点就是快。fastcall函数调用约定表明了参数应该放在寄存器中,而不是在栈中,VC编译器采用调用约定传递参数时,最左边的两个不大于4个字节(DWORD)的参数分别放在ecx和edx寄存器。当寄存器用完的时候,其余参数仍然从右到左的顺序压入堆栈。像浮点值、远指针和int64类型总是通过堆栈来传递的。
thiscall调用约定
唯一一个不能明确指明的函数修饰,因为thiscall不是关键字。他是C++类成员函数缺省的调用约定。由于成员函数调用还是一个this指针,所以thiscall是专为C++设计的调用方式。
1、参数从右往左入栈
2、如果参数个数确定,this指针通过通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入堆栈
3、对参数个数不定的,调用者清理堆栈,否则函数自己清理
nakedcall调用约定
不常用,用于实模式驱动程序设计
pascal调用约定(pascal语言使用)
1、参量由左到右的顺序入栈
2、由被调用函数自身负责将参量从堆栈中清除
参考:http://baike.baidu.com/view/1276580.htm
出处:http://blog.chinaunix.net/uid-26898698-id-3181880.html
- 关于函数调用约定
- 关于函数调用约定
- 关于函数的调用约定
- 关于函数指针的调用约定修饰
- 关于函数调用约定的学习笔记
- 关于调用约定
- 关于调用约定
- 函数调用约定
- 函数调用约定
- 函数调用约定
- 论函数调用约定
- 函数调用约定解析
- 论函数调用约定
- 函数调用约定
- 函数调用约定
- 论函数调用约定
- 函数调用约定解析
- 函数调用约定
- POJ 2492 A Bug's Life
- 比较R语言、perl语言,matlab中for循环和while循环的使用
- jQuery对象数据缓存Cache原理及jQuery.data详解
- 石头-剪刀-布, 这个经典游戏的基本逻辑是这样的吗????
- 编程之美2013 传话游戏 跪求debug
- 关于函数调用约定
- Opengl--执行过程
- 请教一个关于编码的问题
- 关于metapost的开始dotlabel输出ps文件无法读出来问题
- 2012电子信息 第五堂课后作业
- WEB开发中常见的几个中文乱码问题和解决办法
- __attribute__机制介绍
- Eclipse设置:背景与字体大小和xml文件中字体大小调整
- labview里任意长度hex字符串转为U32类型实现