嵌入式C程序的编译与调试.ppt_第1页
嵌入式C程序的编译与调试.ppt_第2页
嵌入式C程序的编译与调试.ppt_第3页
嵌入式C程序的编译与调试.ppt_第4页
嵌入式C程序的编译与调试.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.1 C语言编译器、c语言编译器c语言编译过程Makefile、3.1.1 C语言编译器和c语言诞生于70年代初。 一九七八年美国电话电报公司(ATT )贝尔实验室正式发表c语言。 早期的c语言主要是UNIX系统上目前最流行的c语言编译器有GNU编译器收集、GCC Microsoft C或MS C Borland Turbo C或Turbo C、3.1.2 C语言编译过程。 编译器:编译器对源程序进行字句和语法分析,将高级语言指令转换为功能等效的程序集代码,从程序集转换为机器语言,并根据操作系统可执行文件格式的请求链接生成可执行文件。 c源程序头文件预编译处理(cpp )编译器自身优化程序汇

2、编链接程序-可执行文件预处理编译阶段优化阶段汇编进程链接程序、3.1.2.1编译预处理、预处理: 伪指令主要是通过这种替代方式(其中在诸如#ifdef、#ifndef、#else、#elif、#endif之类的宏定义指令、#define Name #undef条件编译指令、#include之类的报头文件中包括指令)来产生没有宏定义的、有条件的编译指令此文件的含义与未预处理的源文件相同,但内容不同。3.1.2.2编译阶段,预编译器创建的工作:词法分析将翻译成等效的中间代码表示或程序集代码。 3.1.2.3优化阶段,优化处理是编译系统中比较困难的技术。 不仅编译技术本身,而且与机器的硬件环境也有很

3、大关系的中间代码的优化,不依赖于具体的纠正算法器的主要工作是共同表示的删除、环优化(去代码、强度衰减、变换环控制条件、已知量的整合等)、转印传播、不必要的代入的删除目标代码的生成优化是具体的计算机利用存储在机器的各硬件寄存器中的相关变量的值,减少访问存储器的次数缩短目标代码, 必须将高效执行的优化程序集代码在程序集中转换为相应的机械指令的目标文件由段组成的代码段此段主要包含程序指令。 此段通常是可读的,可以执行,但通常不可写的。 数据段主要存储程序使用的各种全局变量或静态数据。 一般数据段是可读、可写和可执行的。 3.1.2.4汇编阶段,UNIX环境主要有三种目标文件。 可重定位文件包含适合链

4、接到其他目标文件以创建可执行或共享的目标文件的代码和数据。 共享的目标文件包含适合在两个上下文中链接的代码和数据。 第一个事件链接程序与可重定位文件和共享的目标文件一起处理,以创建另一个目标文件;第二个是动态链接程序将另一个可执行文件与共享的目标文件合并以创建进程映像可执行文件包含操作系统可以创建和执行进程的文件。 汇编程序生成的实际上是第一类目标文件。 后者还需要其他一些处理,这就是链接程序的工作。 在3.1.2.5链接阶段,链接程序将相关目标文件相互连接,以确保所有这些目标文件通过操作系统加载执行而成为统一的整体。目标文件或片段链接处理包括静态链接动态链接、3.1.3 Makefile、m

5、akefile或用于自动编译和链接的makefile可以记录文件的信息、链接时需要重新编译哪些文件3.2内置c程序的编译过程编译链接地址,3将源代码转换为可执行的二进制图像的过程源文件被编译或装配,并且目标文件(object file )可重定位程序(relocation programs ) 重新定位进程、3.2.2编译器、编译器、3.2.3链路、创建进程编译链路地址、3.2.4地址、创建进程编译链路地址、 3.3程序执行A.out及其传说段操作系统在A.out中做了什么c语言运行在A.out中做了什么函数调用时发生了什么Auto和static关键字Unix/Linux的堆栈段MS-DOS的

6、堆栈段,3.3.1 A.out -“assembler output”的缩写a.out文件格式分析a.out文件包含七个部分:也可以理解为exec header文件头) text segment 数据段文本重新定位段数据位置段符号表字符串表字符串表字符串表字符串表字符串表字符串表字符串在以前的UNIX系统中使用的可执行文件格式,由ATT进行了修订,基本上被ELF文件格式所取代。 段:是二进制文件的简单区域,具体类型(例如符号表条目) 的所有相关信息段都可以容易地映射到链接器在运行时可以直接加载的对象段在运行程序的内存区域中,这些段是运行程序中的一个内存区域。 每个区域具有特定的目标段特征的文本

7、段包含顺序的指令数据段用于存储初始化的全局变量和静态变量以及它们的值栈段,其中该值栈段用于存储传递给局部变量、临时数据、函数的残奥参数; 3.3.4 C语言在a.out中做了什么运行时数据结构种类堆栈活动记录数据堆栈,3.3.4 C语言在a.out中做了什么堆栈堆栈包含单个数据结构堆栈的动态存储区域当堆栈在提示堆栈中的当前顶层位置处的角色堆栈为函数内部声明中的局部变量提供存储空间以调用函数时,还可使用与堆栈存储相关联的一些维护信息堆栈作为临时存储区域。 3.3.4 C语言在a.out中做了什么,段的地址声明如何找到这些段的变量并打印它们的地址printf (“堆栈顶点is near % pn”

8、,I ); 返回0; 3.3.5函数调用时发生了什么,跟踪调用链c语言自动提供的服务等函数在调用结束了哪个函数实现机制:栈中的进程活动记录进程活动记录之后移动到调用点3.3.6 Auto和static关键字A.out及其传说段操作系统在A.out中做了什么c语言在A.out中做了什么函数调用时发生了什么Auto和static关键字Unix/Linux的堆栈段MS-DOS的堆栈堆积在Linux BSS区域上,随着程序继续要求内存而堆积,ps命令显示的过程消耗内存的大小也发生变化。堆栈(stack ) :是维持函数调用的系统堆栈,函数的残奥参数和局部变量(静态变量除外)存储在此。 堆栈位于进程内存区域的顶层段,随着函数的调用向下增加。 当函数回调时,堆栈向上回收,其中的关残奥参数和变量数据无效。 3.3.8 MS-DOS的堆栈段。 DOS需要在创建可执行文件时同时确定堆栈的大小,并且不能在运行时扩展。 确定堆栈大小的方法取决于所使用的编译器。 在Microsoft编译器中,程序员可以确定堆栈的大小作为链接器残奥仪表。 堆栈nnn此残奥定计量器指示Microsoft链接器将nn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论