编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt

编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt

ID:50066912

大小:693.50 KB

页数:70页

时间:2020-03-08

编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt_第1页
编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt_第2页
编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt_第3页
编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt_第4页
编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt_第5页
资源描述:

《编译原理 教学课件 作者 康慕宁 林奕 讲稿_6.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、第6章静态与运行时的存储管理内容可执行程序的生成与执行过程程序的存储布局与操作静态内存管理动态内存管理概述栈式管理堆管理和垃圾回收6.1可执行程序的生成与执行过程编译器生成可执行程序。可执行程序被加载到内存中,才能被CPU执行。源程序可执行程序子程序1CPU磁盘内存指令和数据硬件平台图6.1可执行程序的产生与执行编译与执行在相同硬件平台的情况非交叉编译环境的情况。如普通PC机。编译器生成可执行文件。操作系统执行程序。6.1可执行程序的生成与执行过程源程序可执行程序编译器CPU磁盘内存指令和数据加载器开发平台与执行平台(b)在同一台计算

2、机上开发和执行图6.2程序的加载交叉编译对于没有操作系统的嵌入式系统,采用独立的加载器(Loader),将可执行程序的二进制代码直接写入目标机器的ROM等存储器中。编译与执行在不同硬件平台的情况6.1可执行程序的生成与执行过程(a)交叉编译与程序加载源程序可执行程序编译器CPU磁盘内存指令和数据执行平台加载器开发平台图7.2程序的加载6.2可执行程序的存储布局与操作程序加载器将可执行的二进制代码拷贝到机器内存或ROM等存储器中,并为程序需要访问的静态变量分配存储空间和设置初始值。CPU只能访问特定地址空间的数据或指令,而不知道诸如ma

3、in、printf等函数名、变量名、类型名、行号(Label)等名字。编译器只有部分名字可在编译时为其分配固定的地址空间。其他名字的空间,只有在程序执行时才能动态计算获得。例6.1下面程序的主要功能是计算整数n的阶乘。inta=5;longfactorial(unsignedlongn)//求阶乘的函数{unsignedlongfr=0;if(n>1)fr=n*factorial(n-1);elsefr=n;returnfr;}intmain(intargc,char*argv[]){intn=0;intresult=0;n=2;re

4、sult=factorial(n);return0;}6.2可执行程序的存储布局与操作6.2可执行程序的存储布局与操作例6.1下面程序的主要功能是计算整数n的阶乘。inta=5;longfactorial(unsignedlongn)//求阶乘的函数{unsignedlongfr=0;if(n>1)fr=n*factorial(n-1);elsefr=n;returnfr;}intmain(intargc,char*argv[]){intn=0;intresult=0;n=2;result=factorial(n);return0;}

5、(1)编译时只能确定部分程序元素的地址:①变量a的地址可以被唯一确定。②函数main和函数factorial的地址可被唯一确定。factorial的指令序列main的指令序列全局变量存储区域:变量a占据一段内存区域,该区域数值为5.空闲内存区域图6.3程序加载后的内存布局说明:全局变量的存储空间在可执行文件中即已说明。其初始值也被存储在文件中。加载器将根据这些信息对全局变量区域进行初始化。6.2可执行程序的存储布局与操作(2)程序的执行编译器无法静态地确定函数参数、局部变量的地址值。因为每次函数调用时(尤其是递归调用时),很可能需要为

6、参数和局部变量分配不同的地址空间。图6.4给出的是求解2!时的程序执行与函数调用情况。图6.4递归调用过程inta=5;…intmain(…){intn=0;intresult=0;n=2;result=factorial(n);return0;}longfactorial(unsignedlongn){unsignedlongfr=0;if(n>1)fr=n*factorial(n-1);elsefr=n;returnfr;}longfactorial(unsignedlongn){unsignedlongfr=0;if(n>1)f

7、r=n*factorial(n-1);elsefr=n;returnfr;}(2)(3)(1)n为2参数n为2参数n为1局部变量fr为1局部变量fr为0局部变量fr为2factorial(n-1)执行完成后,n仍恢复为2两次递归调用return的地址不同两次递归调用return的地址不同难以在编译时静态确定的地址(1)子程序可能被多次调用,因此每次被调用子程序返回时都很可能需要回到不同的下一条指令位置。因此,在调用上面的factorial子程序时,需要告诉该子程序退出时应当返回到哪条指令继续执行。(2)每次对子程序调用时(尤其是发生递

8、归调用时),都需要为其分配一段独立的参数与局部变量地址。否则,后一次调用必然破坏之前尚未结束的调用所需的变量状态(例如上面例子第⑤步中参数n的情况)。(3)对于C/C++等允许动态内存分配的程序设计语言来说,需要提供对动

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。