文档章节

函数调用的过程

种地瓜
 种地瓜
发布于 2016/10/03 21:33
字数 507
阅读 21
收藏 2

转:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html

#include <stdio.h>

int func(int param1 ,int param2,int param3)
{
        int var1 = param1;
        int var2 = param2;
        int var3 = param3;
 
        printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);
        return var1;
}
 
int main(int argc, char* argv[])
{
        int result = func(1,2,3);
 
        return 0; 
}

首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。

 

下面来逐步分析函数的调用过程

1.函数main执行,main各个参数从右向左逐步压入栈中,最后压入返回地址

2.执行第15行,3个参数以从左向右的顺序压入堆栈,及从param3到param1,栈内分布如下图:

 3.然后是返回地址入栈:此时的栈内分布如下:

4.第3行函数调用时,通过跳转指令进入函数后,函数地址入栈后,EBP入栈,然后把当前ESP的值给EBP,对应的汇编指令

push ebp
mov ebp esp

   此时栈顶和栈底指向同一位置,栈内分布如下:

 

5.第5行开始执行, int var1 = param1; int var2 = param2; int var3 = param3;按申明顺序依次存储。对应的汇编:

mov 0x8(%ebp),%eax
mov %eax,-0x4(%ebp)

  其中将[EBP+0x8]地址里的内容赋给EAX,即把param的值赋给EAX,然后把EAX的中的值放到[EBP-4]这个地址里,即把EAX值赋给var1,完成C代码 int var1 = param1,其他变量雷同。

6.第9行,输出结果,第10行执行 对应的汇编代码:

mov  -0x4(%ebp),%eax

7.调用执行函数完毕,局部变量var3,var2,var1一次出栈,EBP恢复原值,返回地址出栈,找到原执行地址,param1,param2,param3依次出栈,函数调用执行完毕。图略

 

 

-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

还有这篇博客也写的不错

http://blog.csdn.net/songuooo/article/details/7855221

 

 

 

 

本文转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html

共有 人打赏支持
种地瓜
粉丝 9
博文 175
码字总数 44807
作品 0
深圳
程序员
Oracle专题14之存储过程与函数

1、存储过程与函数的概述 存储过程和存储函数:是存储在数据库中的被命名的PLSQL块,供所有用户程序调用,完成特定功能的子程序。 a、存储过程和存储函数的区别 是否使用return返回值。(即存...

极客微信条
2017/12/19
0
0
Oracle --存储函数和存储过程

oracle提供可以将pl/sql程序块存储在数据库中,并可以在任何地方运行它,这种pl/sql程序块称为存储过程或函数。 存储过程和函数的区别:函数需要向调用者返回数据,而过程不需要返回数据。 ...

求是科技
2015/08/11
0
0
Delphi的一些重要语法

本文转自 xkdcc 51CTO博客,原文链接:http://blog.51cto.com/brantc/116479,如需转载请自行联系原作者 一. 流程控制语句 1.1 Case Statements 二. 类型 2.1 过程类型 用法3的类型表示方法指...

像教授
2017/11/26
0
0
oracle --存储过程、函数、包

存储过程和函数是一种PL/SQL块,是存入数据库的PL/SQL块。我们通常将PL/SQL程序块称为无名块,而存储过程和函数是以命名的方式存储在数据库中。它有如下优点: 1>存储过程的代码不是保存在本...

求是科技
2015/04/13
0
0
mysql存储过程 in out inout

存储过程的好处 存储过程是一组预编译好的sql语句,用来执行某个特定的功能。这样可以省去sql解析、编译、优化的过程,提高了执行效率,同时,在调用的时候只传一个存储过程的名称,而不用传...

梧桐深院
06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
24分钟前
0
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部