函数调用堆栈的过程

本文详细解析了C++函数调用时的堆栈过程,包括栈帧开辟、参数传递、返回值处理以及不同调用约定的介绍。通过对实例的反汇编分析,阐述了从主函数到被调用函数的执行细节,如实参压栈、地址转移、栈底指针保存等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数在进行调用时会产生开栈和清栈的操作,那么就来介绍一下函数调用堆栈的过程吧

首先,利用一个小例子来研究这个过程:

#include<iostream>


int Fun(int a,int b)
{
	int tmp = 0;
	tmp = a + b;
	return tmp;
}


int main()
{
	int a = 10;
	int b = 20;
	int res = 0;
	res = Fun(a, b);
	std::cout << res << std::endl;
	return 0;
}

我们通过调试的反汇编功能可以看到主函数以及Fun函数执行时的反汇编代码:

main函数:

 Fun函数:

在看这个之前,我们得先了解一下基本符号的意义

1)eax ebx ecx edx:均为寄存器,用来存储数据;

2)ebp esp(ebp为栈底指针,esp为栈顶指针);

3)mov eax,10 =>eax = 10;给eax寄存器赋值为10;

4)lea eax,[a] 将a的地址赋值给eax寄存器;

5)push 入栈

6)pop 出栈

7)sub add 加减运算

8)mov eax,dword ptr[a] 将a的值移动到eax中

接下来详细的解释一下整个过程:

 总结一下:

  1. 首先开辟调用方栈帧,将栈帧初始化;
  2. 压入实参,然后自右向左初始化形参;
  3. 将call指令的下一行指令的地址压入栈;
  4. 将调用方栈底地址压入栈中;
  5. 跳转到被调用方的栈帧中,并开辟内存;
  6. 函数返回值返回
    1)返回值 < 4字节  利用eax寄存器带回;
    2)4字节 < 返回值 < 8字节  利用eax,edx寄存器带回;
    3)返回值 > 8字节  利用临时量带回;
  7. 利用栈中存储的调用方栈底的指针回退到调用方栈中;
  8. 调用约定
    1)_cdecl   C标准调用约定
    2)_stdcall  windows标准调用约定
    3)_fastcall  快速调用约定
    4)_thiscall 类成员方法的调用约定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值