第三章-程序设计基础PPT课件_第1页
第三章-程序设计基础PPT课件_第2页
第三章-程序设计基础PPT课件_第3页
第三章-程序设计基础PPT课件_第4页
第三章-程序设计基础PPT课件_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

基于s3c44B0X嵌入式uCLinux系统原理及应用 主讲人 李岩哈尔滨理工大学计算机学院 本章主要内容 1 GCC编译过程 2 C C 交叉编译器arm elf gcc 3 交叉汇编器arm elf as 4 交叉连接器arm elf ld 5 工程管理器make 6 汇编语言编程 7 混合编程 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld3 1需求分析 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld3 1需求分析 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 1GNUGCC简介 GNU集成编译环境GCC GNUCompilerCollection 是一种面向嵌入式领域 支持多种编程语言 支持多种CPU的交叉编译工具 输出预处理后的C C 源程序 展开头文件和替换宏 输出C C 源程序的汇编代码输出二进制目标文件生成静态库生成可执行程序转换文件格式 GNUGCC的基本功能 3 1GNUGCC简介 GCC组成 C C 交叉编译器arm elf gcc arm elf gcc是编译的前端程序 它通过调用其他程序来实现将程序源文件编译成目标文件的功能 arm elf gcc具有丰富的命令选项 可以控制编译的各个阶段 满足用户的各种编译需求 3 1GNUGCC简介 GCC组成 汇编器arm elf as arm elf as将汇编语言程序转换为ELF ExecutableandLinkingFormat 执行时链接文件格式 格式的可重定位目标代码 这些目标代码同其它目标模块或函数库易于定位和链接 说明 arm elf as产生一个交叉参考表和一个标准的符号表 产生的代码和数据能够放在多个区 Section 中 3 1GNUGCC简介 GCC组成 连接器arm elf ld arm elf gcc是编译的前端程序 arm elf ld根据链接定位文件Linkcmds中的代码区 数据区 BSS区和栈区等定位信息 将可重定位的目标模块链接成一个单一的 绝对定位的目标程序 3 1GNUGCC简介 GCC组成 库管理器arm elf ar arm elf ar将多个可重定位的目标模块归档为一个函数库文件 3 1GNUGCC简介 GCC组成 工程管理器MAKE arm elf gccMake是用于自动编译 链接程序的实用工具 使用make后就不需要手工的编译每个程序文件 要使用make 首先要编写makefile Makefile描述程序文件之间的依赖关系 并提供更新文件的命令 3 1GNUGCC简介 GCC组成 其他实用程序 arm elf objcopy目标文件格式转换工具等 3 1GNUGCC简介 GCC编译程序的基本过程 arm elf gcc根据输入文件的后缀来确定文件的类型 然后根据用户的编译选项 包括优化选项 调试信息选项等 将其编译成相应的汇编临时文件 后缀为 s arm elf as将该汇编文件编译成目标文件 后缀为 o arm elf ld根据用户的链接选项 包括指定链接命令文件等 将目标文件和各种库链接起来生成可执行文件 程序的编译过程 C C 源文件 Arm elf gcc 头文件 汇编文件 Arm elf as 目标文件 源文件列表 生成库 连接命令文件 可重定位模块 Arm eif ld Arm elf ar 用户库 库列表 可执行程序 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld3 1需求分析 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 概述 3 2C C 交叉编译器arm elf gcc 命令格式 arm elf gcc options file 在命令arm elf gcc后面跟一个或多个选项 选项间用空格隔开 然后跟一个或多个目标文件 例如 将test c编译成目标文件test o并且生成调试信息 arm elf gcc g c otest otest c 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 c将输入的源文件编译成目标文件 S将C C 文件生成汇编文件 ofile将输出内容存于文件file pipe在编译的不同阶段之间采用管道通讯方式 v打印出编译过程中执行的命令 xlanguage说明文件的输入类型为language 输出控制选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 ansi支持所有ANSIC程序 C语言选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 w关闭所有警告 Wall打开所有警告 Wimplicit如果有隐含申明 显示警告信息 Wno implicit不显示对隐含申明的警告 警告选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 g在文件中产生调试信息 调试信息的文件格式有stabs COFF XCOFF DWARF 调试选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 O0不优化 O1一级优化 O2二级优化 O3三级优化 优化选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 E运行C的预处理器 C在运用 E进行预处理时不去掉注释 Dmacro定义宏macro为1 Dmacro defn定义宏macro为defn 预处理选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 Wa option将选项option传递给汇编器 汇编选项 概述 3 2C C 交叉编译器arm elf gcc 命令选项列表 Idir设置搜索路径为dir I 指定只对 include file 有效的头文件搜索目录 搜索路径选项 概述 3 2C C 交叉编译器arm elf gcc 源文件类型的识别 c C源文件 i 经过预处理后的C源文件 h C头文件 ii 经过预处理后的C 源文件 cc C 源文件 cxx C 源文件 cpp C 源文件 C C 源文件 s 不需要预处理的汇编文件 S 需要预处理的汇编文件 arm elf gcc能够自动根据文件名后缀识别文件类型 命令使用 3 2C C 交叉编译器arm elf gcc 例如 将test c编译成汇编程序并存放于文件test txt arm elf gcc S otest txttest c ofile将输出内容存于文件file 仅适用于只有一个输出文件时 输出文件名的指定 命令使用 3 2C C 交叉编译器arm elf gcc 例如 将test c编译成test o arm elf gcc c otest otest c c将输入的源文件编译成目标文件 目标文件的生成 命令使用 3 2C C 交叉编译器arm elf gcc 例如 将test c编译生成汇编文件test s arm elf gcc S otest stest c S将C C 文件生成汇编文件 将C C 文件生成汇编文件 命令使用 3 2C C 交叉编译器arm elf gcc 例如 对test c进行预处理并将结果输出到屏幕 arm elf gcc Etest c E只对源文件进行预处理并且缺省输出到标准输出 预处理文件的生成 命令使用 3 2C C 交叉编译器arm elf gcc 头文件的引用有两种形式 一种是 include filename 一种是 include 前一种形式的路径搜索顺序是 当前目录 指定的搜索路径 后一种形式只搜索指定路径 Idir将目录dir添加到头文件搜索目录列表的第一项 I I 以前用 I指定的头文件搜索目录只对 include file 有效 对 include无效 I 以后指定的头文件搜索目录对以上两种形式的头文件都有效 设置头文件搜索路径 命令使用 3 2C C 交叉编译器arm elf gcc 头文件的引用有两种形式 一种是 include filename 一种是 include 前一种形式的路径搜索顺序是 当前目录 指定的搜索路径 后一种形式只搜索指定路径 Idir I 设置头文件搜索路径 例如 编译test c 在当前目录和 include中搜索test c所包含的头文件 arm elf gcc I I include ctest c 命令使用 3 2C C 交叉编译器arm elf gcc 例如 如果有隐含申明 显示警告信息 arm elf gcc c Wimplicittest c不显示对隐含申明的警告 arm elf gcc c Wno implicittest c常用的警告选项有 w关闭所有警告信息 Wall打开所有警告信息 可以使用以 W开头的不同选项对特定警告进行设定 对于每种警告类型都有相应以 Wno 开始的选项关闭警告 控制警告产生 命令使用 3 2C C 交叉编译器arm elf gcc O1可以部分减小代码尺寸 对运行速度有一定的提高 较多地使用了寄存器变量 提高指令的并行度 O2除了解循环 函数插装和静态变量优化 几乎包含arm elf gcc所有优化选项 一般在生成固化代码时使用该选项较为适宜 O3包含 O2的所有优化 并且还包含了解循环 函数插装和静态变量优化 通常情况下 该级优化生成的代码执行速度最快 但是代码尺寸比 O2大一些 arm elf gcc支持多种优化选项 总体上划分为三级优化 实现优化 命令使用 3 2C C 交叉编译器arm elf gcc 例如 编译test c并且预定义宏RUN CACHE值为1 arm elf gcc c DRUN CACHEtest c编译test c并且预定义宏RUN CACHE值为0 arm elf gcc c DRUN CACHE 0test c Dmacro定义宏macro为1 Dmacro defn定义宏macro为defn 在命令行定义 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 概述 3 2交叉连接器arm elf ld 命令格式 arm elf ld option file 命令行后跟选项和可重定位的目标文件名 例如 链接的输入文件为demo o 输出文件为demo elf 链接的库为libxxx a 生成内存映象文件map txt 链接定位文件为linkcmds 则命令如下 arm elf ld Mapmap txt Tlinkcmds L lib odemo elfdemo o lxxx 概述 3 2交叉连接器arm elf ld 命令选项列表 eentry指定程序入口 M输出链接信息 lar指定链接库 Ldir添加搜索路径 o设置输出文件名 Tcommandfile指定链接命令文件 v显示版本信息 Map制定输出映像文件 命令使用 3 2交叉连接器arm elf ld 程序入口地址 eentry以符号entry作为程序执行的入口地址 而不从默认的入口地址开始 例如 链接的输入文件为demo o 输出文件为demo elf 链接定位文件为linkcmds 将入口地址设为 start 命令如下 arm elf ld Tlinkcmds e start odemo elfdemo o 命令使用 3 2交叉连接器arm elf ld 输出链接信息 M在标准端口打印出符号映象表和内存分布信息 例如 链接的输入文件为demo o 输出文件为demo elf 在标准端口打印出符号映象表和内存分布信息 命令如下 arm elf ld M odemo elfdemo o如果标准输出设置为显示器 运行命令后将在显示器上显示内存映象信息和符号映象表 命令使用 3 2交叉连接器arm elf ld 输出链接信息 Mapmapfile将链接的符号映象表和内存分布信息输出到文件mapfile里 例如 链接的输入文件为demo o 输出文件为demo elf 将链接的符号映象表和内存分布信息输出到文件map txt里 命令如下 arm elf ld Mapmap txt odemo elfdemo o 命令使用 3 2交叉连接器arm elf ld 指定链接的库出 lar指定库文件libar a为链接的库 可以重复使用 l来指定多个链接的库 例如 链接的输入文件为demo o 指定libxxx a为链接的库 输出文件为demo elf 命令如下 arm elf ld odemo elfdemo o lxxx 命令使用 3 2交叉连接器arm elf ld 添加库和脚本文件的搜索路径 Ldir将dir添加到搜索路径 例如 例如 链接的输入文件为demo o 输出文件为demo elf 将 lib添加到库的搜索路径 命令如下 arm elf ld L lib odemo elfdemo o 命令使用 3 2交叉连接器arm elf ld 设置输出文件的名字 ooutput将输出文件名字设定为output 如果不指定输出文件名 arm elf ld生成文件名默认为a out 例如 链接的输入文件为demo o 输出文件为demo elf 命令如下 arm elf ld odemo elfdemo o linkcmds连接命令文件 3 2交叉连接器arm elf ld 调用linkcmds 首先写一个链接命令文件linkcmds 然后在arm elf ld的命令中使用 Tlinkcmds参数 就能在链接时自动调用linkcmds文件 例如 链接的输入文件为demo o 输出文件为demo elf 链接定位文件为linkcmds 则命令如下 arm elf ld Tlinkcmds odemo elfdemo o linkcmds连接命令文件 3 2交叉连接器arm elf ld 编写linkcmds arm elf ld的命令语言是一种描述性的脚本语言 它主要应用于控制 有哪些输入文件 文件的格式怎样 输出文件中的模块怎样布局 分段的地址空间怎样分布 以及未初始化的数据段怎样处理等 用命令语言写成的文件 通常称为linkcmds 具有可重用性 不必每次在命令行输入一大堆命令选项 并且对于不同的应用 只需对linkcmds进行简单的修改就可以使用 linkcmds连接命令文件 3 2交叉连接器arm elf ld 编写linkcmds 1 arm elf ld命令语言 2 表达式 3 linkcmds的结构 4 对程序入口的说明 5 对程序头的说明 6 对内存布局的说明 7 对分段的说明 8 注释 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 3工程管理器make 概述 命令格式 make fmakefile option target make命令后跟 f选项 指定makefile的名字为makefile option表示make的一些选项 target是make指定的目标 在3 4 3将详细说明 例如 makefile的名字是my hello make make fmy hello make 3 3工程管理器make 概述 命令选项列表 f指定makefile e使环境变量优先于makefile的变量 Idir设定搜索目录 i忽略make过程中所有错误 n只显示执行过程 而不真正执行 r使隐含规则无效 w显示工作目录 Cdir读取makefile设置的工作目录 s不显示执行的命令 3 3工程管理器make 命令使用 指定makefile fmakefile用该选项指定makefile的名字为makefile 如果make中多次使用 f指定多个makefile 则所有makefile将链接起来作为最后的makefile 如果不指定makefile make默认的makefile依次为 makefile Makefile 例如 make fmy hello make 3 3工程管理器make 命令使用 指定环境变量优先于makefile文件中的变量 e使环境变量优先于makefile文件中的变量 例如 make e 3 3工程管理器make 命令使用 指定包含文件的搜索路径 Idir指定在解析makefile文件中的 include时的搜索路径为dir 如果有多个路径 将按输入顺序依次查找 例如 make I include mk 3 3工程管理器make 命令使用 忽略错误 i忽略make执行过程中的所有错误 例如 make i 3 3工程管理器make 命令使用 显示命令的执行过程 n只显示命令的执行过程而不真正执行 例如 make n 3 3工程管理器make 命令使用 使隐含规则无效 r使make的隐含规则无效 清除后缀名规则中默认的后缀清单 例如 make r 3 3工程管理器make 命令使用 显示执行过程中的工作目录 w显示make执行过程中的工作目录 例如 make w 3 3工程管理器make 命令使用 读取makefile文件前设置工作目录 Cdir在读取makefile文件以前将工作目录改变为dir 完成make后改回原来的目录 例如 make Cbsp 3 3工程管理器make 命令使用 不显示所执行的命令 s运行make时用选项 s可以不显示执行的命令 只显示生成的结果文件 例如 make s 3 3工程管理器make 编写一个makefile makefile的结构 makefile文件包含 显式规则隐含规则变量定义指令注释 3 3工程管理器make 编写一个makefile 编写makefile中的规则 targets dependenciescommand 或者targets dependencies commandcommand 指定目标名 通常是一个程序产生的目标文件名 也可能是执行一个动作的名字 名字之间用空格隔开 描述产生target所需的文件 一个target通常依赖于多个dependency 用于指定该规则的命令 3 3工程管理器make 编写一个makefile 例如 smcinit smc oconfig oarm elf ar ruvs osmcinit asmc oconfig osmc o smc cinclude harm elf gcc c osmc osmc cconfig o config cinclude harm elf gcc c oconfig oconfig cclean rm o表示目标名的有smcinit smc o config o smcinit依赖于smc o和config o 而smc o又依赖于smc c和include h config o依赖于config o和include h 各目标分别由命令arm elf ar ruvs osmcinit asmc oconfig o arm elf gcc c osmc osmc c arm elf gcc c oconfig oconfig c来生成 clean为一动作名 删除所有后缀为 o的文件 编写makefile中的规则 3 3工程管理器make 编写一个makefile makef调用makefile中的规则 在默认情况下 make运行不是以 开头的第一条规则 在上面的例子中 make默认执行的是规则smcinit 此时只需要输入命令 makemake将读入makefile 然后执行第一条规则 例子中该规则是链接目标文件生成库 因此必须执行规则smcinit依赖的规则smc o和config o 在执行过程中将自动更新他们所依赖的文件 有些规则不是被依赖的规则 需要make指定才能被运行 如上面的例子中的clean规则可以这样执行 makeclean这两种方式的结果一样 只是第一种方式没指明目标名 第二种方式指明了目标名 3 3工程管理器make 编写一个makefile 设置makefile中文件的搜索路径 在makefile中 可以通过给VPATH赋值来设置规则中目标文件和依赖文件的搜索目录 make首先搜索当前目录 如果未找到依赖的文件 make将按照VPATH中给的目录依次搜索 3 3工程管理器make 编写一个makefile 如何定义变量 在makefile中变量可以被这样定义 CC arm elf gccAS arm elf asAR arm elf arLIBPATH lib从上面的定义中可以看出 有两种定义变量的形式 变量名 值变量名 值 为了简化makefile以及减少不必要的错误 可以用变量的形式来代表目标文件名或字符串 在需要使用时直接调用变量 3 3工程管理器make 编写一个makefile 引用变量 有两种方式 VarName VarName 两种方式的效果一样 VarName表示变量名 3 3工程管理器make 编写一个makefile make提供的常用变量 例如 demo o demo cdemo h CC CFLAGS o 的值为demo c 的值为demo o 而 的值为demo cdemo h 表示目标名 表示所有的依赖文件 第一个依赖文件 3 3工程管理器make 编写一个makefile make里的常用函数 常用的函数有 1 substfrom to text 将字text中的from子串替换为to子串 2 patsubstpattern replacement text 按模式pattern替换text中的字串 函数的使用方式有两种 functionarguments functionarguments 3 3工程管理器make 编写一个makefile 隐含规则 实际上使用的隐含规则如下所示 对 c o的隐含规则为 o c CC CFLAGS o的隐含规则为 o s AS ASFLAGS o 隐含规则是指由make自定义的规则 常用的有 由 c的文件生成 o的文件由 s的文件生成 o的文件 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 5交叉汇编器arm elf as 概述 命令格式 arm elf as option asmfile 在命令arm elf as后面跟一个或多个选项 以及该选项的子选项 选项间用空格隔开 然后跟汇编源文件名 例如 将demo s编译成目标文件 并且设置头文件的搜索目录为C demo include arm elf as I c demo includedemo s 3 5交叉汇编器arm elf as 概述 命令选项列表 a dhlns 显示arm elf as信息 f不进行预处理 Ipath设置头文件搜索路径 o设定输出文件名 v显示版本信息 W不显示警告提示 Z不显示错误提示 3 5交叉汇编器arm elf as 命令使用 生成目标文件 每次运行arm elf as只输出一个目标文件 默认状态下名字为a out 可以通过 o选项指定输出文件名字 通常都以 o为后缀 例如 编译demo s输出目标文件demo o arm elf as odemo odemo s 3 5交叉汇编器arm elf as 命令使用 设置头文件搜索路径 Ipath添加路径path到arm elf as的搜索路径 搜索 include file 指示的文件 I可以被使用多次以添加多个目录 当前工作目录将最先被搜索 然后从左到右依次搜索 I指定的目录 例如 编译demo s时指定两个搜索目录 当前目录和C demo include arm elf as I I c demo includedemo s 3 5交叉汇编器arm elf as 命令使用 显示arm elf as信息内容 a dhlns 打开arm elf as信息显示 dhlns为其子选项 分别表示 d 不显示调试信息h 显示源码信息l 显示汇编列表n 不进行格式处理s 显示符号列表 3 5交叉汇编器arm elf as 命令使用 设置目标文件名字 Ipath添加路径path到arm elf as的搜索路径 搜索 include file 指示的文件 I可以被使用多次以添加多个目录 当前工作目录将最先被搜索 然后从左到右依次搜索 I指定的目录 例如 编译demo s时指定两个搜索目录 当前目录和C demo include arm elf as I I c demo includedemo s 3 5交叉汇编器arm elf as 命令使用 如何取消警告内容 W加选项 W以后 运行arm elf as就不输出警告信息 例如 编译demo s输出目标文件demo o 不输出警告信息 arm elf as W odemo odemo s 3 5交叉汇编器arm elf as 命令使用 设置是否进行预处理 arm elf as内部的预处理程序 完成以下工作 调整并删除多余空格 删除注释 将字符常量改成对应的数值 例如 编译demo s输出目标文件demo o 并且编译时不进行预处理 则命令如下 arm elf as f odemo odemo s 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 6汇编语言编程 汇编语言 基本元素 1 字符集汇编中使用下列字符组成源程序的各种语法元素 大写字母A Z 小写字母a z 数字0 9 符号 其中大小写字母作用不同 3 6汇编语言编程 汇编语言 基本元素 2 约定的名字包括寄存器名 指令名字和伪操作符 每一个伪操作符表示一定功能的操作 3 6汇编语言编程 汇编语言 基本元素 2 约定的名字伪操作符可以分为六类 数据定义伪操作符符号定义伪操作符程序结构伪操作符条件汇编伪操作符宏伪操作符其他伪操作符 3 6汇编语言编程 汇编语言 基本元素 3 定义的名字汇编程序中的标号 分段名 宏定义名都是用户可以定义的名字 标号标号只能由a z A Z 0 9 等字符组成 标号的长度不受限制 大小写字母有区别 3 6汇编语言编程 汇编语言 基本元素 3 定义的名字汇编程序中的标号 分段名 宏定义名都是用户可以定义的名字 分段名汇编系统中预定义的分段名有 text bss data sdata sbss等 但是用户可以自己定义段名 语法如下 sectionsection nameattribute 3 6汇编语言编程 汇编语言 基本元素 3 定义的名字汇编程序中的标号 分段名 宏定义名都是用户可以定义的名字 分段名汇编系统中预定义的分段名有 text bss data sdata sbss等 但是用户可以自己定义段名 语法如下 sectionsection nameattribute 例如 定义一个可以执行的代码段 mytext section mytext ax mycode 3 6汇编语言编程 汇编语言 基本元素 3 定义的名字汇编程序中的标号 分段名 宏定义名都是用户可以定义的名字 宏定义名宏定义的语法如下 macromacro nameparm1 parmNmacrobody endm 3 6汇编语言编程 汇编语言 基本元素 4 常数二进制数由0b或者0B开头 如 0b1000101 0B1001110 十六进制数以0 x或者0X开头 如 0 x4567 0X10089 八进制数由0开头 如 0345 09870 十进制数以非零数开头 如 345 12980 3 6汇编语言编程 汇编语言 基本元素 5 当前地址数当前的地址数用点号 表示 在汇编程序中可以直接使用该符号 6 表达式在汇编程序中可以使用表达式 在表达式中可以使用常数和数值 可以使用的运算符有 前缀运算符号 取负数 取补数 中缀运算符号 3 6汇编语言编程 汇编语言 基本元素 7 注释符号不同芯片的汇编程序中 注释的符号有所不同 以 开头的程序行是注释行 3 6汇编语言编程 汇编语言 语句 1 语句类型注释符号汇编语句按其作用和编译的情况分为两大类 执行性语句和说明性语句 3 6汇编语言编程 汇编语言 语句 2 数据语句一字节数据定义语句两字节数据定义语句四字节数据定义语句八字节数据定义单个字串定义多个字串1多个字串2重复数据定义 3 6汇编语言编程 汇编语言 语句 3 列表控制语句 title heading 在汇编列表中将 heading 作为标题 list系统遇此语句就输出列表文件 3 6汇编语言编程 汇编语言 语句 4 一般执行语句不同的芯片有不同指令集 见相关的指令手册 3 6汇编语言编程 汇编语言 程序结构 1 程序结构语句程序结构语句是伪操作符定义的说明语句 用于说明程序段的开始 结束以及源程序的结束等 3 6汇编语言编程 汇编语言 程序结构 1 程序结构语句程序结构语句是伪操作符定义的说明语句 用于说明程序段的开始 结束以及源程序的结束等 代码段的开始 text 数据段的开始 data 源程序的结束 end 3 6汇编语言编程 汇编语言 程序结构 2 过程 函数 的定义过程的结构如下 过程名 过程体返回语句 例如 align2 globluart1 sendch typeuart1 sendch functionuart1 sendch ldrr2 SYSFLG1 ldrr1 r2 tstr1 UTXFF1bne1bldrr2 UARTDR1strbr0 r2 movpc lr一般情况下 type和 align声明可以缺省 3 6汇编语言编程 宏语句与条件编程 等价语句 1 equ语句语法 equsymbol expression例子 equPPC PC 32 4应用 stwr4 PPC PC r1 2 set语句与 equ的功能相同 3 6汇编语言编程 宏语句与条件编程 宏定义与宏调用 宏定义 macromacro nameparam1 param2 paramN macrobody endm 例如 使用ARM的汇编指令集说明 macroROMSEC patovaTTPA pa start va start tmp icldr tmp APFIELD ROMadd TTPA TTPA va start LSR 18add tmp tmp pa start20 str tmp TTPA 4add tmp tmp 0 x10000subs ic ic 1bne20b endm 3 6汇编语言编程 宏语句与条件编程 重复块和源文件的嵌入 1 重复块定义 reptcountcontents endr例如 rept2 long0 x12908 endr等价于 long0 x12908 long0 x12908 2 源文件的嵌入在一个汇编文件中可以嵌入其它汇编文件 例如汇编头文件等 方法如下 include filename 3 6汇编语言编程 宏语句与条件编程 条件编译 ifexpression表达式为非零则编译后面的语句 否则后面的语句被忽略 ifdefsymbol如果符号被定义则编译后面的语句 否则后面的语句被忽略 ifndefsymbol如果符号未被定义则编译后面的语句 否则后面的语句被忽略 else表示与前面的if语句的条件相反 endif表示条件判断结束 3 6汇编语言编程 宏语句与条件编程 条件编译 例如 macrosumfrom 0 to 5 long from if to fromsum from 1 to endif endm应用 sum 5等价于 long0 long5条件判断可以嵌套使用 if else endif遵循最近匹配的原则 3 6汇编语言编程 模块化程序设计 全局符号 在模块中定义的 要被别的模块使用的符号 包括变量名和函数名 都必须被声明为全局符号 方法如下 globalsymbol在本模块中要使用其他模块中的全局符号 可以用 externsymbol的方式声明 但也可以不用声明在汇编时自动认为它是其它模块中的全局符号 3 6汇编语言编程 模块化程序设计 模块间的符号互用 1 汇编模块与汇编模块间的调用 2 汇编模块调用C语言模块中的函数 3 汇编模块使用C语言模块中的变量 4 C语言模块调用汇编模块中的函数 5 C语言模块使用汇编模块中的变量 3 6汇编语言编程 内存模式 在uClinux环境下 内存模式为平模式 即整个内存空间最大为4GB 所有任务共享这4GB的空间 而不是每个任务有单独的4G虚拟空间 所有的寻址都是32位地址的方式 因此程序模块间可以很容易的共享变量和数据 3 6汇编语言编程 StrongARM ARM7 寄存器名字 3 6汇编语言编程 StrongARM ARM7 如何在汇编模块中调用C语言模块中的函数 在调用C函数之前 必须在当前栈中空出至少8个字节的空间 然后才调用C函数 C函数的第一个参数 最左边的参数 用r0传递 后面的参数依次用r1 r2等来传递 例如 假定C函数为intget sum intvar1 intvar2 则在汇编程序中首先将参数送到r0 r1中 然后将栈指针减8 最后调用get sum 注意 C函数名在汇编中使用时不用加下划线 3 6汇编语言编程 StrongARM ARM7 注释符号 以 开头的程序行是注释行 3 6汇编语言编程 StrongARM ARM7 一般程序 title example data globalvar1var1 long0 x897678 0 x2378789 byte89 56 23 string hello bss globalzero varzero var short0 0 0 long0 0 0 0 3 6汇编语言编程 StrongARM ARM7 一般程序 textUART1INIT TEST ldrr3 SYSCON1ldrr0 r3 tstr0 UART1ENbeq2f1 ldrr1 r3 tstr1 UTXFF1bne1b2 bicr0 r0 UART1ENstrr0 r3 bicr0 r0 SIREN 3 6汇编语言编程 StrongARM ARM7 一般程序 strr0 r3 orrr0 r0 UART1ENstrr0 r3 ldrr3 SYSFLG2ldrr0 r3 andr0 r0 0 x40movpc lr section mytext ax globalu1b setu1b set ldrr3 UBLCR1strr0 r3 movpc lr end 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 7简单程序设计 顺序程序设计 例3 1用ARM指令实现的C赋值语句 x a b c可以用r0表示a rl表示b r2表示c和r3表示x 用r4作为间接寻址寄存器 ADRr4 a 读取变量a的地址LDRr0 r4 读a的内容到r0ADRr4 b 读取变量b的地址LDRrl r4 读b内容到r1ADDr3 r0 rl a b的结果保存在r3ADRr4 c 读取变量c的地址LDRr2 r4 读c的内容到r2SUBr3 r3 r2 a b c结果保存到r3ADRr4 x 读x的地址STRr3 r4 保存变量x 3 7简单程序设计 顺序程序设计 例3 2用ARM指令实现的C赋值语句 z a 2 b 15 可以使用r0表示a和z r1表示b r4表示地址进行编码 ADRr4 a 读取变量a的地址到r4LDRr0 r4 读a的内容到r0MOVr0 r0 LSL2 实现a 2操作 结果保存在r0ADRr4 b 读取变量b的地址到r4LDRrl r4 读b的内容到r1ANDr1 r1 15 实现b 15操作 结果保存在r1中ORRrl r0 rl 计算z的结果ADRr4 z 读取变量z的地址到r4STRrl r4 保存变量z 3 7简单程序设计 分支程序设计 例3 3在ARM中实现下面if语句 if a b x 5 y c d elsex c d 实现上述指令的第一种方法比较传统并且和其他微处理器相似 下列指令使用条件分支和无条件数据操作 3 7简单程序设计 分支程序设计 例3 4在ARM中实现C的switch语句C中的switch语句采用下列形式 switch test case0 break case1 break 上述语句也可以像if语句那样编码 首先测试test A 然后测试test B 依此类推 3 7简单程序设计 循环程序设计 例3 5用ARM指令实现FIR过滤器FIR finiteimpulserresponse 过滤器是一种处理信号的常用方法 FIR过滤器是简单的对积求和 cixi1 i n作为过滤器使用时 xi假定为周期性采集的数据样品 ci是系数 这种表示假定样品是周期性采集而来的 每次一个新的样品到来都要重新计算一次FIR过滤器的输出 方框表示存储刚刚到来的样品产生xi时延元素 延迟的样品分别单独与c相乘 然后求和得到过滤器的输出 3 7简单程序设计 子程序设计 每个C函数返回一个值 除非它的返回类型是void 一般把不返回值的结构称为子例程或过程 第3章目录 1GNUGCC简介 2C C 交叉编译器arm elf gcc 3交叉连接器arm elf ld 4工程管理器MAKE 5交叉汇编器arm elf as 6汇编语言编程 7简单程序设计 8混合语言编程 3 8混合语言编程 汇编语言与C C 的混合编程通常有以下几种方式 在C C 代码中嵌入汇编指令 在汇编程序和C C 的程序之间进行变量的互访 汇编程序 C C 程序间的相互调用 如何在C语言内嵌汇编语言 3 8混合语言编程 内嵌汇编的语法

温馨提示

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

评论

0/150

提交评论