嵌入式程序调用函数的内部过程和机制
在嵌入式程序中,当一个函数调用发生时,它的内部机理是什么,执行了哪些步骤?如下所示是一个程序在运行时,它的内存分布状况。
当一个程序开始运行时,它的代码被装入到内存,保存在代码区,包括主函数和其他函数的代码。另外,还有三块内存区域用来存放数据。第一块是全局变量区域,存放了程序当中的所有全局变量。由于全局变量的个数和大小是已知的,所以这一块区域所占用的内存大小在开始时即可确定下来,它们被称为是静态分配。位于此区域内的变量,它们在程序的整个运行过程当中,都一直存在,只有当整个程序运行结束了, 这一块内存区域才会被释放。第二块区域是栈(stack)区域,它包含了所有的栈帧。所谓的栈帧( stack frame),就是在调用一个函数时,系统会自动地分配一块内存区域给这个函数,用来保存它的运行上下文、形参和局部变量等信息,这样的一块内存区域,就叫做一个栈帧。栈帧是在函数调用时分配的,当函数调用结束之后,相应的栈帧就会被释放。所以,对于一个函数的局部变量来说,只有当函数调用发生时,系统才会给这个函数的形参和局部变量分配存储空间;当函数调用结束后,这些局部变量就被释放掉了。另外,由于栈区域是由系统自动来分配的,用户并不需要去关心,所以也称为是自动分配。第三块区域是堆(heap) 区域,它主要是用作动态分配的内存。
如上图所示是函数调用的一个例子,它考察的是最简单的一种情形,即在整个程序当中,只有一个main函数。在这种情况下,当程序开始运行时,它就会被装入到内存。它的代码存放在内存的代码区域。由于在这个程序中定义了一个全局变量z,所以就在内存的全局变量区域分配了一个存储单元给它,并且把它初始化为0。接下来,系统就要调用主函数main去运行了,当这个函数调用发生时,系统就会在栈中给它分配一块内存空间,即一个栈帧,用来存放主函数当中所定义的局部变量,即x和y。随后,程序计数器PC就跳转到主函数的第一条语句, 开始执行。当main函数执行完后,首先要把它所占用的栈帧释放掉。对于任何一次函数调用来说,在函数调用结束后,都要把相应的栈帧释放掉,所以x和y这两个局部变量所占用的存储空间就被释放掉了,不能再访问了。接下来,由于main函数是一个特殊的函数,当它执行完之后,整个程序也就结束了。
当一次函数调用发生时,它的执行过程可以归纳为以下5个步骤:
在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参变量和局部变量。
把实参变量的值复制到相应的形参变量中。
控制流转移到该函数的起始位置。
该函数开始执行。
当这个函数执行完以后,控制流和返回值返回到函数调用点。
如下图所示是变量的存储与作用域的一个例子。
嵌入式程序调用函数的内部过程和机制相关推荐
- python程序调用函数的过程_Python_自定义函数_使用_运行流程
定义函数会创建一个函数类的对象,有type函数. >>> type(print_new) 调用新函数的语法和调用内置函数是一样的,直接打印函数名: >>> prin ...
- python程序调用函数的过程是什么_Python:函数定义和调用时都加*,有什么作用?...
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:玩蛇网
- 补充函数编程,程序功能要求:有一个已知数组d,程序调用函数out输出数组 d的所有元素;调用函数plus对数组d中所有大于0的元素分别加上30;调用函数 cpy将d数组所有元素
void out(int *p,int n) { int i=0; //1分 for(i=0;i< ...
- 【C语言】案例二十一 从键盘输入一组数据,求出这一组数据的平均值并输出(调用函数)
函数的定义 在C语言中最基础的程序模块就是函数,函数被视为程序中的基本逻辑单位,一个C语言程序由一个main()函数和若干个普通函数构成. 定义一个C函数的语法格式如下: 返回值类型 函数名([[参数 ...
- 利用c#实现远程注入非托管WIN32程序,并利用嵌入汇编调用非托管WIN32程序中的内部过程...
c#通过调用windows API函数,可以很轻松的完成非托管WIN32程序的注入.内存读写等操作,以下为c#实现远程注入非托管WIN32程序,并利用嵌入汇编调用非托管WIN32程序中的内部过程的源码 ...
- 嵌入式裸机课程之C语言程序调用和重定位学习笔记
一.汇编写启动代码之关看门狗 前期准备工作 1.1 什么是看门狗 看门狗(watchdog timer)电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合) 这种情况我们需要设备自动复位 ...
- 递归——函数在内部自己调用自己,那么该函数是递归函数 作用和循环效果一样 要加推出条件return,否则发生栈溢出,导致死循环 递归给数组中对象添加属性 toString()和随机数
递归--函数在内部自己调用自己,那么该函数是递归函数 & 作用和循环效果一样 & 要加推出条件return,否则发生栈溢出,导致死循环 & 递归给数组中对象添加属性 & ...
- ASP程序中调用函数Now()显示上午下午的问题
ASP程序中,调用函数Now(),显示的时间总是形如"2009-07-12 上午 08:12:56 "这样的,总显示"上午"和"下午",解决 ...
- 正确理解以下名词及其含义:(1)源程序,目标程序,可执行程序(2)程序编辑,程序编译,程序连接(3)程序,程序模块,程序文件 (4)函数,主函数,被调用函数,库函数
正确理解以下名词及其含义: (1)源程序,目标程序,可执行程序. 源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令 目标程序:为源程序经编译可直接被 ...
最新文章
- 电脑不能安装虚拟机--解决办法
- log4j无法打印日志的问题
- vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...
- PRNet:人脸3D重建与密集对齐
- 数据库基本常用类型解析
- asp.net下url参数含有中文读取后为乱码
- 如何利用ThoughtWorks.QRCode 生成二维码
- Flex 学习笔记 ComboBox内容框宽度
- sql server哪个版本比较好用_给视频加音乐的软件哪个比较好用?
- 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)
- 优化 | 线性化:0-1变量乘以连续变量的线性化
- 利用计算机网线传东西,2台电脑一根网线传文件(两台电脑直连网线做法)
- 投屏设置 android,上班摸鱼神器 Anlink安卓手机投屏操作体验
- Foundation框架 之 常见结构体、包装数据、日期
- 【Ubuntu】 Ubuntu16.04中设置使用root用户登录图形界面
- 常用设计模式系列(四)—建造者模式
- matlab中switch函数用法
- Python地理数据处理 二:Python基础知识
- C语言实现输出最长的名字
- 【人脸检测】centerface唐人街探案50fps