【C语言】深度剖析函数调用过程(栈帧)

今天写一下函数的调用过程。先看一个简单的代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>


int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = Add(a, b);
	printf("c= %d \n", c);
	system("pause");
	return 0;
}

我们发现其实每一次main函数都是在_tmainCRTStartup函数中调用的,而_tmainCRTStartup函数又是在mainC RTStartup函数被调用的。每一次函数的调用都是一个过程,称为函数调用过程

这个过程要为函数开辟栈空间,用于本次函数调用过程中的临时变量的保存、现场保护。这块栈空间我们称之为函数栈帧。

而在栈帧的维护中,我们用ebp和esp两个寄存器存放函数调用过程中的栈顶指针的栈底指针。

esp存放了指向函数栈帧栈顶的地址。

ebp存放了指向函数栈帧栈底的地址。

下图是具体的调用过程:

注:栈帧在不同编译器上实现存在差异,但是基本思想是一致的 

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/81176883
今日推荐