函数的调用栈帧

       今天来给大家分享一下函数的调用过程。我也是刚刚开始学的,还请大家多多指教;我们最常说的一个代码是从main()函数开始的,但是main()函数就不调用参数么?那倒未必。现在就来看看main()函数的调用。

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

先看看这个代码,然后关于main()函数的调用。启用调用堆栈来查看。


那么我们说其实main()函数也是被调用的,如上图,main函数在_mainCRTStartup函数中调用的,而_mainCRTStartup函数是在mainCRTStartup中被调用。这就是简单的main函数的调用,

    如果要调用函数,那么就需要给函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。那么这块栈空间就称为函数栈帧。终于到正题了。再来哈,说说两个寄存器ebp和esp。在函数调用的过程中这两个寄存器放了维护这个栈的栈低和栈顶指针。来看看具体的图。(我这里着重说main函数,就举了两个函数)


如图,ebp存放了指向main函数栈帧栈低的地址;esp存放了指向main函数栈帧栈顶的地址。


接下来,让我们借助反汇编代码来研究研究函数的调用过程。

1.从main函数开始的地方,要展开main函数的调用就得为main函数创建栈帧,先来看main函数栈帧的创建。


2、接下里就是Add函数的调用了。




    执行call指令的时候按fn+f11,来到了下图。


在按fn+f11,进入Add函数的执行代码处。


函数的返回部分




到现在就把简单的函数调用栈帧给简单的说完了,我是在vs2013上面调试的,不同的编译器会有不同的结果,但是总体思路不变。   有上面问题,还请各位大神指点。




猜你喜欢

转载自blog.csdn.net/qq_40421919/article/details/80102928