函数调用约定问题.高手请,,急

函数调用约定函数调用约定包括传递参数的顺序,谁负责清理参数占用的堆栈等,例如:参数传递顺序谁负责清理参数占用的堆栈__pascal从左到右调用者__stdcall从右到左... 函数调用约定
函数调用约定包括传递参数的顺序,谁负责清理参数占用的堆栈等,例如 :

参数传递顺序 谁负责清理参数占用的堆栈
__pascal 从左到右 调用者
__stdcall 从右到左 被调函数
__cdecl 从右到左 调用者

我只是想问,什么是调用者,什么是被调用函数,能否举个例,本文以x86,VC++的编译器为例.
__cdecl和__stdcall的区别是:__cdecl是调用者清理参数占用的堆栈,__stdcall是被调函数清理参数占用的堆栈。

又是何解?
展开
 我来答
ChikaIto
2008-12-12 · TA获得超过326个赞
知道小有建树答主
回答量:205
采纳率:0%
帮助的人:0
展开全部
为了了解这两种调用方式有什么区别 先用vc来写一个小小的控制台程序

#pragma comment(linker, "/nodefaultlib")
#pragma comment(linker, "/entry:main")

#pragma optimize("gsy", on)

void __cdecl fun(int a, int b)
{
}

void main()
{
int a = 3, b = 5;
fun(a, b);
}

我这vc++默认的调用约定是__cdecl,也就是“调用者清理堆栈”
main函数是调用者,fun是被调函数
生成这个程序

现在反汇编这个程序(我用了PE Explorer),得到下面的反汇编列表,看起来不是很复杂

004001C8................SUB_L004001C8:......;我们的fun
004001C8 C3.............retn................;在这里返回
;---------------------------------------------------------------
004001C9............入口点:.................;我们的main
004001C9 6A00...........push 00000005h......;压入变量b
004001CB 6A00...........push 00000003h......;压入变量a
004001CD E8F6FFFFF......call SUB_L004001C8..;调用fun
004001D2 59.............pop ecx.............;调用者把参数弹出栈
004001D3 59.............pop ecx.............;调用者把参数弹出栈
004001D4 C3.............retn................;主函数返回
;---------------------------------------------------------------
004001D5................00000003h DUP (??)

好了 改一下函数的调用方式 改成__stdcall,被调函数清理堆栈

void __stdcall fun(int a, int b)
{
}

再次生成它
再反汇编它,得到下面的反汇编列表

004001C8................SUB_L004001C8:......;fun
004001C8 C20800.........retn 0008h..........;这边不一样了,函数返回的时候自己弹出了堆栈中的8个字节数据(两个int)
;----------------------------------------------------------------
004001CB..........入口点:...................;main
004001CB 6A05...........push 00000005h......;压入变量b
004001CD 6A03...........push 00000003h......;压入变量a
004001CF E8F4FFFFFF.....call SUB_L004001C8..;调用fun
004001D4 C3.............retn................;主函数返回
;----------------------------------------------------------------
004001D5................00000003h DUP (??)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式