在嵌入式程序中,当一个函数调用发生时,它的内部机理是什么,执行了哪些步骤?如下所示是一个程序在运行时,它的内存分布状况。

当一个程序开始运行时,它的代码被装入到内存,保存在代码区,包括主函数和其他函数的代码。另外,还有三块内存区域用来存放数据。第一块是全局变量区域,存放了程序当中的所有全局变量。由于全局变量的个数和大小是已知的,所以这一块区域所占用的内存大小在开始时即可确定下来,它们被称为是静态分配。位于此区域内的变量,它们在程序的整个运行过程当中,都一直存在,只有当整个程序运行结束了, 这一块内存区域才会被释放。第二块区域是栈(stack)区域,它包含了所有的栈帧。所谓的栈帧( stack frame),就是在调用一个函数时,系统会自动地分配一块内存区域给这个函数,用来保存它的运行上下文、形参和局部变量等信息,这样的一块内存区域,就叫做一个栈帧。栈帧是在函数调用时分配的,当函数调用结束之后,相应的栈帧就会被释放。所以,对于一个函数的局部变量来说,只有当函数调用发生时,系统才会给这个函数的形参和局部变量分配存储空间;当函数调用结束后,这些局部变量就被释放掉了。另外,由于栈区域是由系统自动来分配的,用户并不需要去关心,所以也称为是自动分配。第三块区域是堆(heap) 区域,它主要是用作动态分配的内存。

如上图所示是函数调用的一个例子,它考察的是最简单的一种情形,即在整个程序当中,只有一个main函数。在这种情况下,当程序开始运行时,它就会被装入到内存。它的代码存放在内存的代码区域。由于在这个程序中定义了一个全局变量z,所以就在内存的全局变量区域分配了一个存储单元给它,并且把它初始化为0。接下来,系统就要调用主函数main去运行了,当这个函数调用发生时,系统就会在栈中给它分配一块内存空间,即一个栈帧,用来存放主函数当中所定义的局部变量,即x和y。随后,程序计数器PC就跳转到主函数的第一条语句, 开始执行。当main函数执行完后,首先要把它所占用的栈帧释放掉。对于任何一次函数调用来说,在函数调用结束后,都要把相应的栈帧释放掉,所以x和y这两个局部变量所占用的存储空间就被释放掉了,不能再访问了。接下来,由于main函数是一个特殊的函数,当它执行完之后,整个程序也就结束了。

当一次函数调用发生时,它的执行过程可以归纳为以下5个步骤:

  1. 在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参变量和局部变量。

  2. 把实参变量的值复制到相应的形参变量中。

  3. 控制流转移到该函数的起始位置。

  4. 该函数开始执行。

  5. 当这个函数执行完以后,控制流和返回值返回到函数调用点。

如下图所示是变量的存储与作用域的一个例子。

嵌入式程序调用函数的内部过程和机制相关推荐

  1. python程序调用函数的过程_Python_自定义函数_使用_运行流程

    定义函数会创建一个函数类的对象,有type函数. >>> type(print_new) 调用新函数的语法和调用内置函数是一样的,直接打印函数名: >>> prin ...

  2. python程序调用函数的过程是什么_Python:函数定义和调用时都加*,有什么作用?...

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:玩蛇网

  3. 补充函数编程,程序功能要求:有一个已知数组d,程序调用函数out输出数组 d的所有元素;调用函数plus对数组d中所有大于0的元素分别加上30;调用函数 cpy将d数组所有元素

    void  out(int *p,int n) {         int i=0;                                     //1分     for(i=0;i< ...

  4. 【C语言】案例二十一 从键盘输入一组数据,求出这一组数据的平均值并输出(调用函数)

    函数的定义 在C语言中最基础的程序模块就是函数,函数被视为程序中的基本逻辑单位,一个C语言程序由一个main()函数和若干个普通函数构成. 定义一个C函数的语法格式如下: 返回值类型 函数名([[参数 ...

  5. 利用c#实现远程注入非托管WIN32程序,并利用嵌入汇编调用非托管WIN32程序中的内部过程...

    c#通过调用windows API函数,可以很轻松的完成非托管WIN32程序的注入.内存读写等操作,以下为c#实现远程注入非托管WIN32程序,并利用嵌入汇编调用非托管WIN32程序中的内部过程的源码 ...

  6. 嵌入式裸机课程之C语言程序调用和重定位学习笔记

    一.汇编写启动代码之关看门狗 前期准备工作 1.1 什么是看门狗 看门狗(watchdog timer)电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合) 这种情况我们需要设备自动复位 ...

  7. 递归——函数在内部自己调用自己,那么该函数是递归函数 作用和循环效果一样 要加推出条件return,否则发生栈溢出,导致死循环 递归给数组中对象添加属性 toString()和随机数

    递归--函数在内部自己调用自己,那么该函数是递归函数 & 作用和循环效果一样 & 要加推出条件return,否则发生栈溢出,导致死循环 & 递归给数组中对象添加属性 & ...

  8. ASP程序中调用函数Now()显示上午下午的问题

    ASP程序中,调用函数Now(),显示的时间总是形如"2009-07-12 上午 08:12:56 "这样的,总显示"上午"和"下午",解决 ...

  9. 正确理解以下名词及其含义:(1)源程序,目标程序,可执行程序(2)程序编辑,程序编译,程序连接(3)程序,程序模块,程序文件 (4)函数,主函数,被调用函数,库函数

    正确理解以下名词及其含义: (1)源程序,目标程序,可执行程序. ​ 源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令 ​ 目标程序:为源程序经编译可直接被 ...

最新文章

  1. 电脑不能安装虚拟机--解决办法
  2. log4j无法打印日志的问题
  3. vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...
  4. PRNet:人脸3D重建与密集对齐
  5. 数据库基本常用类型解析
  6. asp.net下url参数含有中文读取后为乱码
  7. 如何利用ThoughtWorks.QRCode 生成二维码
  8. Flex 学习笔记 ComboBox内容框宽度
  9. sql server哪个版本比较好用_给视频加音乐的软件哪个比较好用?
  10. 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)
  11. 优化 | 线性化:0-1变量乘以连续变量的线性化
  12. 利用计算机网线传东西,2台电脑一根网线传文件(两台电脑直连网线做法)
  13. 投屏设置 android,上班摸鱼神器 Anlink安卓手机投屏操作体验
  14. Foundation框架 之 常见结构体、包装数据、日期
  15. 【Ubuntu】 Ubuntu16.04中设置使用root用户登录图形界面
  16. 常用设计模式系列(四)—建造者模式
  17. matlab中switch函数用法
  18. Python地理数据处理 二:Python基础知识
  19. C语言实现输出最长的名字
  20. 【人脸检测】centerface唐人街探案50fps

热门文章

  1. mysql的时间存储格式
  2. 机器学习入门(19)— 卷积网络 CNN 的简单实现
  3. java动态代理【一】
  4. MYSQL 连接数据库命令收藏
  5. GitLab安装说明
  6. IOS开发UISearchBar失去第一响应者身份后,取消按钮不执行点击事件的问题
  7. 九度OJ 1339:ACM (排序)
  8. linux if 命令判断条件总结
  9. [14] 薪酬迅速翻倍的13条跳槽原则
  10. 计算机函数模式的用处是啥,请问怎么理解计算机中的函数?