函数调用机制与调用约定(转载)

1.示例

栈的作用和功能这里就不再叙述了。

先看一个最简单的函数调用例子:

#include "stdafx.h"

int call(int _a,int _b);

void _tmain()
{
	int a=1;
	int b=2;
	int c=call(a,b);
}

int call(int _a,int _b)
{
	return _a+_b;
}
main函数中调用call函数,并传入2个参数a,b。调用结束后返回赋值给c。这里可以分为两部分分析:


2.函数调用

当调用一个函数时,系统发生进行如下动作,内存模型如下图:

(1)开辟该调用函数的栈空间。

(2)将当前的运行状态压栈

(3)将返回地址压栈

(4)在栈内为传参分配空间

(5)在栈内为函数内局部变量分配空间,执行被调用函数

3.函数返回

当被调用函数结束后,进行返回时,系统进行的动作刚好与函数调用时相反,内存模型如下图:

(1)释放栈内局部变量空间

(2)释放栈内传参空间

(3)退栈,得到返回地址,程序跳转调用处等待

(4)退栈,得到调用前运行状态,恢复调用前运行状态

(5)释放该调用函数栈空间


4.函数调用约定

函数调用时参数的传递过程中还有两个需要注意的问题:

1.多个参数的入栈顺序?

2.谁来清理调用堆栈?

在高级语言中,是通过函数调用约定来说明这两个问题的。C++采用的函数调用约定就是__stdcall。__stdcall包含两个意思,第一是按照C风格传递参数即参数从右自左压入堆栈,函数内部正好从左自右读出参数,第二是函数执行清除堆栈,即调用函数是堆栈中压入参数时占用了位置,这些位置将由调用函数负责清空。


 





关键字                   堆栈清除者      参数传递
__cdecl                  调用者         从右向左的顺序压入栈内
__stdcall                被调用者      从右向左的顺序压入栈内
__fastcall               被调用者      保存在寄存器中,然后其他的压入栈内
thiscall(非关键字)    被调用者      压入栈,this指针保存在ECX寄存器内


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值