从指令交读掌握函数调用堆栈详细过程

本文深入探讨了C++中函数调用的过程,特别是main函数如何调用sum函数以及执行完成后如何返回。通过示例代码解释了栈帧的建立、参数传递、返回值存储以及如何确定后续执行指令。涉及关键概念如ESP、EBP寄存器的作用,并展示了函数调用的底层指令实现。

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

int sum(int a, int b)
{
	int temp = 0;
	temp = a + b;
	return temp;
}

int main()
{
	int a = 10; //
	int b = 20;
	int ret = sum(a, b);
	cout << ret << endl;
}

1 mian函数调用sum,sum执行完以后,怎么知道回到那个函数?

2 sum函数执行完,回到main以后,怎么知道从哪一行指令继续执行呢 ?

在这里插入图片描述

  • ESP:存储的是当前函数栈帧栈顶的地址
  • EBP:存储的是main函数栈底的地址
int a = 10 => mov dword ptr[a], 0Ah 或者 mov dword ptr[ebp - 4], 0Ah
int b = 20; => mov dword ptr[ebp - 8], 14h

在这里插入图片描述

sum(a, b) 
= >
mov eax, dword ptr[ebp-8] 
push eax // b
mov eax, dword ptr[ebp-4]
push eax //a

在这里插入图片描述

int ret = sum(a, b)
call sum
add esp, 8 // 地址为0x08124458
mov dword ptr[ebh - 0Ch], eax

在这里插入图片描述


int sum(int a,  int b)
{  // push ebp
      mov ebp, esp
      sub esp, 4Ch
	int temp = 0; mov dword ptr[ebp  - 4] 0
	temp = a + b; mov eax, dword ptr[ebp + 0Ch] a + b  mov dword ptr[ebp - 4], eax
	return temp; mov eax, dword ptr[ebp - 4]
}// mov esp, ebp
    pop ebp

在这里插入图片描述

ret // 出栈操作 把出栈的内容放入CPU的PC寄存器里面

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值