函数的调用及栈帧的创建和销毁

来源:互联网 发布:nba2k16库里数据 编辑:程序博客网 时间:2024/05/22 03:09

实例代码为:环境为vc++6.0

为了研究函数过程调用,我们先来了解几个寄存器,esp:堆栈指针寄存器,指向栈顶。ebp:基址寄存器,指向栈底。

eip/ip/pc:程序计数器。程序计数器保存的内容永远是当前正在执行指令的下一条指令的地址。

call:在调用函数的时候用。 1.通过修改eip来实现函数的跳转(jmp跳转)。

   2.将当前正在执行指令的下一条指令的地址保存起来,以便返回。

ret:将当前的栈顶的位置(返回值地址)返回到main函数里。在返回的时候要保证现在的内容写在ip里。

#include<stdio.h>
int myfunction(int x,int y)
{
int z=x+y;
return z;
}
int main()
{
int a=0xaaaaaaaa;
int b=0xbbbbbbbb;
int c=myfunction(a,b);
printf("you should run here!ret=%d\n",c);
return 0;
}

一.调用栈


首先我们通过打开call stack(调用堆栈)可以看出一个程序在运行的时候第一个执行的函数不是main函数,从这张图可以看出main函数是由mainCRTstartup()所调用,main函数虽然不是第一个被调用的函数,但main函数却是应用逻辑中的入口函数.所谓栈,是一种先进后出的数据结构,每一次的函数调用都是一个过程,在这个过程中要开辟一段栈空间,用于保存过程中的临时变量,现场保护,这段栈空间我们称为函数栈帧。



这张图清楚的展示了c程序的内存空间,栈通常是在用户空间的最高地址处分配,而堆通常位于栈的下方。对于栈而言,先入栈的低至高,后入栈的地址低,stack向下生长,即地址从大到小,而堆heap正好相反。

二.利用call调用myfunction函数




函数在形参实例化的顺序是从右到左的,从右到左的进行压栈。







三.执行后释放函数空间返回调用主函数





此时eip的内容变为00401093,即call的下一条指令的地址。





此时调用myfunction函数之后,和在调用myfunction函数之前是一样的,函数调用过程中调用的变量叫做临时变量,在当前调用函数的栈帧的栈顶结构处。函数调用调用之后的函数之中的变量以及栈帧结构都被释放掉,所以函数的临时变量具有临时性。每调用一个函数就是形成一个栈帧结构的过程,返回之后释放。函数返回通过寄存器返回。









原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗流脓鼻涕拉稀没食欲怎么办 孕妇眼睛充血很快就有眼屎怎么办 婴儿的眼睛流泪生眼屎怎么办呀 刚出生的婴儿眼睛有眼屎怎么办 25天的婴儿鼻子有鼻屎不通怎么办 一个月的宝宝好多鼻屎怎么办 隆鼻取线的时候好多鼻屎怎么办 小孩流浓鼻涕怎么办最简单方法 小孩流黄鼻涕怎么办最简单方法 一岁八个月宝宝鼻涕和痰多怎么办 空调铜管过不了预埋管的弯头怎么办 如果朝鲜和韩国打起来中国怎么办 寄信时不知道对方的邮编怎么办 地下钱庄转账后银行户被冻结怎么办 老师遇到素质极差的垃圾学生怎么办 验证码忘了手机号也换了怎么办 手机上的验证码忘了怎么办 进入医联网的验证码忘了怎么办 育碧换电脑了无法同步云存档怎么办 刺客信条起源育碧需要激活码怎么办 电脑连不上网怎么办wifi可以用 电脑登录账号密码错误锁定了怎么办 白色T恤衫上沾上黑色的黄油怎么办 家教遇到成绩好的学生该怎么办 跟越南人离婚孩子中国户口9怎么办 老婆是个越南人至今没户口怎么办 等离子屏z板链接处排线打火怎么办 等离子自动调焊的成形不好怎么办 村里内村道路中间被抢占了怎么办 华为换电池之后卡没反应怎么办 汽车钥匙换电池后没反应怎么办 汽车解锁换电池后没反应怎么办 包裹显示待收件人向海关申报怎么办 在越南签证被公安扣了怎么办 酷派手机收不到验证码怎么办 苹果想把图片上的字盖上怎么办 婴儿自己把眼珠子抠红了怎么办 如果美陆战队员进入台湾那怎么办? 顺产生完小孩吸不通奶怎么办 耐克空军一号白色底发黄怎么办 中行网银u盾丢了怎么办