关于stdcall等调用& (2006-11-12 01:34:00)

关于stdcall等调用&

  (2006-11-12 01:34:00)
标签: 

杂谈

 
stdcall是函数调用约定的一种。调用约定决定了:
(1)调用函数时参数的压栈顺序;
(2)是调用者还是被调用者清除栈里的参数;
(3)编译器为区分每一个函数所采用的名称转换方式。
对于VC6.0来说,有三种调用约定:__cdecl、__fastcall、__stdcall。
(1)__cdecl:调用者负责压栈和清栈,参数从右到左压入栈中。对于C来说,其名称转换方式是在函数名称前加下划线“_”(形式如:_functionname),对于C++来说,除非使用extern "C",否则将按C++的转换方式进行。这是对静态函数和全局函数的缺省调用约定。对于变参函数来说,只能采用这个约定,因为被调用者不知道有几个参数。
(2)__fastcall:被调用者负责清栈,前两个参数放在寄存器,其它的参数压入栈。名称转换后前后都有一个“@”,并在后面加上参数的字节数(形式如:@functionname@number)。
(3)__stdcall:调用者负责压栈,被调用者负责清栈,参数从右到左入栈。对于C来说,其名称转换方式是在前面加下划线“_”,在后面加“@”和参数的字节数(形式如:_functionname@number),对于C++来说,除非使用extern "C",否则将按C++的转换方式进行。它是Win32 API的标准调用约定。也许是因为它可以使程序变小吧,因为清栈的代码只在被调用者中出现一次,而不会出现在每一个调用者的代码中。对于变参的函数,不能采用这种调用约定。
对于C++的非静态的成员函数,其缺省调用约定跟__stdcall一样,只是在ECX中存放了这个函数的this指针。
而对于C++的非静态的变参的成员函数,其缺省调用约定跟__cdecl一样,只是(a)在ECX中存放了这个函数的this指针;(b)在函数调用之前把ECX压栈。

这儿是对一般的调用约定的说明,可以看看http://en.wikibooks.org/wiki/Reverse_Engineering/Calling_Conventions


0

阅读 (23)   评论  (0) 收藏 (0)  转载   喜欢   打印 举报
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值