嵌入式C程序的编译与调试.ppt

上传人:sh****n 文档编号:7456760 上传时间:2020-03-21 格式:PPT 页数:27 大小:367.84KB
返回 下载 相关 举报
嵌入式C程序的编译与调试.ppt_第1页
第1页 / 共27页
嵌入式C程序的编译与调试.ppt_第2页
第2页 / 共27页
嵌入式C程序的编译与调试.ppt_第3页
第3页 / 共27页
点击查看更多>>
资源描述
3 1C语言编译 C语言编译器C语言编译过程Makefile 3 1 1C语言编译器 C语言是在70年代初问世的 一九七八年由美国电话电报公司 AT T 贝尔实验室正式发表了C语言 早期的C语言主要是用于UNIX系统目前最流行的C语言编译器有以下几种 GNUCompilerCollection或称GCCMicrosoftC或称MSCBorlandTurboC或称TurboC 3 1 2C语言编译过程 编译 编译程序读取源程序 字符流 对之进行词法和语法的分析 将高级语言指令转换为功能等效的汇编代码 再由汇编程序转换为机器语言 并且按照操作系统对可执行文件格式的要求链接生成可执行程序 C源程序头文件 预编译处理 cpp 编译程序本身 优化程序 汇编程序 链接程序 可执行文件预处理编译阶段优化阶段汇编过程连接程序 3 1 2 1编译预处理 预处理 读取c源程序 对其中的伪指令 以 开头的指令 和特殊符号进行处理 伪指令主要包括以下四个方面 宏定义指令如 defineName undef条件编译指令如 ifdef ifndef else elif endif 头文件包含指令如 include FileName 或者 include等特殊符号如LINEFILE预编译程序所完成的基本上是对源程序的 替代 工作 经过此种替代 生成一个没有宏定义 没有条件编译指令 没有特殊符号的输出文件 这个文件的含义同没有经过预处理的源文件是相同的 但内容有所不同 3 1 2 2编译阶段 预编译程序所要作得工作 词法分析语法分析 翻译成等价的中间代码表示或汇编代码 3 1 2 3优化阶段 优化处理是编译系统中一项比较艰深的技术 它涉及到的问题不仅同编译技术本身有关 而且同机器的硬件环境也有很大的关系中间代码的优化不依赖于具体的计算机主要的工作是删除公共表达式 循环优化 代码外提 强度削弱 变换循环控制条件 已知量的合并等 复写传播 以及无用赋值的删除 目标代码的生成优化依赖于具体的计算机充分利用机器的各个硬件寄存器存放的有关变量的值 以减少对于内存的访问次数对指令进行一些调整使目标代码比较短 执行的效率比较高经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令 方可能被机器执行 3 1 2 4汇编阶段 汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程目标文件中所存放的也就是与源程序等效的目标的机器语言代码 目标文件由段组成代码段该段中所包含的主要是程序的指令 该段一般是可读和可执行的 但一般却不可写 数据段主要存放程序中要用到的各种全局变量或静态的数据 一般数据段都是可读 可写 可执行的 3 1 2 4汇编阶段 UNIX环境下主要有三种类型的目标文件 可重定位文件其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据 共享的目标文件这种文件存放了适合于在两种上下文里链接的代码和数据 第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个目标文件 第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起 创建一个进程映象 可执行文件它包含了一个可以被操作系统创建一个进程来执行之的文件 汇编程序生成的实际上是第一种类型的目标文件 对于后两种还需要其他的一些处理方能得到 这个就是链接程序的工作了 3 1 2 5链接阶段 链接程序是将有关的目标文件彼此相连接 使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体 目标文件由段组成链接处理可分为两种 静态链接动态链接 3 1 3Makefile makefile是用于自动编译和链接的makefile能够纪录文件的信息 决定在链接的时候需要重新编译哪些文件 3 2嵌入式C程序的编译过程 创建过程编译链接定址 3 2 1创建过程 源代码转换为可执行的二进制映像的过程源文件都被编译或汇编到一个目标文件 objectfile 可重定位程序 relocatableprogram 重定址 relocation 的过程 3 2 2编译 编译器的工作主要是把用人可读的语言所书写的程序 翻译为特定的处理器上等效的一系列操作码 3 2 3链接 创建过程编译链接定址 3 2 4定址 创建过程编译链接定址 3 3程序运行 A out及其传说段操作系统在a out里干了什么C语言运行在a out里干了什么函数调用时发生了什么Auto和static关键字Unix Linux的堆栈段MS DOS的堆栈段 3 3 1A out及其传说 A out assembleroutput 汇编程序输出 的缩写形式a out文件格式分析a out文件包含7个section 格式如下 execheader 执行头部 也可理解为文件头部 textsegment 文本段 datasegment 数据段 textrelocations 文本重定位段 datarelocations 数据重定位段 symboltable 符号表 stringtable 字符串表 a out是早期UNIX系统使用的可执行文件格式 由AT T设计 现在基本上已被ELF文件格式代替 3 3 2段 段 segments 是二进制文件中简单的区域 里面保存了和某种特定类型 如符号表条目 相关的所有信息段可以方便地映射到链接器在运行时可以直接载入的对象中段在正在执行的程序中是一块内存区域 每个区域都有特定的目的 3 3 3操作系统在a out里干了什么 为什么a out要以段的形式组织段可以方便地映射到链接器在运行时可以直接载入的对象中 段在正在执行的程序中是一块内存区域 每个区域都有特定的目的段特点文本段包含序的指令数据段包含经过初始化的全局和静态变量以及它们的值堆栈段用于保存局部变量 临时数据 传递到函数中的参数 3 3 4C语言运行在a out里干了什么 运行时数据结构种类堆栈活动记录 activationrecord 数据堆 3 3 4C语言运行在a out里干了什么 堆栈段堆栈段包含一种单一的数据结构 堆栈一块动态内存区域 实现了一种 后进先出 的结构sp 用于提示堆栈当前的顶部位置堆栈段作用堆栈为函数内部声明的局部变量提供存储空间进行函数调用时 堆栈存储与此有关的一些维护性信息堆栈也可以被用作暂时存储区 3 3 4C语言运行在a out里干了什么 如何找到段的地址声明位于这些段的变量 并打印它们的地址在不同的计算机架构和不同的操作系统中 堆栈的位置可能各不相同例 includemain inti printf Thestacktopisnear p n i return0 3 3 5函数调用时发生了什么 跟踪调用链C语言自动提供的服务哪些函数调用了哪些函数实现机制 堆栈中的过程活动记录过程活动记录是一种数据结构支持过程调用记录调用结束以后返回调用点所需要的全部信息 3 3 6Auto和static关键字 A out及其传说段操作系统在a out里干了什么C语言运行在a out里干了什么函数调用时发生了什么Auto和static关键字Unix Linux的堆栈段MS DOS的堆栈段 3 3 7Unix Linux的堆栈段 堆栈会自动生长堆栈段 stacksegment 包括两部分 堆 heap 供动态内存 通过malloc申请的 堆在BSS区域的上方 随着程序不断申请内存 堆会向上增长 ps命令显示的进程占用内存的大小也会随之变化 栈 stack 就是维护函数调用的系统栈 函数的参数和本地变量 除去静态变量 储存在这里 栈位于进程内存空间的最高段 并随着函数的调用向下增长 函数回调时 栈向上收回 其中的参数和变量数据作废 3 3 8MS DOS的堆栈段 在DOS中 在建立可执行文件时 堆栈的大小必须同时确定 而且它不能在运行时增长 确定堆栈大小的方法根据所使用的不同编译器而不同在Microsoft编译器中 程序员可以把堆栈的大小作为一个链接器参数来确定 STACK nnn这个参数告诉Microsoft链接器为堆栈分配nnn字节 Borland编译器则使用一个特殊名字的变量 unsignedint stklen 0 x4000 16K堆栈 本章总结 C语言编译过程 C语言的编译与运行 C语言程序的运行 嵌入式编译过程 描述C语言的编译过程 讲述嵌入式编译的过程 深入讲述定址链接和定址 简单讲述C程序的运行特性
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!