函数调用栈

来源:互联网 发布:乌鲁木齐 中亚 知乎 编辑:程序博客网 时间:2024/04/28 15:16

栈通常是在用户空间的最高地址处分配,而堆则通常位于栈的下方。对于栈而言,先入栈的地址高,后入栈的地址低;对于堆来说,先进堆的地址低,后进堆的地址高。

#include <stdio.h>int sum(int a,int b){int tmp=0;tmp=a+b;return tmp;}int main(){int a=10;int b=20;int ret=0;ret=sum(a,b);printf("%d\n",ret);return 0;}

对于这样一段代码,查看反汇编(VS2012中快捷键Ctrl+F11),首先进入main函数和sum函数之前都有一段类似下图的代码,是开辟栈帧。


10200三个数依次入栈,然后执行ret=sum(a,b)是先压入参数,然后再调用sum函数。压参数是从左到右依次压入,主要是为了支持像printf这样的可变参函数。


函数执行完后都要这样一段代码,即栈帧回退,把栈顶指针回退到栈底。

栈上都是通过ebp偏移决定指针内存的,每一个函数的栈底都存放了调用它的函数地址。通过查看可知main函数不是程序启动之后的第一个进程,mainCRTstartup()会是调用main()的函数。


原创粉丝点击