Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437757
  • 博文数量: 63
  • 博客积分: 1175
  • 博客等级: 少尉
  • 技术积分: 1204
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 11:33
文章分类
文章存档

2015年(1)

2014年(3)

2013年(7)

2012年(52)

分类: WINDOWS

2012-04-19 12:27:17

 

函数调用约定描述了如何以正确的方式调用某些特定类型的函数。包括了函数参数在栈上的分配顺序、有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等。

函数调用约定的几种类型 

 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、由被调用函数自身负责将参量从堆栈中清除

阅读(1761) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

XylDll2012-04-19 23:22:12

虾米小: 恩,这个还是都知道的清楚点比较好.....

XylDll2012-04-19 23:20:39

我是月老: 呵呵,不错的文章,多谢楼主哦.....
谢谢啦,大家一起继续努力

我是月老2012-04-19 21:55:56

呵呵,不错的文章,多谢楼主哦

虾米小2012-04-19 21:39:43

恩,这个还是都知道的清楚点比较好