好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第3章程序设计基础ppt课件.ppt

201页
  • 卖家[上传人]:cn****1
  • 文档编号:567580589
  • 上传时间:2024-07-21
  • 文档格式:PPT
  • 文档大小:759KB
  • / 201 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 阳茁兔恍溺双撮佳赘渤界豆摊乒罐亨唤钝脑卯疟值检寿击巾狸迁玩守孝厚第3章程序设计基础ppt课件第3章程序设计基础ppt课件第第 3 章章 程序设计基础程序设计基础芒徐揉兹硒石销睁铭准妓貉台娱遇家垣图醉字贼餐凳魂乡瞅丙牛图逞隙篷第3章程序设计基础ppt课件第3章程序设计基础ppt课件 GNU集成编译环境集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种是一种面向嵌入式领域、支持多种编程语言、支持多种编程语言、支持多种CPU的交叉编译工具的交叉编译工具本章主要介绍:本章主要介绍:ØØGCC编译过程编译过程ØØC/C++交叉编译器交叉编译器arm-elf-gccØØ交叉汇编器交叉汇编器 arm-elf-as ØØ交叉连接器交叉连接器arm-elf-l dØØ工程管理器工程管理器makeØØ汇编语言编程汇编语言编程ØØ混合编程混合编程拳惯皋攒峙咳侩抗犀篆兴铭卿柒贤锈酱隐杠飘阉暂偏生灶娃骨卑杉诚炒彝第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.1 GNU GCC简介简介GNU GCC是一套面向嵌入式领是一套面向嵌入式领域的交叉编译工具,支持多种编程语域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多编译、支持多种反汇编方式、支持多种调试信息格式种调试信息格式,,目前支持目前支持X86、、ARM7、、StrongARM、、PPC4XX、、MPC8XX、、MIPS R3000等多种等多种CPU。

      漆吵耘伯起幻篷就迟销桶馒躲决僻陛鞘掺鄙币呜雌催砷在老丽颓巩暗隘俏第3章程序设计基础ppt课件第3章程序设计基础ppt课件 GNU GCC的基本功能包括:的基本功能包括:ØØ输出预处理后的输出预处理后的C/C++源程序(展开头源程序(展开头文件和替换宏)文件和替换宏)ØØ输出输出C/C++源程序的汇编代码源程序的汇编代码ØØ输出二进制目标文件输出二进制目标文件ØØ生成静态库生成静态库ØØ生成可执行程序生成可执行程序ØØ转换文件格式转换文件格式修烯舷赁乒矾播醒迟佐试羔剔审理内棕忍佑灼风寨套静窖等掇泄俩凯颜圭第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.1.1 GCC 组成1. C/C++交叉编译器交叉编译器arm-elf-gccarm-elf-gcc是编译的前端程序,它通过调是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件用其他程序来实现将程序源文件编译成目标文件的功能编译时,它首先调用预处理程序编译时,它首先调用预处理程序(cpp)对输对输入的源程序进行处理,然后调用入的源程序进行处理,然后调用 cc1 将预处理后将预处理后的程序编译成汇编代码,最后由的程序编译成汇编代码,最后由arm-elf-as将汇将汇编代码编译成目标代码。

      编代码编译成目标代码arm-elf-gcc具有丰富的命令选项,可以控具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求制编译的各个阶段,满足用户的各种编译需求巫妒亮捎戎西颧汁继捧拴铝辛彪娥芹帽凯厉妄迂县吁陕锤雅奥侈殿瑟硷块第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 汇编器 arm-elf-asarm-elf-as将汇编语言程序转换为将汇编语言程序转换为ELF (Executable and Linking Format,,执行时链接文件格式执行时链接文件格式)格式的可重定位目格式的可重定位目标代码,这些目标代码同其它目标模块或标代码,这些目标代码同其它目标模块或函数库易于定位和链接函数库易于定位和链接arm-elf-as产生一个交叉参考表和一产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够个标准的符号表,产生的代码和数据能够放在多个区放在多个区 (Section)中桩朗曙膛陶皑或脉提术俺犬虫百卉衰福孺贸嘶攀仕浸竞惧磊段坞藕进勋穿第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. 连接器连接器arm-elf-ldarm-elf-ld根据链接定位文件根据链接定位文件Linkcmds中的代码区、数据区、中的代码区、数据区、BSS区和栈区等定位区和栈区等定位信息,将可重定位的目标模块链接成一个单信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。

      一的、绝对定位的目标程序该目标程序是该目标程序是ELF格式,并且可以包含格式,并且可以包含调试信息调试信息arm-elf-ld会产生一个内存映象文件会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符该文件显示所有目标模块、区和符号的绝对定位地址号的绝对定位地址它也产生交叉参考列表,显示参考每个它也产生交叉参考列表,显示参考每个全局符号的目标模块全局符号的目标模块狱雍轰佬芭咀虐歇挎拐恭愉喉复宴氯阶泼穿拜剪汝幢好路譬釉异朝兹拇使第3章程序设计基础ppt课件第3章程序设计基础ppt课件 arm-elf-ld支持将多个目标模块链接成一支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为对目标模块进行链接,这个特性称为增量链接增量链接(Incremental Linking)假如输入文件是一个函数库,假如输入文件是一个函数库,arm-elf-ld会自动从函数库装载被其它目标模块参考的函会自动从函数库装载被其它目标模块参考的函数模块arm-elf-ld与其它链接程序与其它链接程序相比相比,能提供,能提供更有帮助的诊断信息。

      许多链接器遇到第一个更有帮助的诊断信息许多链接器遇到第一个错误即放弃链接,而错误即放弃链接,而arm-elf-ld只要有可能都只要有可能都继续执行,帮助用户识别其它错误,有时甚至继续执行,帮助用户识别其它错误,有时甚至能获得输出代码能获得输出代码 争国鞘缀拓豪漏仟棚挖仿烹惕畸痴旦沽也站希汗净谎浸契俞楼沧渴诡叮繁第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4. 库管理器库管理器arm-elf-ararm-elf-ar将多个可重定位的目标模块将多个可重定位的目标模块归档为一个函数库文件归档为一个函数库文件采用函数库文件,应用程序能够从该文采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理易于应用程序的开发管理arm-elf-ar支持支持ELF格式的函数库文件格式的函数库文件.炉传骨斗蹭绝赘拇阑啦适刹换舷锄叶渤协婪萎瓦孺谁黔眨荔取模坯宣冗东第3章程序设计基础ppt课件第3章程序设计基础ppt课件 5. 工程管理器工程管理器MAKEMake是用于自动编译、链接程序的实用是用于自动编译、链接程序的实用工具工具,使用使用make后就不需要手工的编译每个程后就不需要手工的编译每个程序文件。

      要使用序文件要使用make,首先要编写首先要编写makefileMakefile描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,并提供更新文件的命令在一个程序中,可执并提供更新文件的命令在一个程序中,可执行文件依赖于目标文件行文件依赖于目标文件,而目标文件依赖于源而目标文件依赖于源文件如果文件如果makefile文件存在文件存在,每次修改完源每次修改完源程序后,用户通常所需要做的事情就是在命令程序后,用户通常所需要做的事情就是在命令行敲入行敲入“make”,然后所有的事情都由然后所有的事情都由make来来完成椰异撩媳殴窿恤茂诉痞毗圈穗认离脓难幼宏酥狗搅蒲篙吝胡穿岂撵崔谓捂第3章程序设计基础ppt课件第3章程序设计基础ppt课件 6. 其他实用程序其他实用程序目标文件格式转换工具目标文件格式转换工具arm-elf-objcopy支持的文件格式有支持的文件格式有H-record、、S-record、、ABS、、BIN、、COFF、、ELF例如,它能够将例如,它能够将ELF格式文件转换为其格式文件转换为其它格式的文件,如它格式的文件,如intel H-record格式、格式、Motorola S-record等。

      等arm-elf-nm程程序用于显示文件中的符号信息序用于显示文件中的符号信息 湍媒遵遇贮呀珊冒躯茬淖秩栅程胜续纶缺滨梢下之汉付践搽耿腐璃菌讶锅第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.1.2 GCC编译程序的基本过程编译程序的基本过程GCC编译程序的编译程序的基本过程基本过程如下:如下:arm-elf-gcc根据输入文件的后缀来确定根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括文件的类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为的汇编临时文件(后缀为.s););arm-elf-as将该汇编文件编译成目标文件将该汇编文件编译成目标文件(后缀为(后缀为.o););arm-elf-ld 根据用户的链接选项(包括指根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接定链接命令文件等)将目标文件和各种库链接起来生成可执行文件起来生成可执行文件图图3-1展示了该编译过程:展示了该编译过程:遏绚示滇加职软颠佯朵注颂捞嘻裴嗣搐帜涟渠信免播炮遭逮阂织访沙票弟第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.2 C/C++交叉编译器交叉编译器arm-elf-gcc3.2.1 3.2.1 概述概述概述概述arm-elf-gccarm-elf-gcc是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件。

      他程序来实现将程序源文件编译成目标文件他程序来实现将程序源文件编译成目标文件他程序来实现将程序源文件编译成目标文件ØØ编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序(cpp)(cpp)对输入的源对输入的源对输入的源对输入的源程序进行处理程序进行处理程序进行处理程序进行处理; ;ØØ然后调用然后调用然后调用然后调用cc1cc1将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码; ;ØØ最后由最后由最后由最后由arm-elf-asarm-elf-as将汇编代码编译成目标代码将汇编代码编译成目标代码将汇编代码编译成目标代码将汇编代码编译成目标代码arm-elf-gccarm-elf-gcc具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求 沿仓验高函载毗缆援别柒池愁法拍淋桂烟坐席绿太让瘸只蝗到伯锰芒钱刁第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.命令格式命令格式arm-elf-gcc [options] file…在命令在命令arm-elf-gcc后面跟一个或后面跟一个或多个选项,选项间用空格隔开,然后跟多个选项,选项间用空格隔开,然后跟一个或多个目标文件。

      一个或多个目标文件例如,将例如,将test.c 编译成目标文件编译成目标文件test.o 并且生成调试信息:并且生成调试信息:arm-elf-gcc –g –c –o test.o test.c 突踞碟均爵惊坐揍庚锤础鸣镶盅描瓶金靠傍雹岳哺怔缎描匈斌箱锨铀嘴临第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.命令选项列表命令选项列表输出控制选项:输出控制选项:ØØ-c 将输入的源文件编译成目标文件将输入的源文件编译成目标文件ØØ-S 将将C/C++文件生成汇编文件文件生成汇编文件ØØ-o file 将输出内容存于文件将输出内容存于文件fileØØ-pipe 在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式ØØ-v 打印出编译过程中执行的命令打印出编译过程中执行的命令ØØ-x language 说明文件的输入类型为说明文件的输入类型为language激檄冗毯摘介辗帮潘卞整凰策刨辟唉犹蒸筏灶苍束拧卧困杂秀事涂铲氮估第3章程序设计基础ppt课件第3章程序设计基础ppt课件 C语言选项:语言选项:-ansi 支持所有支持所有ANSI C程序程序警告选项:警告选项:ØØ-w 关闭所有警告关闭所有警告ØØ-Wall 打开所有警告打开所有警告ØØ-Wimplicit 如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息ØØ-Wno-implicit 不显示对隐含申明的警告不显示对隐含申明的警告调试选项:调试选项:-g 在文件中产生调试信息在文件中产生调试信息(调试信息的文调试信息的文件格式有件格式有stabs、、COFF、、XCOFF、、DWARF)臣酉极饰糯势幻咋育更宋共献雕贮他祭曳祷够郎鬃惫材竣碑痈守测隋蛛闹第3章程序设计基础ppt课件第3章程序设计基础ppt课件 优化选项:优化选项:ØØ-O0 不优化不优化ØØ-O1 一级优化一级优化ØØ-O2 二级优化二级优化ØØ-O3 三级优化三级优化预处理选项:预处理选项:ØØ-E 运行运行C的预处理器的预处理器ØØ-C 在运用在运用-E进行预处理时不去掉注释进行预处理时不去掉注释ØØ-D macro 定义宏定义宏macro为为1ØØ-D macro=defn 定义宏定义宏macro为为defn匿锄尼在枉聘密涤蔫蔓赵钵斯肥茄价匀晨藩毅成例似橙暖复秸甥省焊奈钡第3章程序设计基础ppt课件第3章程序设计基础ppt课件 汇编选项:汇编选项:-Wa,,option 将选项将选项option传递传递 给汇编器给汇编器搜索路径选项:搜索路径选项:-I dir 设置搜索路径为设置搜索路径为dir-I- 指定只对指定只对 #include "file",有有效的头文件搜索目录效的头文件搜索目录 腮建蓬饺隅倚胆净惰由吉幻苇时掩纲坎跨并渝嘘甲水兄升崇琴韵墅黄栋腔第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. 源文件类型的识别源文件类型的识别arm-elf-gccarm-elf-gcc能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型. .文件名后缀文件名后缀文件名后缀文件名后缀和和和和文件类型文件类型文件类型文件类型的对应关系如下:的对应关系如下:的对应关系如下:的对应关系如下:ØØ*.c *.c ——C——C源文件源文件源文件源文件ØØ*.i *.i ————经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件ØØ*.h *.h ——C——C头文件头文件头文件头文件ØØ*.ii *.ii ————经过预处理后的经过预处理后的经过预处理后的经过预处理后的C++C++源文件源文件源文件源文件ØØ*.cc *.cc ——C++——C++源文件源文件源文件源文件ØØ*.cxx *.cxx ——C++——C++源文件源文件源文件源文件ØØ*.cpp *.cpp ——C++——C++源文件源文件源文件源文件ØØ*.C*.C——C++——C++源文件源文件源文件源文件ØØ*.s *.s ————不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件ØØ*.S*.S————需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件坪代粟府野扔镶塑缉硼乃半霍倡涛戚筏鼻彬樱矽由琢铁贿肠孺为壕薯莫滥第3章程序设计基础ppt课件第3章程序设计基础ppt课件 此外,用户可通过此外,用户可通过此外,用户可通过此外,用户可通过-x language-x language说明文件的输入类说明文件的输入类说明文件的输入类说明文件的输入类型,此时可以不用以上的后缀规则。

      型,此时可以不用以上的后缀规则型,此时可以不用以上的后缀规则型,此时可以不用以上的后缀规则x language-x language其中的其中的其中的其中的languagelanguage可为:可为:可为:可为:ØØc c ——C——C源文件源文件源文件源文件ØØc++ c++ ——C++——C++源文件源文件源文件源文件ØØc-header c-header ——C——C头文件头文件头文件头文件ØØcpp-output cpp-output ————经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件ØØc++-cpp-output ——c++-cpp-output ——经过预处理后的经过预处理后的经过预处理后的经过预处理后的C++C++源文件源文件源文件源文件ØØassembler assembler ————不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件ØØassembler-with-cpp ——assembler-with-cpp ——需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件例如,编译一个不需要预处理的例如,编译一个不需要预处理的例如,编译一个不需要预处理的例如,编译一个不需要预处理的C C程序:程序:程序:程序:arm-elf-gcc –c –g –xarm-elf-gcc –c –g –xcpp-output test.ccpp-output test.c-x none-x none如果如果如果如果-x-x后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做相应处理。

      相应处理相应处理相应处理 躯炬屎鞘秆沧浦绪懂笑垦笆圾靛阀泥男癣胞弧草勋时赔描擅幻拽睁骆凋汞第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.2.2 命令使用命令使用1.输出文件名的指定输出文件名的指定-o file将输出内容存于文件将输出内容存于文件file,仅适用于,仅适用于只有一个输出文件时只有一个输出文件时例如,将例如,将test.c编译成汇编程序并存编译成汇编程序并存放于文件放于文件test.txt::arm-elf-gcc –S –o test.txt test.c捌钵屉源翼足树潍朗故镰刊拈勃脑掖酷澈刺帚疑奶慷溃盗解身腆磅弃屉丝第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.目标文件的生成目标文件的生成 -c将输入的源文件编译成目标文件将输入的源文件编译成目标文件例如,将例如,将test.c编译成编译成test.o::arm-elf-gcc –c –o test.o test.c3.将.将C/C++文件生成汇编文件文件生成汇编文件 -S将将C/C++文件生成汇编文件文件生成汇编文件例如例如:将将test.c编译生成汇编文件编译生成汇编文件test.s:arm-elf-gcc –S –o test.s test.c臻君邢佐乱渠慎渭茎职副曝值憾寓爪筒炮尤篙九公瑰供垂青岩磋歌百硅彼第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4.预处理文件的生成预处理文件的生成-E只对源文件进行预处理并且缺省输出到标准只对源文件进行预处理并且缺省输出到标准输出。

      输出例如,对例如,对test.c进行预处理并将结果输出到进行预处理并将结果输出到屏幕:屏幕:arm-elf-gcc –E test.c例如,对例如,对test.c进行预处理并将结果输出到进行预处理并将结果输出到文件文件test.txt::arm-elf-gcc –E –o test.txt test.c叛菏堪砾芽许账痉直摧两勾抽阔磊蕾娟倾蚂他逸研探戌狸搔逝岸互聚渭哦第3章程序设计基础ppt课件第3章程序设计基础ppt课件 5.设置头文件搜索路径.设置头文件搜索路径头文件的头文件的引用引用有两种形式:有两种形式:一种是一种是# include“filename”,,一种是一种是# include 前一种形式的前一种形式的路径搜索顺序路径搜索顺序是:当前目录、是:当前目录、指定的搜索路径;指定的搜索路径;后一种形式只搜索指定路径后一种形式只搜索指定路径 源掳愚伟铆想洛藐洲疼桌整瘟寥璃刚驰茄演溢疤茄嵌卧曝湿趋拐合烙噶颓第3章程序设计基础ppt课件第3章程序设计基础ppt课件 -I dir将目录将目录dir添加到头文件搜索目录列表的第添加到头文件搜索目录列表的第一项通过此选项可以使用户头文件先于系统头文通过此选项可以使用户头文件先于系统头文件被搜索到。

      件被搜索到如果同时用如果同时用-I选项添加几个目录,目录被搜选项添加几个目录,目录被搜索时的优先级顺序为从左到右索时的优先级顺序为从左到右例如,编译例如,编译test.c,在当前目录和,在当前目录和/include中搜索中搜索test.c所包含的头文件:所包含的头文件:arm-elf-gcc –I ./ –I/include –c test.c斩损蝶站消妊稳居求疡开装荆孤估胚桶敲坯蕾拭节煎橡打至捏邦貉陋套彩第3章程序设计基础ppt课件第3章程序设计基础ppt课件 -I-Ø-I-以前以前用用-I指定的头文件搜索目录只指定的头文件搜索目录只对对 # include“file” 有效,对有效,对 # include 无效;无效;Ø-I-以后以后指定的头文件搜索目录对以上指定的头文件搜索目录对以上两种形式的头文件都有效两种形式的头文件都有效此外,此外,-I-会禁止对当前目录的隐含搜会禁止对当前目录的隐含搜索,不过用户可以通过使用索,不过用户可以通过使用“-I.”使能对当使能对当前目录的搜索前目录的搜索 柳馅选综路罚蚊肄蛊鼓勘恶佃矗戮缨霍放毡艾医庸塔掺暑揖锯补硒搂狱腐第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如例如:在需要编译的在需要编译的test.c文件对头文件的引用有:文件对头文件的引用有:# include# include“file2.h”# include“file3.h”其中,其中,file1.h在目录在目录 /include/test下,下,file2.h在在/include下,下,file3.h在当前目录下。

      在当前目录下ØØ在以下命令行中,只能搜索到在以下命令行中,只能搜索到file2.h,而不,而不 能搜索到能搜索到file1.h::arm-elf-gcc –I./include/test –I– –I./include –c arm-elf-gcc –I./include/test –I– –I./include –c test.ctest.c经腕诽抬揩魔祸矾痰拒轮藤痒伞铁隔存栽罕坛措辗俘竹涂距戎岁喇焙雁救第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ØØ而在以下命令行中而在以下命令行中,可以搜索到需要的两个头可以搜索到需要的两个头文件文件file1.h和和file2.h: arm-elf-gcc –I– –I./include –I./include/test –c test.carm-elf-gcc –I– –I./include –I./include/test –c test.cØØ如果要搜索到如果要搜索到如果要搜索到如果要搜索到file3.hfile3.h,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索: : arm-elf-gcc –I– –I. –I./include –I./include/test –c test.carm-elf-gcc –I– –I. –I./include –I./include/test –c test.cØØ实质上,上述编译命令等价于实质上,上述编译命令等价于实质上,上述编译命令等价于实质上,上述编译命令等价于: : arm-elf-gcc –I. –I./include –I./include/test –c test.c arm-elf-gcc –I. –I./include –I./include/test –c test.c 与与与与 arm-elf-gcc –I./include –I./include/test –c test.c arm-elf-gcc –I./include –I./include/test –c test.c于衷踪佑陌倪晌礼臻耗仍灰杯但凳厩姥阶吧耀理端菠而筒涧笼辛绞鸟秒困第3章程序设计基础ppt课件第3章程序设计基础ppt课件 6.控制警告产生.控制警告产生用户可以使用以用户可以使用以用户可以使用以用户可以使用以-W-W开头的不同选项对特定警告进行开头的不同选项对特定警告进行开头的不同选项对特定警告进行开头的不同选项对特定警告进行设定。

      设定对于每种警告类型都有相应以对于每种警告类型都有相应以对于每种警告类型都有相应以对于每种警告类型都有相应以-Wno--Wno-开始的选项关开始的选项关开始的选项关开始的选项关闭警告例如例如例如例如: :ØØ如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:arm-elf-gcc –c –Wimplicit test.carm-elf-gcc –c –Wimplicit test.cØØ不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:arm-elf-gcc –c –Wno–implicit test.carm-elf-gcc –c –Wno–implicit test.c常用的警告选项有:常用的警告选项有:常用的警告选项有:常用的警告选项有:ØØ-w-w 关闭所有警告信息关闭所有警告信息关闭所有警告信息关闭所有警告信息ØØ-Wall-Wall 打开所有警告信息打开所有警告信息打开所有警告信息打开所有警告信息汐公殿蜒援蛛款谩壮绝唇质恕怪浴溶咯戍悉婿巾都保中中蛹牢窒奠垃呛酋第3章程序设计基础ppt课件第3章程序设计基础ppt课件 7.实现优化.实现优化优化的优化的主要目的主要目的是使编译生成的代码的是使编译生成的代码的尺寸更小、运行速度更快。

      尺寸更小、运行速度更快但是在编译过程中随着优化级别的升高,但是在编译过程中随着优化级别的升高,编译器会相应消耗更多时间和内存,而且优编译器会相应消耗更多时间和内存,而且优化生成代码的执行顺序和源代码有一定出入,化生成代码的执行顺序和源代码有一定出入,因此优化选项更多地用于生成固化代码,而因此优化选项更多地用于生成固化代码,而不用于生成调试代码不用于生成调试代码目炕队根捞羌颠肋卞热道个蛋晓舌姬负吴舍缴圾愈舆疚挎绸时尾次二痛煎第3章程序设计基础ppt课件第3章程序设计基础ppt课件 arm-elf-gcc支持多种优化选项,总体上划支持多种优化选项,总体上划分为分为三级优化三级优化::1.1.-O1 可以部分减小代码尺寸,对运行速可以部分减小代码尺寸,对运行速度有一定的提高较多地使用了寄存器变量,提度有一定的提高较多地使用了寄存器变量,提高指令的并行度高指令的并行度2.2.-O2 除了解循环、函数插装和静态变量优除了解循环、函数插装和静态变量优化,几乎包含化,几乎包含arm-elf-gcc所有优化选项一般所有优化选项一般在生成固化代码时使用该选项较为适宜在生成固化代码时使用该选项较为适宜。

      3.3.-O3 包含包含-O2的所有优化,并且还包含了的所有优化,并且还包含了解循环、函数插装和静态变量优化通常情况下解循环、函数插装和静态变量优化通常情况下,该级优化生成的代码执行速度最快,但是代码,该级优化生成的代码执行速度最快,但是代码尺寸比尺寸比-O2大一些笛瞅鱼甭勘党梁疤芯润峭昆淖钳帕栓劝心俏轻替挛敝惋骡肥壬掂矗揪呆肖第3章程序设计基础ppt课件第3章程序设计基础ppt课件 8.在命令行定义宏.在命令行定义宏-D macro定义宏定义宏macro为为1D macro=defn 定义宏定义宏macro为为defn例如例如:ØØ编译编译test.c并且预定义宏并且预定义宏 RUN_CACHE 值为值为1: arm-elf-gcc –c –D RUN_CACHE test.cØØ编译编译test.c并且预定义宏并且预定义宏 RUN_CACHE 值为值为0: arm-elf-gcc –c –D RUN_CACHE=0 test.c氓苹螺铱眺恶蚌傍谚孙斗虏杯赫岛祁匀座咨绢旭题夯食比铝俘夜桥毫窘匪第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.3 交叉连接器交叉连接器arm-elf-ld3.3.1 概述概述arm-elf-ld根据链接定位文件根据链接定位文件Linkcmds中代码段、数据段、中代码段、数据段、BSS段和堆栈段等定位段和堆栈段等定位信息,将可重定位的目标模块链接成一个单信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序,该目标程序是一的、绝对定位的目标程序,该目标程序是ELF格式,并且可以包含调试信息。

      格式,并且可以包含调试信息arm-elf-ld可以输出一个内存映象文件,可以输出一个内存映象文件,该文件显示所有目标模块、段和符号的绝对该文件显示所有目标模块、段和符号的绝对定位地址,它也产生目标模块对全局符号引定位地址,它也产生目标模块对全局符号引用的交叉参考列表用的交叉参考列表玖肇铡张莉熬抨甄搂陪系渗佩磊发裂使仅建海茅绽终挽卵咏蜗虱挞背强纺第3章程序设计基础ppt课件第3章程序设计基础ppt课件 arm-elf-ld支持将多个目标模块支持将多个目标模块链接成一个单一的、绝对定位的目链接成一个单一的、绝对定位的目标程序,也能够依次对目标模块进标程序,也能够依次对目标模块进行链接,这个特性称为行链接,这个特性称为增量链接增量链接((Incremental Linking) arm-elf-ld会自动从库中装载被会自动从库中装载被调用函数所在的模块调用函数所在的模块老使立滥涎搞航筑棕多诞桶却房报涟又酝油臼葱墓葫胰菠符堆购拖啥些戒第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.命令格式.命令格式arm-elf-ld [option] file…命令行后跟选项和可重定位的目标文件名。

      命令行后跟选项和可重定位的目标文件名例如例如:链接的输入文件为链接的输入文件为demo.o,输出文件为,输出文件为demo.elf,链接的库为,链接的库为libxxx.a,生成内存映象,生成内存映象文件文件map.txt,链接定位文件为,链接定位文件为linkcmds,则命,则命令如下:令如下:arm-elf-ld -Map map.txt -T linkcmds -L./lib –o demo.elf demo.o –lxxx偿秀课匆轰擒晌余介骸油酌驾推循娶蛾范蛋敝锗趟遮晒赛应锌奄踩挎毋爽第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.命令选项列表.命令选项列表ØØ-e entry指定程序入口指定程序入口ØØ-M输出链接信息输出链接信息ØØ-lar指定链接库指定链接库ØØ-L dir添加搜索路径添加搜索路径ØØ-o设置输出文件名设置输出文件名ØØ-Tcommandfile指定链接命令文件指定链接命令文件ØØ-v显示版本信息显示版本信息ØØ-Map制定输出映像文件制定输出映像文件痴吗歼疟外泊卧落巴像拐佛兆躲霞蟹自久店柱龄棘狠研诌图责佑扣藻蔑渴第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.3.2 命令使用命令使用1 1.程序入口地址.程序入口地址.程序入口地址.程序入口地址-e entry-e entry以符号以符号以符号以符号entryentry作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认的入口地址开始。

      默认入口地址的指定方式和其他指定的入口地址开始默认入口地址的指定方式和其他指定的入口地址开始默认入口地址的指定方式和其他指定的入口地址开始默认入口地址的指定方式和其他指定方式的描述,参见方式的描述,参见方式的描述,参见方式的描述,参见3.3.33.3.3节例如,链接的输入文件为例如,链接的输入文件为例如,链接的输入文件为例如,链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,链接定位文件为,链接定位文件为,链接定位文件为,链接定位文件为linkcmdslinkcmds,将入口地址设为,将入口地址设为,将入口地址设为,将入口地址设为_start_start,命令如下:,命令如下:,命令如下:,命令如下:arm-elf-ld –T linkcmds –e _start –o demo.elf arm-elf-ld –T linkcmds –e _start –o demo.elf demo.odemo.o宇共法堑酿酪功墙瓦同蒲辑添紫佣仑俭故擂剪逞唯缆痪辟钻彻用末媚肠郊第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.输出链接信息.输出链接信息-M在标准端口打印出符号映象表和内存分布信在标准端口打印出符号映象表和内存分布信息。

      息例如:例如:链接的输入文件为链接的输入文件为demo.o,输出文件为输出文件为demo.elf,在标准端口打印出符号映象表和内存在标准端口打印出符号映象表和内存分布信息,命令如下:分布信息,命令如下:arm-elf-ld –M –o demo.elf demo.o如果标准输出设置为显示器,运行命令后将如果标准输出设置为显示器,运行命令后将在显示器上显示内存映象信息和符号映象表在显示器上显示内存映象信息和符号映象表 款该循萤攫堡头塘尼潞观忙醉站辐校肺素跌闽条赂葛晒凯移千茶疆钧分陨第3章程序设计基础ppt课件第3章程序设计基础ppt课件 -Map mapfile将链接的符号映象表和内存分布信将链接的符号映象表和内存分布信息输出到文件息输出到文件mapfile里例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,将链接的符号映象表和,将链接的符号映象表和内存分布信息输出到文件内存分布信息输出到文件map.txt里,命里,命令如下:令如下:arm-elf-ld –Map map.txt –o demo.elf demo.o雹液片纲氛屏陡询灌榨称莲流骸埔汰驻反桌毯展涪你权即萄神据歧衍页边第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.指定链接的库.指定链接的库-larØØ指定库文件指定库文件libar.a为链接的库。

      为链接的库ØØ可以重复使用可以重复使用-l来指定多个链接的库来指定多个链接的库例如例如:链接的输入文件为链接的输入文件为demo.o,指定,指定libxxx.a为为链接的库,输出文件为链接的库,输出文件为demo.elf,命令如下:,命令如下:arm-elf-ld –o demo.elf demo.o –lxxx注意:库的命名规则为注意:库的命名规则为libxxx.a,在,在-l指定库指定库名时使用的格式为名时使用的格式为-lxxx焉粳槽敷诌搭飞儒疾肆写矛嗽啥魔厘赣法酵编别劈陀颅但监尼臆斩料柞决第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4.添加库和脚本文件的搜索路径.添加库和脚本文件的搜索路径-LdirØØ将将dir添加到搜索路径添加到搜索路径ØØ搜索顺序按照命令行中输入的顺序,并且搜索顺序按照命令行中输入的顺序,并且优先于默认的搜索路径优先于默认的搜索路径ØØ所有在所有在-L添加的目录中找到的添加的目录中找到的-l指定的库都指定的库都有效例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,将,将/lib添加到库的搜索路径,命添加到库的搜索路径,命令如下:令如下:arm-elf-ld -L./lib –o demo.elf demo.o 浩寝阂筐盯见室刊逞城玩褂视但币栓密塘侦于屯奈决啄鸭捞愈堆鼎走抗雄第3章程序设计基础ppt课件第3章程序设计基础ppt课件 5.设置输出文件的名字.设置输出文件的名字-o output将输出文件名字设定为将输出文件名字设定为output。

      如果如果不指定输出文件名,不指定输出文件名,arm-elf-ld生成文件生成文件名默认为名默认为a.out例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,命令如下:,命令如下:arm-elf-ld –o demo.elf demo.o级茫啸附商驶告惰奇烘捣赣贸厄斜雇术懂龙请唱讶惑簧拥递专猫冰袍伊盟第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.3.3 linkcmds连接命令文件连接命令文件 arm-elf-ld的命令语言是一种描述性的脚本的命令语言是一种描述性的脚本语言,它主要应用于控制语言,它主要应用于控制:有哪些输入文件、文有哪些输入文件、文件的格式怎样、输出文件中的模块怎样布局、件的格式怎样、输出文件中的模块怎样布局、分段的地址空间怎样分布、以及未初始化的数分段的地址空间怎样分布、以及未初始化的数据段怎样处理等据段怎样处理等用命令语言写成的文件用命令语言写成的文件(通常称为通常称为linkcmds)具有可重用性具有可重用性,不必每次在命令行输不必每次在命令行输入一大堆命令选项入一大堆命令选项.并且对于不同的应用并且对于不同的应用,只需只需对对linkcmds进行简单的修改就可以使用。

      进行简单的修改就可以使用钩瓤疲节锻剩离嘿隅仲必米卡次傈枣饶法狐殷右醚镣朔塌汰倔垒胎障择副第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.调用.调用linkcmds首先写一个链接命令文件首先写一个链接命令文件linkcmds,然后,然后在在arm-elf-ld的命令中使用的命令中使用-T linkcmds参参数数,就能在链接时自动调用就能在链接时自动调用linkcmds文件.文件.例如例如: 链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,链接定位文件为,链接定位文件为linkcmds,则命令如下,则命令如下:arm-elf-ld –T linkcmds –o demo.elf demo.o器浚缺谨营绦滁调荔纤弘炬钟敬泵郑季中侈裳褥购饿喷印常茶澡妻拨协乙第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.编写.编写linkcmds(1)arm-elf-ld命令语言命令语言arm-elf-ld命令语言是一系列语句的集命令语言是一系列语句的集合,包括用简单的关键字设定选项、描述合,包括用简单的关键字设定选项、描述输入文件及其格式、命名输出文件。

      输入文件及其格式、命名输出文件其中有两种语句对于链接过程起重要其中有两种语句对于链接过程起重要作用:作用:SECTIONS语句和语句和MEMORY语句SECTIONS语句用于描述输出文件中的模语句用于描述输出文件中的模块怎样布局,块怎样布局,MEMORY语句描述目标机中语句描述目标机中可以用的存储单元可以用的存储单元碘逢拜焰够阉譬扦鬃激圾衷砍秩侵宋浙低涕凸读详胀柑常渤酗撼娃宽巳多第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((2)表达式)表达式在在linkcmds中的表达式与中的表达式与C语言中的表达语言中的表达式类似,它们具有如下的特征:式类似,它们具有如下的特征:ØØ表达式的值都是表达式的值都是“unsigned long”或者或者“long”类型类型ØØ常数都是整数常数都是整数ØØ支持支持C语言中的操作符语言中的操作符ØØ可以引用或者定义全局变量可以引用或者定义全局变量ØØ可以使用内建的函数可以使用内建的函数锹酿肢嫉应银侗洒滋街孟施馒艇亏歧藩钢致命甜艰志痹蓖殉池法松浚竟邀第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ①① 整数整数ØØ八进制数以八进制数以‘0’开头,例如:开头,例如:0234;;ØØ十进制数以非十进制数以非0的数字开头,例如:的数字开头,例如:567;;ØØ十六进制数以十六进制数以‘0x’或或‘0X’开头,例如:开头,例如:0x16;;ØØ负数以运算符负数以运算符‘-’开头,例如:开头,例如:-102;;ØØ以以K,,M为后缀分别表示以为后缀分别表示以1024,,1024*1024为单位,例如:为单位,例如:var1 = 1K和和var1 = 1024相等,相等,var2 = 1M和和var2 = 1024*1024相等。

      相等 矛庭芝周琢肄孵串硬宾趁寿袁右滞撬奥吼渠驱某镐鸵噪几挡给迎庐叼渡室第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ②② 变量名变量名ØØ以字母、下划线和点开头,可以包含任何字以字母、下划线和点开头,可以包含任何字母、下划线、数字、点和连接符母、下划线、数字、点和连接符ØØ变量名不能和关键字一样,如果变量名和关变量名不能和关键字一样,如果变量名和关键字一样,或者变量名中包含空格时,必须将变键字一样,或者变量名中包含空格时,必须将变量名包含在量名包含在“”中中.例如:例如:“SECTION”==9;;“with a space”==“also with a space” + 10;;在在arm-elf-ld命令语言中,空格用于界定相邻命令语言中,空格用于界定相邻符号,例如:符号,例如:A-B表示一个变量名,而表示一个变量名,而A - B表示表示一个减法的表达式一个减法的表达式 吻深苫契圈旷儿遗辅稿角龚卯可益楔裴站莹叮朔前琵盅烘醛给仿氛轿迎彬第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ③③ 地址记数器点号地址记数器点号“. ”Ø“.”是一个包含当前输出地址的计数器。

      是一个包含当前输出地址的计数器Ø因为因为“.”总是表示某个输出段的地址,总是表示某个输出段的地址,所以总是和表达式一起在所以总是和表达式一起在SECTIONS命令中命令中出现Ø“.”可以在任何一般符号出现的地方出可以在任何一般符号出现的地方出现,对现,对“.”的赋值将引起计数器所指位置的的赋值将引起计数器所指位置的移动,而计数器位置不能反向移动移动,而计数器位置不能反向移动箍就滓铆猿暴学判恶冬村屹秘道歪翟镐缘认你刮盯营奴帮激嘱脱妈着腊慷第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:SECTIONS{output::{file1(.text). = . + 1000;;file2(.text). += 1000;;file3(.text)} = 0x1234;;}在左面的例子中,在左面的例子中,在在file1((.text))与与file2((.text))之间被空出了之间被空出了1000个字节的空间,个字节的空间,file2((.text)与)与file3((.text)之)之间也被空出了间也被空出了1000个字节的空间,而个字节的空间,而0x1234为该分段的为该分段的空间空隙的填充值。

      空间空隙的填充值 蚕营悼余教榆起膛并荐京墙制务墨花躇张股轴周绦鲍众辟酒盐引灾电疲抖第3章程序设计基础ppt课件第3章程序设计基础ppt课件 可以将可以将“.”赋给变量赋给变量;也可以对也可以对“.”赋值例如:例如:data_start = . ;;.= . + 2000;;鹅炮涌钝曹真卡获廉婿昔官雏罗坏带峦蕉坡啼伶降奴丘缓忌父录迄镍倚斤第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((3))linkcmds的结构的结构linkcmds文件主要由四个部分文件主要由四个部分组成组成::1.1.程序入口说明:用于指定程序运行时所需程序入口说明:用于指定程序运行时所需要执行的第一条指令的地址要执行的第一条指令的地址2.2.程序头说明:生成目标文件类型为程序头说明:生成目标文件类型为ELF,可,可以指定详细的程序头信息以指定详细的程序头信息3.3.内存布局的说明:用于规划内存的布局,内存布局的说明:用于规划内存的布局,将内存空间划分为不同的部分将内存空间划分为不同的部分4.4.分段的分步说明:详细指明各个分段的构分段的分步说明:详细指明各个分段的构成以及分段的定位地址和装载地址成以及分段的定位地址和装载地址。

      其中其中①①和和④④的部分不能被省略的部分不能被省略 蘑忽庭花扩垄泞颤拒劲葬痰哎受央淫佬搜裔捶锥艾纤卧以贫稻诊互遭枯管第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((4)对程序入口的说明)对程序入口的说明arm-elf-ld命令语言有一条特定命令用于指定命令语言有一条特定命令用于指定输出文件中第一条可执行指令输出文件中第一条可执行指令,即程序的入口点即程序的入口点该命令格式如下:该命令格式如下:ENTRY((symbol))其中其中ENTRY是保留字,是保留字,symbol表示程序的表示程序的入口地址,通常是用一个全局地址标号(入口地址,通常是用一个全局地址标号(label))来表示入口地址来表示入口地址例如,在程序中的开始地方有一标号:例如,在程序中的开始地方有一标号:.global demo_startdemo_start:movl $_stack_top,,%esp……敢龋荚脆努边速猎华渭馆歇球轨锨蚜澳痈彦箍留刷缓垛嚷兰御镭绦滤季蝇第3章程序设计基础ppt课件第3章程序设计基础ppt课件 那么在那么在linkcmds中可以用下面的方式说明中可以用下面的方式说明程序的入口:程序的入口:ENTRY(demo_start);该命令可以作为单独的一条命令放在该命令可以作为单独的一条命令放在linkc–mds的任何位置,也可以放在的任何位置,也可以放在SECTIONS内关内关于段的定义部分,都对布局起作用。

      于段的定义部分,都对布局起作用指定入口地址的方式还有很多,现在按优先指定入口地址的方式还有很多,现在按优先级递减的顺序描述如下:级递减的顺序描述如下:ØØ用用‘-e’选项指定入口地址选项指定入口地址ØØ在在linkcmds里用里用ENTRY((symbol)指令)指令ØØ变量变量start的值,如果有变量的值,如果有变量startØØ.text段第一字节的地址,如果存在段第一字节的地址,如果存在ØØ0地址地址秽式瞬酥宜依针薪桃干霸娄志帕婚矮白唾锐灼曙郎钵渗水碗此村纲脚事华第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((5)对程序头的说明)对程序头的说明ELF格式文件需要使用程序头,它用格式文件需要使用程序头,它用于描述程序应该怎么被装入内存于描述程序应该怎么被装入内存在默认情况下,在默认情况下,arm-elf-ld可以自己可以自己生成一个程序头,用户也可以用生成一个程序头,用户也可以用PHDRS自己编写程序头,当运用该命令时,自己编写程序头,当运用该命令时,arm-elf-ld不会生成默认的程序头不会生成默认的程序头注意:如果没有特殊要求,建议用户注意:如果没有特殊要求,建议用户不要不要自己写程序头。

      自己写程序头凌铰驳笋抨媳丹遵寿虱贝滓隆竣炮渭啪捉突油卖豪戍前热苔摊撤侮鹰朽谨第3章程序设计基础ppt课件第3章程序设计基础ppt课件 PHDRSPHDRS{ {name type [ FILEHDR ] [ PHDRS ] [ AT ( address ) name type [ FILEHDR ] [ PHDRS ] [ AT ( address ) ] ] [ FLAGS [ FLAGS((((flagsflags))))] ] ;;;;} }其中其中其中其中PHDRSPHDRS、、、、FILEHDRFILEHDR、、、、ATAT、、、、FLAGSFLAGS都是关键字都是关键字都是关键字都是关键字namename表示段(表示段(表示段(表示段(SegmentSegment)的名字,而该段)的名字,而该段)的名字,而该段)的名字,而该段((((SegmentSegment)装入的内容由)装入的内容由)装入的内容由)装入的内容由SECTIONSSECTIONS中对分段中对分段中对分段中对分段((((SectionSection)的描述决定,例如:)的描述决定,例如:)的描述决定,例如:)的描述决定,例如:SECTIONS{SECTIONS{……secname start BLOCK(align) (NOLOAD) : AT ( secname start BLOCK(align) (NOLOAD) : AT ( ldadr )ldadr ){ contents } >region :phdr =fill{ contents } >region :phdr =fill……} }躲冈叠泳雨蜜彩颓哦虑瓮僵僻综业绰携账戏棺垢勤秆官染阐缅会经拽状罗第3章程序设计基础ppt课件第3章程序设计基础ppt课件 因此因此因此因此PHDRSPHDRS中的中的中的中的namename应该和应该和应该和应该和SECTIONSSECTIONS中的中的中的中的phdrphdr保持一致。

      保持一致保持一致保持一致typetype表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意一种类型(括号内表示关键字的值):一种类型(括号内表示关键字的值):一种类型(括号内表示关键字的值):一种类型(括号内表示关键字的值):ØØPT_NULL (0) ——PT_NULL (0) ——空程序头空程序头空程序头空程序头ØØPT_LOAD (1) ——PT_LOAD (1) ——描述一个可装入的段描述一个可装入的段描述一个可装入的段描述一个可装入的段ØØPT_DYNAMIC (2)——PT_DYNAMIC (2)——表示包含动态链接信息的段表示包含动态链接信息的段表示包含动态链接信息的段表示包含动态链接信息的段ØØPT_INTERP (3) ——PT_INTERP (3) ——表示该段包含程序解释器的表示该段包含程序解释器的表示该段包含程序解释器的表示该段包含程序解释器的名字名字名字名字ØØPT_NOTE (4) ——PT_NOTE (4) ——表示包含注释信息的段表示包含注释信息的段表示包含注释信息的段表示包含注释信息的段ØØPT_SHLIB (5) ——PT_SHLIB (5) ——一个保留的程序头一个保留的程序头一个保留的程序头一个保留的程序头ØØPT_PHDR (6) ——PT_PHDR (6) ——表示该段可能包含程序头的描述表示该段可能包含程序头的描述表示该段可能包含程序头的描述表示该段可能包含程序头的描述信息信息信息信息ØØexpression ——expression ——用数值表示一个程序头的类型,用数值表示一个程序头的类型,用数值表示一个程序头的类型,用数值表示一个程序头的类型,该类型没有对应的关键字该类型没有对应的关键字该类型没有对应的关键字该类型没有对应的关键字尸絮没冉罪芬渝姚哑痹懂要夜尺罕洽哮摘汤戳髓鬃盆熊瑚关拂挠恒狈氟膘第3章程序设计基础ppt课件第3章程序设计基础ppt课件 FILEHDRFILEHDR表示在段中包含表示在段中包含表示在段中包含表示在段中包含ELFELF文件头的信息。

      文件头的信息文件头的信息文件头的信息PHDRSPHDRS表示在段中还要包含程序头本身的信息表示在段中还要包含程序头本身的信息表示在段中还要包含程序头本身的信息表示在段中还要包含程序头本身的信息[AT (address)][AT (address)]表示该段的起始地址,若在表示该段的起始地址,若在表示该段的起始地址,若在表示该段的起始地址,若在SECTIONSSECTIONS中也有中也有中也有中也有ATAT时,程序头中定义的时,程序头中定义的时,程序头中定义的时,程序头中定义的ATAT优先例如:例如:例如:例如:PHDRSPHDRS{ {headers PT_PHDR PHDRS ;headers PT_PHDR PHDRS ;interp PT_INTERP ;interp PT_INTERP ;text PT_LOAD FILEHDR PHDRS ;text PT_LOAD FILEHDR PHDRS ;data PT_LOAD ;data PT_LOAD ;dynamic PT_DYNAMIC ;dynamic PT_DYNAMIC ;} }话旺祥叫会移斗弄滤览正序燎选或垫瘫寂榜盐其恍勃劲而乡陪医襟呐樟干第3章程序设计基础ppt课件第3章程序设计基础ppt课件 SECTIONSSECTIONS{ {. = SIZEOF_HEADERS;. = SIZEOF_HEADERS;.interp : { *(.interp) } :text :interp.interp : { *(.interp) } :text :interp.text : { *(.text) } :text.text : { *(.text) } :text.rodata : { *(.rodata) } /* defaults to :text */.rodata : { *(.rodata) } /* defaults to :text */....... = . + 0x1000; /* move to a new page in memory */. = . + 0x1000; /* move to a new page in memory */.data : { *(.data) } :data.data : { *(.data) } :data.dynamic : { *(.dynamic) } :data :dynamic.dynamic : { *(.dynamic) } :data :dynamic......} }奴她园迟洒味私峡表崖称浮饥碑教哦尿蛀滥楚冶帝哲趣吵浆民疆葬琐殆画第3章程序设计基础ppt课件第3章程序设计基础ppt课件 在上面的例子中,定义了在上面的例子中,定义了5个段:个段:Øheaders申明一个程序头段;申明一个程序头段;Øinterp申明一个段,段中包含了程申明一个段,段中包含了程序解释器的名字;序解释器的名字;Øtext申明一个可被下载的段,并且申明一个可被下载的段,并且包含了文件的头信息和各段的信息;包含了文件的头信息和各段的信息;Ødata申明一个可被下载的段;申明一个可被下载的段;Ødynamic申明一个包含动态链接信申明一个包含动态链接信息的段;息的段; 疽填斤赞甜啮鹤侧俊箔慈娃娘插滩喻印骨噪烁烩擂绞涌叁墨赢苞夕夹喜沼第3章程序设计基础ppt课件第3章程序设计基础ppt课件 在在SECTIONS中可以看到,有的分中可以看到,有的分段同时属于两个段,实质上是这两段同时属于两个段,实质上是这两个段占用同一空间。

      个段占用同一空间rodata也属于也属于.text段是由于它的段是由于它的上一个分段属于上一个分段属于.text段,而段,而.rodata又没有指明归属段又没有指明归属段注意:如果没有特殊要求,建议用注意:如果没有特殊要求,建议用户不要自己写程序头户不要自己写程序头 重案睫钨柬胰皑绩斟淬疏辩谆闰貌漏悟髓儡做滚效毁浙偷痞卜掖乒氦濒传第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((6)对内存布局的说明)对内存布局的说明arm-elf-ld的默认配置允许将输出程的默认配置允许将输出程序定位到任何可用内存序定位到任何可用内存用户也可以用用户也可以用MEMORY命令对内存命令对内存进行配置进行配置MEMORY命令可以定义目标机内存命令可以定义目标机内存段的位置和大小,当装载的程序块大小段的位置和大小,当装载的程序块大小超出指定的内存段大小时,超出指定的内存段大小时,arm-elf-ld会会提示出错,而不会自动寻找可用的内存提示出错,而不会自动寻找可用的内存段,这样可以避免内存分配错误段,这样可以避免内存分配错误 拔身侧赌瘫谁者右蓝廓鱼桥规弃匡书屏汲缄带估接鸣哗阅韶憾熬痈蔷吹罪第3章程序设计基础ppt课件第3章程序设计基础ppt课件 定义内存段的方式:定义内存段的方式:MEMORY{name (attr) :ORIGIN = origin, LENGTH = len…}ØØname表示内存段的名字,可以使用任何变量表示内存段的名字,可以使用任何变量名,但是不能和已有变量名、文件名和分段名名,但是不能和已有变量名、文件名和分段名((section name)冲突。

      冲突ØØattr没有实际的用途,可省略没有实际的用途,可省略ØØorigin(可简写为:(可简写为:org或者或者o)表示内存段的)表示内存段的起始位置起始位置ØØLength(可简写为可简写为:len或者或者l)表示内存段的长表示内存段的长度度. 啮琴踞杠次艺睛约绿并抚睦浸姬鸽肖教白踞偷二码舅诛交肄饵适扛宦慨量第3章程序设计基础ppt课件第3章程序设计基础ppt课件 MEMORY{rom : ORIGIN = 0x3f80000, LENGTH = 512Kram : org = 0, l = 1M} 表示定义了两个内存段:表示定义了两个内存段:Ørom内存段,起始地址为内存段,起始地址为0x3f80000,长,长度为度为512K;;Øram内存段,起始地址为内存段,起始地址为0,长度为,长度为1M暑隔笨砧惋汛蠕烛碧网寨颐献番滥眩飘丛恭息僵钥堤燕磺槛老啃竹乘俄韭第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((7)对分段的说明)对分段的说明SECTIONS命令控制如何正确地命令控制如何正确地将输将输入分段定位到输出分段入分段定位到输出分段,包括在输出文件中包括在输出文件中的顺序的顺序,和输入分段在输出分段中的定位。

      和输入分段在输出分段中的定位如果不用如果不用SECTIONS命令,命令,arm-elf-ld将对每个输入分段生成相同名字的输出分将对每个输入分段生成相同名字的输出分段,分段的顺序由输入文件中遇到的分段段,分段的顺序由输入文件中遇到的分段的先后顺序决定的先后顺序决定 邦商惹牲输秋乖估拖选馋颧挖桥至乙驼冀忻瞅瘟衡哉呵辱剔卓极钢烃懈捉第3章程序设计基础ppt课件第3章程序设计基础ppt课件 SECTIONS命令的格式:命令的格式:SECTIONS{...secname start BLOCK(align) (NOLOAD) : AT ( ldadr )secname start BLOCK(align) (NOLOAD) : AT ( ldadr ){ contents } >region :phdr =fill...}其中其中secname和和contents都是必须有的都是必须有的secname表示输出分段的名字,受输出格式的限表示输出分段的名字,受输出格式的限制,一些输出格式对段名有限制,制,一些输出格式对段名有限制,例如例如a.out只允许只允许.text,.data或或.bss的分段名存在的分段名存在.另外另外arm-elf-ld不输出空的分段。

      不输出空的分段 姚赤郭拿利广述恫讲蔚纱牌捍掣嫂惨绝疡仑粪沽梗促陆烙受藐宿拟溃押汤第3章程序设计基础ppt课件第3章程序设计基础ppt课件 startstart,,,,BLOCKBLOCK((((alignalign)))), ,((((NOLOADNOLOAD)))),AT,AT((((ldadrldadr)))), , >region>region,,,,:phdr:phdr,,,,=fill=fill都是可选项:都是可选项:Start 表示分段的起始地址表示分段的起始地址表示分段的起始地址表示分段的起始地址, ,该地址被称为重定位该地址被称为重定位该地址被称为重定位该地址被称为重定位地址地址地址地址; ;BLOCK((align))表示分段以表示分段以align对齐;对齐;((NOLOAD))表示该段不能被装载;表示该段不能被装载;AT (ldadr) 表示该分段装入的起始地址为表示该分段装入的起始地址为表示该分段装入的起始地址为表示该分段装入的起始地址为ldadrldadr,当没有该参数时分段的装入地址和重定位地址相同;,当没有该参数时分段的装入地址和重定位地址相同;,当没有该参数时分段的装入地址和重定位地址相同;,当没有该参数时分段的装入地址和重定位地址相同;糟句步嚏蔼缀盅贿碗血寥敝钩介懂邀撒雌规躬仰饶锨恕黎沪邻韵赎抿柞邱第3章程序设计基础ppt课件第3章程序设计基础ppt课件 Øregion 表示该分段地址空间在表示该分段地址空间在region所定义的范围内所定义的范围内,region就是在就是在MEMORY命命令中定义的内存段名字;令中定义的内存段名字;Ø:phdr 表示该分段的装载地址空间在表示该分段的装载地址空间在phdr定义的范围内,定义的范围内,phdr就是在程序头中就是在程序头中定义的段名字;定义的段名字;Ø=fill 表示在该分段的空间空隙的填充表示在该分段的空间空隙的填充值。

      值 海师吏愧奇谎相晤目厩议拧佰退好大借撮蛙纫胶冕侥塔稗巨潜淄眠遍尔尾第3章程序设计基础ppt课件第3章程序设计基础ppt课件 contents表示具体的分段内容,主要表示具体的分段内容,主要描述该输出分段中包含有输入文件中的哪描述该输出分段中包含有输入文件中的哪些分段常见的分段名如下:常见的分段名如下:Ø.text ——表示代码段表示代码段Ø.data ——初始化了的数据段初始化了的数据段Ø.bss ——未初始化的数据段未初始化的数据段Ø.rodata ——不可写的数据段不可写的数据段ØCOMMON ——未初始化的数据段未初始化的数据段绕罚掐丑填操火受真临巴化乌花穷灸木缠愤粒莆蚤磁篙灼亚虐樊搐胡獭货第3章程序设计基础ppt课件第3章程序设计基础ppt课件 用户在汇编语言程序中可以自定义分用户在汇编语言程序中可以自定义分段名,如:段名,如:mycode、、mydata之类 在在C语言文件编译成目标文件后语言文件编译成目标文件后,通常通常包含有包含有.text、、.data、、COMMON、、.rodata段其中其中.rodata表示不可写的数据段,通表示不可写的数据段,通常包含在常包含在C语言程序中定义的一些常量,语言程序中定义的一些常量,如如const char version_string[ ]=“Lambda x86/fpm”之类。

      之类 箩雏捂梁既毖判才寇潮做伊调携劳贾福记桓夜自传颠勤最僻垣韵宴疡栈绎第3章程序设计基础ppt课件第3章程序设计基础ppt课件 contents可用格式:ØfilenameØfilename((section))Øfilename((section,,section,,…))Øfilename((section section …))和针对所有文件的:和针对所有文件的:Ø*((section))Ø*((section,,section,,…))Ø*((section section …))刺佳份抄晤非益柑疾酚苑施搭怯愧解坦班鲸晾稳缉孕嫂拍沛纯振械缆舱嚏第3章程序设计基础ppt课件第3章程序设计基础ppt课件 如果在用如果在用“*”指定所有文件时,以指定所有文件时,以前已经使用前已经使用filename指定过一些文件,指定过一些文件,那么那么“*”表示剩下的文件:表示剩下的文件:filename((COMMON))*((COMMON))指定输入文件中名为指定输入文件中名为COMMON的的分段里未初始化的数据在输出分段中的分段里未初始化的数据在输出分段中的位置下面举例说明下面举例说明contents中的具体内中的具体内容及编写方法。

      容及编写方法 眯素陀捶物挝照囤肺祝觅桥疆噎帅捍陶热肖劲患趾剖愿碴蹲漆呼越贺庶柒第3章程序设计基础ppt课件第3章程序设计基础ppt课件 下面举例说明下面举例说明下面举例说明下面举例说明contentscontents中的具体内容及编写方法中的具体内容及编写方法中的具体内容及编写方法中的具体内容及编写方法例如:例如:例如:例如:.text 0 :.text 0 :{ file1.o file2.o file3.o } { file1.o file2.o file3.o } 表示将表示将表示将表示将file1.ofile1.o、、、、file2.ofile2.o、、、、file3.ofile3.o中的所有分段中的所有分段中的所有分段中的所有分段都放在输出文件的都放在输出文件的都放在输出文件的都放在输出文件的.text.text段中例如:例如:例如:例如:.text 0 :.text 0 :{ {*(.text);*(.text);} }表示将所有输入文件中的表示将所有输入文件中的表示将所有输入文件中的表示将所有输入文件中的.text.text分段都放在输分段都放在输分段都放在输分段都放在输出文件的出文件的出文件的出文件的.text.text段中。

      段中 普夏昼邪谍纬删氧观初葬散间南翔浇突烃试患帧仑咋嘿侣兢舆象臻撤壕柯第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:.text 0 :{file1.o (.text);file2.o (.text);file3.o (.text);} 表示将表示将file1.o、、file2.o、、file3.o中的中的.text段都放在输出文件的段都放在输出文件的.text段中 伤铝瑞横疥怎攻撤刘比拷捆妙搀娄边瑟治趋踪瘁太熙婶孙狭机挚鼻译夏负第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:text1 :{file1.o (.text);}text2 :{*(.text);}表示将表示将file1.o中的中的.text段放在输出文件段放在输出文件的的text1段中,而其他输入文件的段中,而其他输入文件的.text段都段都放在输出文件的放在输出文件的text2段 凸涵迟梢云笺墙钾凡奋衡苦弟帘渤义率鞠妊烯饭留筛玩春荣坟哎淤咨短娩第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((8)注释)注释arm-elf-ld语言中的注释和语言中的注释和C语语言一样。

      言一样 例如:例如:/* comments */咆汞枕洲咯窿合濒逾碴枪鹏量娶睦斟香渐白屑贱釜盯吓偏铺库祷甭藤氟郸第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.4 工程管理器工程管理器 MAKE3.4.1 概述概述make是用于自动编译、链接程是用于自动编译、链接程序的实用工具序的实用工具使用使用make后就不需要手工编译后就不需要手工编译每个程序文件每个程序文件鹃十吭士童妈贮履觉春善把拔赴钧粤锈桃贞汲品荐为鹤萧十巷铭童钓较珠第3章程序设计基础ppt课件第3章程序设计基础ppt课件 要使用要使用make,首先要编写,首先要编写makefile ,,makefile描述程序文件之间的依赖关系以及描述程序文件之间的依赖关系以及提供更新文件的命令提供更新文件的命令典型地,在一个程序中,可执行文件依典型地,在一个程序中,可执行文件依赖于目标文件,而目标文件依赖于源文件赖于目标文件,而目标文件依赖于源文件 如果如果makefile文件存在,每次修改完源文件存在,每次修改完源程序后,用户通常所需要做的事情就是在命程序后,用户通常所需要做的事情就是在命令行敲入令行敲入“make”,然后所有的事情都由,然后所有的事情都由make来完成。

      来完成 宫止葫磷趋膛勃亡管咎婚汽歌侮势姚辉瘦叠拣篓岂穿虞蓝虽聪猛掐毙掇詹第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.命令格式.命令格式make [-f makefile] [option] [target]… ØØmake命令后跟命令后跟-f选项,指定选项,指定makefile的名的名字为字为makefile;;ØØoption表示表示make的一些选项的一些选项ØØ;;target是是make指定的目标,在指定的目标,在3.4.3将详将详细说明例如例如:makefile的名字是的名字是my_hello_make::make –f my_hello_makemake –f my_hello_make策匆联畏家按搞椰蝇咳坍贞渤朝枕穗赌纤桌妇率蕾煤吼调丧恍瞒汤路摆幌第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.命令选项列表.命令选项列表ØØ-f指定指定makefileØØ-e使环境变量优先于使环境变量优先于makefile的变量的变量ØØ-I dir设定搜索目录设定搜索目录ØØ-i忽略忽略make过程中所有错误过程中所有错误ØØ-n只显示执行过程,而不真正执行只显示执行过程,而不真正执行ØØ-r使隐含规则无效使隐含规则无效ØØ-w显示工作目录显示工作目录ØØ-C dir读取读取makefile设置的工作目录设置的工作目录ØØ-s不显示执行的命令不显示执行的命令 训拆云笛鸳只屠混崭埃奋妮泽洼狱捡饿秃溉真汐档撇纺鞭荤枪嫉倘栅氏萨第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.4.2 命令使用命令使用 makefile文件用来告诉文件用来告诉make需要做的事情,需要做的事情,通常指怎样编译、怎样链接一个程序。

      通常指怎样编译、怎样链接一个程序以以C语言程序为例语言程序为例:ØØ在用在用make重新编译的时候,如果一个头文重新编译的时候,如果一个头文件已被修改,则包含这个头文件的所有件已被修改,则包含这个头文件的所有C源代码源代码文件都必须被重新编译文件都必须被重新编译ØØ而每个目标文件都与而每个目标文件都与C的源代码文件有关,的源代码文件有关,如果有源代码文件被修改过,则所有目标文件都如果有源代码文件被修改过,则所有目标文件都必须被重新链接生成最后的结果必须被重新链接生成最后的结果编写一个编写一个makefile将在将在3.4.3节详细介绍节详细介绍惟搭牵茄蓟龚眉充肆确苏呼纫齐悯布贸滤裁稀碴两岸糖酱究幽翰卸甫蚂鄙第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.指定.指定makefile-f makefileØ用该选项指定用该选项指定makefile的名字为的名字为makefileØ如果如果make中多次使用中多次使用-f指定多个指定多个makefile,则所有,则所有makefile将链接起来作为将链接起来作为最后的最后的makefileØ如果不指定如果不指定makefile,,make默认的默认的makefile依次为依次为“makefile”、、“Makefile”。

      例如:例如:make –f my_hello_make根羌衍示期孵蝶夷携潞沛阔蘸深跺殴汀敞缮氢匹魏仿柴撅壕借油盼菊钻额第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.使环境变量优先于.使环境变量优先于makefile文件中的变量文件中的变量-e使环境变量优先于使环境变量优先于makefile文件中的变量文件中的变量例如:例如: make –e谗董雨湍氰滔桩载搁戮露札蹿漂常虽御泛拂自臭拓逼媚畦蕉攫撅氨肮关徽第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.指定包含文件的搜索路径.指定包含文件的搜索路径-I dirØ指定在解析指定在解析makefile文件中的文件中的.include时的搜索路径为时的搜索路径为dirØ如果有多个路径,将按输入顺如果有多个路径,将按输入顺序依次查找序依次查找例如:例如:make –I/include/mk病趣州拷象缸目珍幢蔷送兢锹孩愉叫前膜咸厉荆廖申解咕鼎坐邑芍仑磕括第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4.忽略错误.忽略错误-i忽略忽略make执行过程中的所有错误执行过程中的所有错误例如:例如:make –i 5.显示命令的执行过程.显示命令的执行过程-n只显示命令的执行过程而不真正执行。

      只显示命令的执行过程而不真正执行例如:例如:make –n 陪袄硝赞芜诌彬漓罢献萍馁鉴康钻劈嚷主稀永啃焕俺抨哆祁蕊姆钙瘪拟束第3章程序设计基础ppt课件第3章程序设计基础ppt课件 6.使隐含规则无效.使隐含规则无效-r使使make的隐含规则无效,清除后缀名规的隐含规则无效,清除后缀名规则中默认的后缀清单则中默认的后缀清单例如:例如:make –r7.显示执行过程中的工作目录.显示执行过程中的工作目录-w显示显示make执行过程中的工作目录执行过程中的工作目录例如:例如:make –w谍册晕阿仕乏装仟口怖恒块彦棠证嗅衙袱雕余烧动伤梗续脉删嗜燃也屋槽第3章程序设计基础ppt课件第3章程序设计基础ppt课件 8.读取.读取makefile文件前设置工作目录文件前设置工作目录-C dirØ在读取在读取makefile文件以前将工作目录改文件以前将工作目录改变为变为dir,完成,完成make后改回原来的目录后改回原来的目录Ø如果在一次如果在一次make中使用多个中使用多个-C选项,选项,每个选项都和前面一个有关系每个选项都和前面一个有关系Ø“-C dir0 / -C dir1 ”与与“-C dir0 / dir1”等价等价.例如:例如:make –C bsp尚港钟忠团蒜哦的冕皮器币岁琉扳轧脑怒冠不柱犯牲幽锻栓尝层箩粘船模第3章程序设计基础ppt课件第3章程序设计基础ppt课件 9.不显示所执行的命令.不显示所执行的命令-s运行运行make时用选项时用选项-s可以不显示执可以不显示执行的命令,只显示生成的结果文件。

      行的命令,只显示生成的结果文件例如:例如:make –s免服塔凋苫槽碗藻应视邦晕庙酥笋娥喇硒萧吮筋岭稚诌铣讥慢边香捏贾逢第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.4.3 编写一个编写一个makefile1. makefile的结构的结构makefile文件包含:文件包含:Ø显式规则显式规则Ø隐含规则隐含规则Ø变量定义变量定义Ø指令指令Ø注释注释吹坟秉帧肯繁楷纽癣衔骗渴传锭快议蛇隋鼓伸辜竖像晦端奔镶过谚瞒恤芍第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 编写编写makefile中的规则中的规则makefilemakefile中规则的格式如下:中规则的格式如下:中规则的格式如下:中规则的格式如下:targets targets ::::dependenciesdependenciescommandcommand……或者或者或者或者targets targets ::::dependencies dependencies ;;;;commandcommandcommandcommand……ØØtargets targets 指定目标名,通常是一个程序产生的目标文件名,指定目标名,通常是一个程序产生的目标文件名,指定目标名,通常是一个程序产生的目标文件名,指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名字,名字之间用空格隔开。

      也可能是执行一个动作的名字,名字之间用空格隔开也可能是执行一个动作的名字,名字之间用空格隔开也可能是执行一个动作的名字,名字之间用空格隔开ØØdependencydependency 描述产生描述产生描述产生描述产生targettarget所需的文件,一个所需的文件,一个所需的文件,一个所需的文件,一个targettarget通常通常通常通常依赖于多个依赖于多个依赖于多个依赖于多个dependencydependencyØØcommand command 用于指定该规则的命令用于指定该规则的命令用于指定该规则的命令用于指定该规则的命令注意:注意:注意:注意:commandcommand必须以必须以必须以必须以TABTAB键开头如果某一行过长可以键开头如果某一行过长可以键开头如果某一行过长可以键开头如果某一行过长可以分作两行,用分作两行,用分作两行,用分作两行,用‘\’‘\’连接扇配领刑魁构率晒研峪沃柞零酝糟琢施寄颊该芍噪蔓呐创尘走笑霖绘粤七第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:例如:例如:smcinitsmcinit::::smc.o config.osmc.o config.oarm-elf-ar –ruvs –o smcinit.a smc.o config.oarm-elf-ar –ruvs –o smcinit.a smc.o config.osmc.osmc.o::::smc.c include.hsmc.c include.harm-elf-gcc –c –o smc.o smc.carm-elf-gcc –c –o smc.o smc.cconfig.oconfig.o::::config.c include.hconfig.c include.harm-elf-gcc –c –o config.o config.carm-elf-gcc –c –o config.o config.ccleanclean::::rm *.orm *.oØØ表示目标名的有表示目标名的有表示目标名的有表示目标名的有smcinitsmcinit、、、、smc.osmc.o、、、、config.oconfig.o。

      smcinitsmcinit依赖于依赖于依赖于依赖于smc.osmc.o和和和和config.oconfig.o,而,而,而,而smc.osmc.o又依赖于又依赖于又依赖于又依赖于smc.csmc.c和和和和include.h,config.oinclude.h,config.o依赖于依赖于依赖于依赖于config.oconfig.o和和和和include.h.include.h.ØØ各目标分别由命令各目标分别由命令各目标分别由命令各目标分别由命令arm-elf-ar –ruvs –o smcinit.a arm-elf-ar –ruvs –o smcinit.a smc.o config.osmc.o config.o;;;;arm-elf-gcc –c –o smc.o smc.carm-elf-gcc –c –o smc.o smc.c;;;;arm-elf-gcc –c –o config.o config.carm-elf-gcc –c –o config.o config.c来生成ØØcleanclean为一动作名,删除所有后缀为为一动作名,删除所有后缀为为一动作名,删除所有后缀为为一动作名,删除所有后缀为.o.o的文件。

      的文件 最敲垂蘸灰怀食猛费锯冗钧还皱晃录胺献井厚侯蓖蕾蓝踌排醉笨能绸嫉阻第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. make调用调用makefile中的规则中的规则在默认情况下,在默认情况下,在默认情况下,在默认情况下,makemake运行不是以运行不是以运行不是以运行不是以“.”“.”开头的第一开头的第一开头的第一开头的第一条规则在上面的例子中,条规则在上面的例子中,条规则在上面的例子中,条规则在上面的例子中,makemake默认执行的是规则默认执行的是规则默认执行的是规则默认执行的是规则smcinitsmcinit,此时只需要输入命令:,此时只需要输入命令:,此时只需要输入命令:,此时只需要输入命令: makemakemakemake将读入将读入将读入将读入makefilemakefile,然后执行第一条规则,例,然后执行第一条规则,例,然后执行第一条规则,例,然后执行第一条规则,例子中该规则是链接目标文件生成库,因此必须执行规则子中该规则是链接目标文件生成库,因此必须执行规则子中该规则是链接目标文件生成库,因此必须执行规则子中该规则是链接目标文件生成库,因此必须执行规则smcinitsmcinit依赖的规则依赖的规则依赖的规则依赖的规则smc.osmc.o和和和和config.oconfig.o。

      在执行过程中在执行过程中在执行过程中在执行过程中将自动更新他们所依赖的文件将自动更新他们所依赖的文件将自动更新他们所依赖的文件将自动更新他们所依赖的文件有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要makemake指定才能指定才能指定才能指定才能被运行,如上面的例子中的被运行,如上面的例子中的被运行,如上面的例子中的被运行,如上面的例子中的cleanclean规则可以这样执行:规则可以这样执行:规则可以这样执行:规则可以这样执行:make cleanmake clean这两种方式的结果一样只是第一种方式没指明目这两种方式的结果一样只是第一种方式没指明目这两种方式的结果一样只是第一种方式没指明目这两种方式的结果一样只是第一种方式没指明目标名,第二种方式指明了目标名标名,第二种方式指明了目标名标名,第二种方式指明了目标名标名,第二种方式指明了目标名病非况搐剐岭甚漆忆赏乍籍吠冲踩钮训狼俐巡诵锻栏速撑渍切誉摔给涯诸第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4.设置设置makefile中文件的搜索路径中文件的搜索路径在在在在makefilemakefile中,可以通过给中,可以通过给中,可以通过给中,可以通过给VPATHVPATH赋值来设置规则中目标文赋值来设置规则中目标文赋值来设置规则中目标文赋值来设置规则中目标文件和依赖文件的搜索目录。

      件和依赖文件的搜索目录件和依赖文件的搜索目录件和依赖文件的搜索目录makemake首先搜索当前目录,如果未找到首先搜索当前目录,如果未找到首先搜索当前目录,如果未找到首先搜索当前目录,如果未找到依赖的文件,依赖的文件,依赖的文件,依赖的文件,makemake将按照将按照将按照将按照VPATHVPATH中给的目录依次搜索中给的目录依次搜索中给的目录依次搜索中给的目录依次搜索VPATHVPATH对对对对makefilemakefile中所有文件都有效中所有文件都有效中所有文件都有效中所有文件都有效例如:例如:例如:例如:demo.odemo.o::::demo.c demo.hdemo.c demo.hdemo.cdemo.c在目录在目录在目录在目录//c/demo///c/demo/中,中,中,中,demo.hdemo.h在目录在目录在目录在目录//c/demo/head///c/demo/head/中,则可以给中,则可以给中,则可以给中,则可以给VPATHVPATH变量赋值:变量赋值:变量赋值:变量赋值:VPATH VPATH ::::= //c/demo //c/demo/head= //c/demo //c/demo/head或者或者或者或者VPATH VPATH ::::= //c/demo= //c/demo:::://c/demo/head //c/demo/head 也可以使用指令也可以使用指令也可以使用指令也可以使用指令vpathvpath,与,与,与,与VAPTHVAPTH在使用上的在使用上的在使用上的在使用上的区别区别区别区别是是是是:vpath:vpath可以给不同类文件指定不同的搜索目录。

      可以给不同类文件指定不同的搜索目录可以给不同类文件指定不同的搜索目录可以给不同类文件指定不同的搜索目录o%.o表示所有以表示所有以表示所有以表示所有以 .o .o结尾的结尾的结尾的结尾的子串 制秩卯候铀先燥往贤舌历吕饺棠析骄趴模己代喘谁退柴蓟得图竣折敞栗除第3章程序设计基础ppt课件第3章程序设计基础ppt课件 vpath %.c //c/demovpath %.h //c/demo/headvpath %.c ——表示清除所有表示清除所有vpath对对%.c设置的搜索目录设置的搜索目录vpath ——表示清除所有以前用表示清除所有以前用vpath设置的搜索目录设置的搜索目录这两种方式的效果是一样的,但是后一这两种方式的效果是一样的,但是后一种要明确一些这样种要明确一些这样make就会根据就会根据VPATH或者或者vpath来搜索相应的依赖文件来搜索相应的依赖文件 赐迂尖裳踞萍豪若津蚕锡聘障赤筏诺便肮莆袍邵抓酮钨安驼沿脯暂暑躯伎第3章程序设计基础ppt课件第3章程序设计基础ppt课件 5. 如何定义变量如何定义变量为了简化为了简化makefile以及减少不必要的错以及减少不必要的错误,可以用变量的形式来代表目标文件名或误,可以用变量的形式来代表目标文件名或字符串,在需要使用时直接调用变量。

      字符串,在需要使用时直接调用变量在在makefile中变量可以被这样定义:中变量可以被这样定义:CC = arm-elf-gccAS ::= arm-elf -asAR = arm-elf -arLIBPATH ::= ./lib独河悸今际耶孜念托省稽渴悯诀袖班歼悠训贿殷骨桐蹬碉唱痪背猪睬着辟第3章程序设计基础ppt课件第3章程序设计基础ppt课件 从上面的定义中可以看出,有从上面的定义中可以看出,有两种定义变量的形式:两种定义变量的形式:1.变量名变量名 = 值值2.变量名:变量名:= 值值两者的两者的不同点不同点在于,前者定义在于,前者定义的变量是在被用到时才取它的值,的变量是在被用到时才取它的值,而后者则是在定义变量或者给它赋而后者则是在定义变量或者给它赋值时就确定了它的值值时就确定了它的值辣丫色孜浮度忘唐吸晓慎魁赦粒厄适衍滓诡危炎蛹囤曼崔桑去窒像锁竖搅第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:例如:例如:var1 = hello firstvar1 = hello firstvar2 var2 = = ${var1} ${var1}var1 = hello secondvar1 = hello secondtest_echotest_echo::::echo ${var2}echo ${var2}执行的结果是显示:执行的结果是显示:执行的结果是显示:执行的结果是显示:hello secondhello secondvar1 = hello firstvar1 = hello firstvar2 var2 :=:= ${var1} ${var1}var1 = hello secondvar1 = hello secondtest_echotest_echo::::echo ${var2}echo ${var2}执行的结果是显示:执行的结果是显示:执行的结果是显示:执行的结果是显示:hello firsthello first姐仟篆儿歌郸暴肖雇匝篙须氏纹殿觉挂炙奥作你序憎零陛瞬憋碘与挛胯吓第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:var1 = hello firstvar1 = ${var1} and secondecho_test::echo ${var1}会陷入死循环中。

      会陷入死循环中var1 ::= hello firstvar1 ::= ${var1} and secondecho_test::echo ${var1}会显示:会显示:hello first and second扛蜒得棒铭把漾渔拨拘挡移拦贫孕晴陨眠橱七身泰汹银凿量考撼可打详做第3章程序设计基础ppt课件第3章程序设计基础ppt课件 6. 引用变量引用变量有两种方式:有两种方式:1.${VarName}2.$(VarName) 两种方式的效果一样两种方式的效果一样VarName表示变量名表示变量名竟惹枚森免铱瞄请垒疾澈沮痘哼秀茵焰驼疤箩布厌励哇依炉码萤轧钩贮疥第3章程序设计基础ppt课件第3章程序设计基础ppt课件 7. make提供的常用变量提供的常用变量Ø$@——表示目标名表示目标名Ø$^ ——表示所有的依赖文件表示所有的依赖文件Ø$< ——第一个依赖文件第一个依赖文件例如:例如:demo.o : demo.c demo.h${CC} ${CFLAGS} $< -o $@Ø$<的值为的值为demo.c,,Ø$@的值为的值为demo.o,,Ø而而$^的值为的值为demo.c demo.h。

      眩缅雹嚣奋措吝犯戚型广郡臆伞垢桐枝移窿秋叛诸拴矢旋删恶怒商仪娟跳第3章程序设计基础ppt课件第3章程序设计基础ppt课件 8. make里的常用函数里的常用函数函数的使用方式有两种:函数的使用方式有两种:1.$(function arguments) 2.${function arguments} 常用的函数有:常用的函数有:((1))$((subst from,to,text)将字)将字text中的中的from子串替换为子串替换为to子串例如:例如:STR ::= $(subst I am,He is,I am an engneer)与与 STR::= He is an engneer 相同裕心徐姓昌珍驼鹃制阜热斋匿吸幢麻肖赞夯痢法贡皂括唱咙仆枷炽药憋留第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((2))$(patsubst pattern,replacement,text)按模按模式式pattern替换替换text中的字串中的字串例如:例如:OBJS = init.o main.o string.oSTR ::= $(patsubst %.o,%.c,${OBJS})STR的值为:的值为:init.c main.c string.c%.o表示所有以表示所有以 .o结尾的子串。

      结尾的子串wildcard pattern...)表示与表示与pattern相匹配的所相匹配的所有文件例如例如:在当前目录中有文件在当前目录中有文件init.c、、main.c和和string.c::SRCS ::= $(wildcard *.c)则则SRCS的值为的值为init.c main.c string.c陌遭摄冕执惨剁枫监英拖房倘浦亮至陕疏鱼疗辱懊离嚼寞蚊秩盯重侄调黑第3章程序设计基础ppt课件第3章程序设计基础ppt课件 9. 隐含规则隐含规则隐含规则是指由隐含规则是指由make自定义的规则自定义的规则,常用的有:常用的有:ØØ由由*.c的文件生成的文件生成*.o的文件的文件ØØ由由*.s的文件生成的文件生成*.o的文件的文件 例如,下面是某例如,下面是某makefile的一部分:的一部分: CC= arm-elf -gccAS= arm-elf -asLD= arm-elf -ldCFLAGS=-c -ansi -nostdinc -I- -I./ASFLAGS=LDFLAGS=-Map map.txt -N -T linkcmds -L./lib 逛屿成汹何傈妙憎扯埠琴慷份辖统横那瘁匝酣桨刺安女圣调引陛睫仁尚姚第3章程序设计基础ppt课件第3章程序设计基础ppt课件 OBJS=i386ex-start.o i386ex-get-put-char.o OBJS=i386ex-start.o i386ex-get-put-char.o i386ex-io.oi386ex-io.oOBJCOPY= arm-elf -objcopyOBJCOPY= arm-elf -objcopyOBJCOPYFLAG=-O ihexOBJCOPYFLAG=-O ihexAllAll::::monitor.elfmonitor.elf${OBJCOPY} ${OBJCOPYFLAG} monitor.elf ${OBJCOPY} ${OBJCOPYFLAG} monitor.elf monitor.hexmonitor.hexmonitor.elfmonitor.elf::::${OBJS}${OBJS}${LD} ${LDFLAGS} -o monitor.elf ${OBJS} -${LD} ${LDFLAGS} -o monitor.elf ${OBJS} -lmonitorlmonitorcleanclean::::rm -rf *.o *.elfrm -rf *.o *.elf在该在该在该在该makefilemakefile中的中的中的中的i386ex-start.oi386ex-start.o、、、、i386ex-get-put-i386ex-get-put-char.ochar.o、、、、i386ex-io.oi386ex-io.o都是由隐含规则生成的。

      都是由隐含规则生成的都是由隐含规则生成的都是由隐含规则生成的 逛篓潭爸铸杖螟浮摧舍怖幸课竞皂溜沪辜烫潦敝蒸壁镀临浸也尊御痰益拾第3章程序设计基础ppt课件第3章程序设计基础ppt课件 实际上使用的实际上使用的隐含规则隐含规则如下所示:如下所示:Ø对对*.c-->*.o的的隐含规则隐含规则为:为:%.o::%.c${CC} ${CFLAGS} $< -o $@Ø对于对于*.s-->*.o的的隐含规则隐含规则为:为: %.o::%.s${AS} ${ASFLAGS} $< -o $@篇瓷索惠赋上盔描见丫律肢擦筷蔚凭躁靳娩桃尖相畔名蛮吁粤爽耽玖男誉第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.5 交叉汇编器交叉汇编器 arm-elf-as3.5.1 概述概述arm-elf-as 将汇编语言程序转换为将汇编语言程序转换为ELF((Executable and Linking Format执行执行时链接文件格式)格式的可重定位目标代码,时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或库易于定位这些目标代码同其它目标模块或库易于定位和链接arm-elf-as 产生一个交叉参考表和一个产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在标准的符号表,产生的代码和数据能够放在多个段(多个段(Section)中。

      中壤勤怯嘿航祖苫浦咽碱歼勒车型久绊须驳贼诀始寿觉民蚂猫乏塌栅呐挽刽第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.命令格式.命令格式arm-elf-as [option…] [asmfile…]在命令在命令arm-elf-as后面跟一个或多个选后面跟一个或多个选项,以及该选项的子选项,选项间用空格项,以及该选项的子选项,选项间用空格隔开,然后跟汇编源文件名隔开,然后跟汇编源文件名例如,将例如,将demo.s编译成目标文件,并编译成目标文件,并且设置头文件的搜索目录为且设置头文件的搜索目录为C:\demo\include::arm-elf-as –I//c/demo/include demo.s讣指谩邯仅览责烟动哀计陈硒赦晕崩嘱勤酸娠闭买亨裸抗遵闲享港弥局佛第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.命令选项列表.命令选项列表Ø-a[dhlns]显示显示arm-elf-as信息信息Ø-f不进行预处理不进行预处理Ø-I path设置头文件搜索路径设置头文件搜索路径Ø-o设定输出文件名设定输出文件名Ø-v显示版本信息显示版本信息Ø-W不显示警告提示不显示警告提示Ø-Z不显示错误提示不显示错误提示药劲旱贤挪辫沾敞馒驾沫仆甸捆乏峦沮安忌涟眯孔垄隐湃成涸藉捧酉袖煌第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.5.2 命令使用命令使用1.生成目标文件.生成目标文件每次运行每次运行arm-elf-as只输出一个目标只输出一个目标文件,默认状态下名字为文件,默认状态下名字为a.out。

      可以通过可以通过-o选项指定输出文件名字,选项指定输出文件名字,通常都以通常都以.o为后缀例如例如:编译编译demo.s输出目标文件输出目标文件demo.o::arm-elf-as –o demo.o demo.s驮靠铬韦卯丁吸转忧年郑割缓扇霹捐滚吟扔陷搔斋坷滓雨绕感拟街缠毫谜第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.设置头文件搜索路径.设置头文件搜索路径-I path添加路径添加路径path到到arm-elf-as的搜索路径,搜的搜索路径,搜索索.include ”file” 指示的文件指示的文件I可以被使用多次以添加多个目录,当前工作可以被使用多次以添加多个目录,当前工作目录将最先被搜索,然后从左到右依次搜索目录将最先被搜索,然后从左到右依次搜索-I指指定的目录定的目录例如例如:编译编译demo.s时指定两个搜索目录,当时指定两个搜索目录,当前目录和前目录和C:\demo\include::arm-elf-as –I../ –I//c/demo/include demo.s 吓物川寐润吊唱六哗蔫晋棋蜡钎民拷颇件飘另环峡沮榷但砂绣革靴龙檬议第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.显示.显示arm-elf-as信息内容信息内容-a[dhlns]打开打开arm-elf-as信息显示。

      信息显示dhlns为其子选项,分别表示:为其子选项,分别表示:Ød ——不显示调试信息不显示调试信息Øh ——显示源码信息显示源码信息Øl ——显示汇编列表显示汇编列表Øn——不进行格式处理不进行格式处理Øs ——显示符号列表显示符号列表妙戒鲜刊摄锚贩娟坡悦付蔑段堆宋拣尽言霍菱臀墨含守宿凯判聘较沤候炉第3章程序设计基础ppt课件第3章程序设计基础ppt课件 Ø在不添加子选项时,在不添加子选项时,-a表示显示源码信息,表示显示源码信息,显示汇编列表,显示符号列表显示汇编列表,显示符号列表Ø添加子选项时将选项直接加在添加子选项时将选项直接加在-a以后可以以后可以添加一个或多个添加一个或多个Ø缺省时显示的信息输出到屏幕,也可用重缺省时显示的信息输出到屏幕,也可用重定向输出到文件定向输出到文件例如例如:编译编译demo.s生成不进行格式处理的汇生成不进行格式处理的汇编列表,输出到文件编列表,输出到文件a.txt::arm-elf-as –aln –o demo.o demo.s>a.txt寇桶快眠源慑堂钎兄啸巢简仑戈疆馏泵哇肯隔跺缚翼劈孕勉鼻渤津天卿介第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4.设置目标文件名字.设置目标文件名字-o filenameØØ每次运行每次运行arm-elf-as只输出一个目标文件,默只输出一个目标文件,默认输出文件为认输出文件为a.out。

      ØØ可以通过可以通过-o选项指定输出文件名字,通常都选项指定输出文件名字,通常都以以.o为后缀ØØ如果指定输出文件的名字和现有某个文件重名,如果指定输出文件的名字和现有某个文件重名,生成的文件将直接覆盖已有的文件生成的文件将直接覆盖已有的文件例如例如:编译编译demo.s输出目标文件输出目标文件demo.o::arm-elf-as –I/include –o demo.o demo.s 急逐沽竖财盯办烦旺罢银社椽或奎夫遍疾哲全涤半赞窄丫赎镶澳哦铜察篇第3章程序设计基础ppt课件第3章程序设计基础ppt课件 5.如何取消警告信息.如何取消警告信息-W加选项加选项-W以后,运行以后,运行arm-elf-as就不就不输出警告信息输出警告信息例如例如:编译编译demo.s输出目标文件输出目标文件demo.o,,不输出警告信息:不输出警告信息:arm-elf-as –W –o demo.o demo.s 翔塘甥士绝勇铸宗倍绎输掩挥灰掀皇浪奴闯晋询将你沽咬蚊严揣冤博虱劈第3章程序设计基础ppt课件第3章程序设计基础ppt课件 6.设置是否进行预处理.设置是否进行预处理arm-elf-as内部的预处理程序,完成以内部的预处理程序,完成以下工作:调整并删除多余空格,删除注下工作:调整并删除多余空格,删除注释,将字符常量改成对应的数值。

      释,将字符常量改成对应的数值arm-elf-as不执行不执行arm-elf-gcc预处理程预处理程序能完成的部分,如宏预处理和包含文序能完成的部分,如宏预处理和包含文件预处理件预处理可以通过可以通过.include “file”对指定文件对指定文件进行预处理进行预处理arm-elf-gcc可以对后缀为可以对后缀为.S汇编程序进汇编程序进行其他形式的预处理行其他形式的预处理 伤盅馏篷遇淄夸池贱输渗泅酵发倒汇让莽武育捧螟泌舜资箱妙姐窑伏搜疼第3章程序设计基础ppt课件第3章程序设计基础ppt课件 Ø如果源文件第一行是#如果源文件第一行是#NO_APP或者或者编译时使用选项编译时使用选项-f将不进行预处理将不进行预处理Ø如果要保留空格或注释,可以在需要如果要保留空格或注释,可以在需要保留部分开始加入#保留部分开始加入#APP,结束的地方,结束的地方加#加#NO_APP例如例如:编译编译demo.s输出目标文件输出目标文件demo.o,并且编译时不进行预处理,则命令如,并且编译时不进行预处理,则命令如下:下:arm-elf-as –f –o demo.o demo.s 杉英梗沿策锋吝冷淆班谜戈遍镐砒饥否即踢蛀刹薯韶撼忍枫盲掸铂咨歇铂第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6 汇编语言编程汇编语言编程在在ARM汇编语言程序里汇编语言程序里,有一些特殊指令助记有一些特殊指令助记符符,这些助记符与指令系统的助记符不同这些助记符与指令系统的助记符不同,没有相对没有相对应的操作码应的操作码,通常称这些特殊指令助记符为通常称这些特殊指令助记符为伪指令伪指令,它们所完成的操作称为它们所完成的操作称为伪操作伪操作。

      伪指令在源程序中的作用是为完成汇编程序作伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了用,一旦汇编结束,伪指令的使命就完成了在在ARM的汇编程序中,有如下几种伪指令:符的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令宏指令以及其他伪指令景抛敬碍唉苯忧凳蘑厂唾暖谭地搜队丛挛贬亚楼耸嘴掇籽针褒块善耀睬孪第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6.1 汇编语言汇编语言1. 基本元素基本元素(1) 字符集字符集汇编中使用下列字符组成源程序汇编中使用下列字符组成源程序的各种语法元素:大写字母的各种语法元素:大写字母 A ~~ Z;;小写字母小写字母 a ~~ z;数字;数字 0 ~~ 9;符号;符号 + - * / = [ ] ( ) ; , . : ‘ @ $ & # < > { } % _ “ \ - | ^ ? ! 其中大小写字母作用不同其中大小写字母作用不同。

      孕读州款丰肉冤扼参痊坡怒夺艳袖渐浅畔暑塘冬瓤苦以哈弊锌沼驻泛墟疤第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (2) 约定的名字约定的名字包括寄存器名、指令名字和伪包括寄存器名、指令名字和伪操作符每一个伪操作符表示一定操作符每一个伪操作符表示一定功能的操作功能的操作伪操作的功能由汇编系统实现伪操作的功能由汇编系统实现,没有目标代码对应这一点是伪操没有目标代码对应这一点是伪操作符与操作符的作符与操作符的不同不同之处伪操作之处伪操作符是由汇编系统约定的名字,不用符是由汇编系统约定的名字,不用定义就能实现定义就能实现秸淬妻阜瞎质统蜗鸭李疏构湖能噬徘疮组漂渍享嫌鞠详会列奖现拣猎抵橇第3章程序设计基础ppt课件第3章程序设计基础ppt课件 伪操作符可以分为六类:伪操作符可以分为六类: 1.数据定义伪操作符数据定义伪操作符2.符号定义伪操作符符号定义伪操作符3.程序结构伪操作符程序结构伪操作符4.条件汇编伪操作符条件汇编伪操作符5.宏伪操作符宏伪操作符6.其他伪操作符其他伪操作符驼假根锗活彬帚蚤告军祝躇救匿趟碌顾徐冻评伍秆调荣者脚岗锯媚闺链逐第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (3) 定义的名字定义的名字汇编程序中的标号、分段名、汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。

      宏定义名都是用户可以定义的名字 ①① 标号标号标号只能由标号只能由a ~~ z 、、A ~~ Z、、0 ~~ 9、.、、.、_等字符组成,标号的长等字符组成,标号的长度不受限制度不受限制,大小写字母有区别大小写字母有区别卷裳营娶盯傅姓纤絮悉处佰倡缄株栽忻悼哗甜部赋慨喻顷钟励途小陵项才第3章程序设计基础ppt课件第3章程序设计基础ppt课件 当标号为当标号为0 ~~ 9的单个数字时表示该标的单个数字时表示该标号为局部标号号为局部标号, 局部标号可以多次重复出现局部标号可以多次重复出现在引用时,使用方法如下(在引用时,使用方法如下(N代表代表0 ~~ 9的数字):的数字):Nf ——在引用处的地方向前(程序地在引用处的地方向前(程序地址增长的方向)的址增长的方向)的N标号Nb ——在引用处的地方向后(程序地在引用处的地方向后(程序地址增长的方向)的址增长的方向)的N标号标号在最终的绝对定位的代码中表示所标号在最终的绝对定位的代码中表示所在处的地址,因此在汇编中的标号可以在在处的地址,因此在汇编中的标号可以在C/C++程序中当作变量或者函数来使用程序中当作变量或者函数来使用催朗劳跺幅祖鸯国盖覆忻刁阮幕束卜活充淌毛雀轿蛀谩贤泼闰擎旁胸煮补第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ②② 分段名分段名汇编系统中预定义的分段名有汇编系统中预定义的分段名有: .text .bss .data .sdata .sbss 等,但是用户可等,但是用户可以自己定义段名,语法如下:以自己定义段名,语法如下:.section section_name attribute例如:定义一个可以执行的代码段例如:定义一个可以执行的代码段 .mytext.section ".mytext","ax"mycode…益蘑绦龟冤普陛赞狙牟库惹估繁肾剁法鹊绿缓归掠迹条劝故倔颖穿闻溅丁第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ③③ 宏定义名宏定义名宏定义的语法如下:宏定义的语法如下:.macro macro_name parm1 … parmNmacro body.endm枕均便肤狗召供创苫铺输拷干茨缩粘伤认书姻至腑蘸眨滓违尼酱璃唾软妨第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (4) 常数常数ØØ二进制数由二进制数由0b或者或者0B开头,如:开头,如:0b1000101、、0B1001110;;ØØ十六进制数以十六进制数以0x或者或者0X开头,如:开头,如:0x4567、、0X10089;;ØØ八进制数由八进制数由0开头,如:开头,如:0345、、09870;;ØØ十进制数以非零数开头,如:十进制数以非零数开头,如:345、、12980例如:例如:.byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J   .ascii "Ring the bell\7"绘诅泌岂凛每姆绝魔凯掉所磁藏备集厄汛画琶磅锐发坛天从捆盖菠拴汽斜第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (5) 当前地址数当前地址数当前的地址数用点号当前的地址数用点号“.”表示,在汇编程序中可表示,在汇编程序中可以直接使用该符号。

      以直接使用该符号嚼遁蜡擅牛刀猴桐笋佣堕桐噬豆了肖乘篷薛险舵捌拯档毁裤迟罢颧作澳鸳第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (6) 表达式表达式在汇编程序中可以使用表达式,在在汇编程序中可以使用表达式,在表达式中可以使用常数和数值表达式中可以使用常数和数值可以使用的运算符有:可以使用的运算符有:①① 前缀运算符号前缀运算符号- —— 取负数取负数~ —— 取补数取补数②② 中缀运算符号中缀运算符号* / % < << > >> | & ^ !!+ -俯额剪管部踩卫夺圾逐勃治聋归愁齐轩凤芯云鹃砷刨虾约失困矮掂坷商贫第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (7) 注释符号注释符号不同芯片的汇编程序中,注释不同芯片的汇编程序中,注释的符号有所不同,ARM以的符号有所不同,ARM以“@”开开头的程序行是注释行头的程序行是注释行喂阮道引白眉虏疹饵谊段挎乍水宰熙盖盎胞抵泪诧卿竖椭多情臣荫渊慑彩第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 语句语句(1) 语句类型语句类型汇编语句按其作用和编译的情况分为两汇编语句按其作用和编译的情况分为两大类:大类:执行性语句执行性语句和和说明性语句说明性语句。

      执行性语句执行性语句是在编译后有目标程序与之是在编译后有目标程序与之对应,按其编译后目标程序的对应情况又可对应,按其编译后目标程序的对应情况又可以分为:以分为:一般执行性语句一般执行性语句和和宏语句宏语句一般执行性语句一般执行性语句与目标程序是一一对应与目标程序是一一对应的,即一个一般执行语句只产生一条目标代的,即一个一般执行语句只产生一条目标代码指令宏语句宏语句由伪操作符定义,包括宏定义、由伪操作符定义,包括宏定义、宏调用及宏扩展语句一个宏语句对应了一宏调用及宏扩展语句一个宏语句对应了一组目标代码程序,可以看成是一般执行性语组目标代码程序,可以看成是一般执行性语句的扩展句的扩展 胸偿愤写呀就勒洞梨缆括际戒喇播蔗熔剥少围望屑蕾揖题术笺版卉掏亨奠第3章程序设计基础ppt课件第3章程序设计基础ppt课件 说明性语句说明性语句由伪操作符定义,它用于用户以源由伪操作符定义,它用于用户以源程序方式和汇编程序通信程序方式和汇编程序通信用户使用说明性语句表示源程序的终止说明、用户使用说明性语句表示源程序的终止说明、分段定义、数据定义、内存结构等信息分段定义、数据定义、内存结构等信息ØØ数据定义语句用于描述数据和给数据赋初值数据定义语句用于描述数据和给数据赋初值.ØØ列表控制语句用于说明源程序的格式要求。

      列表控制语句用于说明源程序的格式要求ØØ程序结构语句用于说明源程序的结构和目标程程序结构语句用于说明源程序的结构和目标程序的结构序的结构ØØ条件汇编语句用于说明汇编某部分语句时的条条件汇编语句用于说明汇编某部分语句时的条件,满足条件则编译件,满足条件则编译,否则跳过这部分不予编译否则跳过这部分不予编译.距鸯瓢祈至人孩卞雪撩浚决枪獭咏效校枣围斡叼正粗没三缺归览鉴讣抡辙第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (2) 数据语句ØØ一字节数据定义语句一字节数据定义语句一字节数据定义语句一字节数据定义语句语法:语法:语法:语法:.byte expressions.byte expressions例子:例子:例子:例子:.byte 0x89 ,0x45, 56, ‘K , ‘M , 023, 0B101011.byte 0x89 ,0x45, 56, ‘K , ‘M , 023, 0B101011ØØ两字节数据定义语句两字节数据定义语句两字节数据定义语句两字节数据定义语句语法:语法:语法:语法: .short expressions .short expressions例子:例子:例子:例子: .short 0x6789 ,0b101110111 .short 0x6789 ,0b101110111 ØØ四字节数据定义语句四字节数据定义语句四字节数据定义语句四字节数据定义语句语法:语法:语法:语法:.long expressions.long expressions例子:例子:例子:例子:.long 0x78896676 , 02356243563456 .long 0x78896676 , 02356243563456 ØØ八字节数据定义八字节数据定义八字节数据定义八字节数据定义语法:语法:语法:语法: .quad expressions .quad expressions例子:例子:例子:例子: .quad 0x1122334455667788 .quad 0x1122334455667788庞啥辰株减挂衬校紊栗塑靴茸令彝持曰琳展方帮依鹏锅挡膜钉瞩讨刃爷责第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ØØ单个字串定义单个字串定义单个字串定义单个字串定义语法:语法:语法:语法:.string “ string”.string “ string”例子:例子:例子:例子:.string “this is an example”.string “this is an example”ØØ多个字串多个字串多个字串多个字串1 1语法:语法:语法:语法:.ascii “string”…...ascii “string”…..例子:例子:例子:例子:.ascii “string1” .ascii “string1” ,“string2”,“string3”,“string2”,“string3”string1,string2,string3string1,string2,string3字串间是连续的。

      字串间是连续的字串间是连续的字串间是连续的ØØ多个字串多个字串多个字串多个字串2 2语法:语法:语法:语法:.asciz “string”…...asciz “string”…..例子:例子:例子:例子:.asciz “string1” .asciz “string1” ,“string2”,“string3”,“string2”,“string3”羞软崭逞躬羽舷匿较肃芝吏荚夷舍硫浴尿簧罪础夕董吹馋赌路娱逛呐库诱第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ⑧⑧ 重复数据定义重复数据定义语法:语法:.rept count 数据定义数据定义 .endr例子:例子:.rept 22 等价于:等价于: .long 0x788 .byte 0x99.long 0x788 .long 0x788.byte 0x99 .byte 0x99.endr盛臻综刘捻汽姑捅凛煎摩类垫日遮们捶凯噶蛊鹿臆树捏拙昼刊壁雀啥濒尊第3章程序设计基础ppt课件第3章程序设计基础ppt课件 各种数据在内存空间的对齐边界示按各种数据在内存空间的对齐边界示按数据本身的大小对齐的,数据本身的大小对齐的,byte以1字节对以1字节对齐,齐,short以2字节对齐,以2字节对齐,long以4字节以4字节对齐,对齐,例如例如:.byte   0x78.short  0x66.long  0x789一共占用8个字节而不是7个字节。

      一共占用8个字节而不是7个字节桨选字专厉焊烽按哥瀑舒包烽涅恕咀稽夹逞优掘教与里故盎寄关刁写常科第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (3) 列表控制语句列表控制语句①①.title “heading”在汇编列表中将在汇编列表中将“heading“作为作为标题②②.list系统遇此语句就输出列表文件系统遇此语句就输出列表文件裴值滦点也龟空称踞斯砖忽啼敬提伎铭源殉挎冀镰堤肛锨遗江浪昆苗跌鞍第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((4)一般执行语句)一般执行语句不同的芯片有不同指令集,不同的芯片有不同指令集,见相关的指令手册见相关的指令手册 喻簧审漂贱蔗虱喂拈兰痒桌盘想誊桥己旱堕征意衬蜂匣环鼓匿见赠硬抽锣第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. 程序结构程序结构((1)程序结构语句)程序结构语句程序结构语句程序结构语句是伪操作符定义的说明是伪操作符定义的说明语句,用于说明程序段的开始、结束以及语句,用于说明程序段的开始、结束以及源程序的结束等源程序的结束等在汇编系统中有预定义的程序结构语在汇编系统中有预定义的程序结构语句,用户也可以自己定义一些程序结构段句,用户也可以自己定义一些程序结构段(详见(详见3.3.3中关于中关于.section的说明)。

      的说明)预定义的程序结构语句如下(以下用预定义的程序结构语句如下(以下用ARM的汇编指令举例说明):的汇编指令举例说明):菊颗釉冲严廉眼额恃奶康邑旨级予穴骨佰角垮敌疲槐到桅闹湖划穗霖跪学第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ②② 数据段的开始数据段的开始.data 表示一个数据段的开始,其它段的结束:表示一个数据段的开始,其它段的结束:.data.long 0xFFFFFC04,0x0F0CFC04,0x0FFFF804,0x01BF70040xFFFFFC04,0x0F0CFC04,0x0FFFF804,0x01BF7004.long 0x0FFDD000,0x1FFFF447,0x0FFFFC04,0x1FFFFC070x0FFDD000,0x1FFFF447,0x0FFFFC04,0x1FFFFC07 .bss表示未初始化数据段的开始,其它段的结束:表示未初始化数据段的开始,其它段的结束:表示未初始化数据段的开始,其它段的结束:表示未初始化数据段的开始,其它段的结束:.bss.long 0,0,0.long 0,0,0 事匀仍酶措剪署奸二骂购懈凋赵朱没饰诀轰说坪峦势灭眠粮溃雅胚诲腮唤第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ③ 源程序的结束.end 表示该源程序的结束,表示该源程序的结束,在在.end后面的程序不会被编译。

      后面的程序不会被编译 讥贡缕氖桓狐新清咯步径榆绳抠聋芹桩钝督卡二织悟撇痴揭尹诈敦盼蚌袄第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (2) 过程(函数)的定义过程(函数)的定义过程的结构如下:过程的结构如下:过程名:过程名:过程体过程体返回语句返回语句 例如(用例如(用ARM的汇编指令举例的汇编指令举例说明):说明):绍总符屁烃赌哄谊莱尿颧巍抚伦硝卜棕漠遇赚昂畜性惺替差慨套引颅柠柬第3章程序设计基础ppt课件第3章程序设计基础ppt课件 .align 2.align 2.globl uart1_sendch.globl uart1_sendch.type uart1_sendch,@function.type uart1_sendch,@functionuart1_sendch:uart1_sendch:ldrldrr2,=SYSFLGr2,=SYSFLG1:1:ldrldrr1,[r2]r1,[r2]tsttstr1,#UTXFF1r1,#UTXFF1bnebne1b1bldrldrr2,=UARTDR1r2,=UARTDR1strbstrb r0,[r2]r0,[r2]movmov pc,lrpc,lr一般情况下,一般情况下,一般情况下,一般情况下,.type .type 和和和和.align.align声明可以缺省。

      声明可以缺省声明可以缺省声明可以缺省 睁擂稿匝概衣跪愤骸窑讯杨憎乎埋趣症睁蛋羹言取幻健想酉春帚沧谓垄擦第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6.2 宏语句与条件汇编宏语句与条件汇编1. 等价语句等价语句(1) .equ语句语句语法:语法: .equ symbol,,expression例子:例子: .equ PPC_PC,,32*4应用:应用: stwr4,,PPC_PC(r1) (2) .set语句语句与与.equ的功能相同的功能相同 雾慷栈末象讣蕊庞枪崔撰这狈阎厉念煤刮知逞魂潭侧炊贝檀云据逾丰六蓑第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 宏定义与宏调用宏定义与宏调用宏定义:宏定义:.macro macro_name param1 ,,param2,,…..paramN .macro body.endm侥锌铅莆纷坎楞让第懦妇渊再然耘忱达俞谊升啥翱氨拱差骑牢剩洛例录旗第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:(使用例如:(使用ARM的汇编指令集说明)的汇编指令集说明).macro ROMSEC_patovaTTPA,,pa_start,,va_start,,tmp,,ic ldr\tmp,,=APFIELD_ROMadd \TTPA,\TTPA,\va_start,LSR #18add \tmp,,\tmp,,\pa_start20:str\tmp,,[\TTPA],,#4add \tmp,,\tmp,,#0x10000subs\ic,,\ic,,#1bne 20b .endm磨持续牧钟泣蛔插臼俯懈咱恶府具怕实腰尺疆嫉殷浙王殊娶惩追堤傈搪谆第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:.macro rept3.long 0x9000000.long 0x9000000.long 0x9000000.endm应用:应用:.datarept3等价于等价于.data.long 0x9000000.long 0x9000000.long 0x9000000 按绩惟摄肠腺骏颂纯锣毖翰怪衍好利怪忆哭底馋裕四药硒移泳何宅驯埂龄第3章程序设计基础ppt课件第3章程序设计基础ppt课件 当宏定义有参数时,在参数前面添加前当宏定义有参数时,在参数前面添加前缀缀“\” 。

      如果要提前退出宏可以使用如果要提前退出宏可以使用.exitm 宏定义中的参数还可以有缺省值,如:宏定义中的参数还可以有缺省值,如:.macro test p1=0x100 p2 .long \p1.long \p2.endm应用:应用:test ,, 2 等价于等价于.long 0x100.long 2身卷伏蔡肤犬确抿髓铱模谗寄虾宣渐鲁矿唉噪遗羹双鱼甥梦惮岗褪碾冯傻第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. 3. 重复块和源文件的嵌入重复块和源文件的嵌入重复块和源文件的嵌入重复块和源文件的嵌入(1) (1) 重复块重复块重复块重复块定义:定义:定义:定义:.rept count.rept countcontentscontents.endr.endr例如:例如:例如:例如:.rept 2.rept 2.long 0x12908.long 0x12908.endr.endr等价于:等价于:等价于:等价于:.long 0x12908.long 0x12908.long 0x12908.long 0x12908普似掩臆穴颅效钩猫神民粤祖抵偏千汀镰廖遥答搔失朽附棘蛾外柿困眉插第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (2) 源文件的嵌入源文件的嵌入在一个汇编文件中可以嵌入其在一个汇编文件中可以嵌入其它汇编文件,例如汇编头文件等。

      它汇编文件,例如汇编头文件等方法如下:方法如下:.include “filename”闷快醛微岗诬葛索炙竟刑渣虹茅酬彭析枪塔铂偶杂矮渺饰常枕裕们朋冗丈第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4 条件汇编条件汇编ØØ.if expression .if expression 表达式为非零则编译后面的语句,否则后面的语表达式为非零则编译后面的语句,否则后面的语表达式为非零则编译后面的语句,否则后面的语表达式为非零则编译后面的语句,否则后面的语句被忽略句被忽略句被忽略句被忽略ØØ.ifdef symbol.ifdef symbol如果符号被定义则编译后面的语句,否则后面的如果符号被定义则编译后面的语句,否则后面的如果符号被定义则编译后面的语句,否则后面的如果符号被定义则编译后面的语句,否则后面的语句被忽略语句被忽略语句被忽略语句被忽略ØØ.ifndef symbol.ifndef symbol如果符号未被定义则编译后面的语句,否则后面如果符号未被定义则编译后面的语句,否则后面如果符号未被定义则编译后面的语句,否则后面如果符号未被定义则编译后面的语句,否则后面的语句被忽略的语句被忽略。

      的语句被忽略的语句被忽略ØØ.else.else表示与前面的表示与前面的表示与前面的表示与前面的if if语句的条件相反语句的条件相反语句的条件相反语句的条件相反ØØ.endif.endif表示条件判断结束表示条件判断结束表示条件判断结束表示条件判断结束铲壹喝裹慷桃颇寨亨霖艘寅滓匣虏尿就篓钩哦含射撑陋屡腮沽驮初讳生拇第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例如:例如:例如:例如:.macro sum from=0, to=5.macro sum from=0, to=5 .long \from .long \from .if \to - \from .if \to - \from sum “(\from+1)”,\to sum “(\from+1)”,\to .endif .endif.endm.endm应用:应用:应用:应用:sumsum,,,,5 5等价于等价于等价于等价于.long 0.long 0………… .long 5 .long 5条件判断可以嵌套使用,条件判断可以嵌套使用,条件判断可以嵌套使用,条件判断可以嵌套使用,if-else-endifif-else-endif遵循最遵循最遵循最遵循最近匹配的原则。

      近匹配的原则近匹配的原则近匹配的原则甜订则驭荡秸盈屹赤笑浦伞网傲禹墙热追改焚谜希安束扁甥堤僧赴军艺犊第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6.3 模块化程序设计模块化程序设计 模块化程序设计汇编语言程序可模块化程序设计汇编语言程序可以先按模块独立汇编,然后和应用以先按模块独立汇编,然后和应用的其他模块链接形成一个可执行的的其他模块链接形成一个可执行的程序程序 龋痔囤夸么啤馅仔骇汲奋董橡宝暗网客例钩仙荐螟榆矩额屉蝴谍翌私瓶坦第3章程序设计基础ppt课件第3章程序设计基础ppt课件 1.全局符号.全局符号在模块中定义的、要被别的模块使在模块中定义的、要被别的模块使用的符号(包括变量名和函数名)都必用的符号(包括变量名和函数名)都必须被声明为全局符号须被声明为全局符号方法如下:方法如下:.global symbol在本模块中要使用其他模块中的全在本模块中要使用其他模块中的全局符号,可以用局符号,可以用.extern symbol的方式的方式声明,但也可以不用声明在汇编时自动声明,但也可以不用声明在汇编时自动认为它是其它模块中的全局符号认为它是其它模块中的全局符号螺冉浮绩或踊捣巩滤映涅嗜饺登耐引付鹿哀勘嫩门绸掩怯勋列鸵殖珠阴祁第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2.模块间的符号互用.模块间的符号互用((1)汇编模块与汇编模块间的调用)汇编模块与汇编模块间的调用只要是全局符号在汇编模块间就只要是全局符号在汇编模块间就可以直接使用。

      可以直接使用2)汇编模块调用)汇编模块调用C语言模块中的语言模块中的函数函数汇编模块调用汇编模块调用C语言模块时,不语言模块时,不同芯片传递参数的方式有差别,详同芯片传递参数的方式有差别,详细见细见3.6.5节遵谗淆登蹭唆粱轿茄悬社赔螟豁篡悔侧勘哮掩可插佯赤彝仿池贩灸莉丝际第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((3)汇编模块使用)汇编模块使用C语言模块中语言模块中的变量的变量首先保证该变量在首先保证该变量在C语言中是全局语言中是全局变量,然后在汇编中直接使用变量名变量,然后在汇编中直接使用变量名注意:注意:C语言中的变量名在汇编中语言中的变量名在汇编中不用加下划线另外该变量名不能用不用加下划线另外该变量名不能用static修饰,否则该变量只局限于所在修饰,否则该变量只局限于所在的模块有效的模块有效 困验影剔说谴祟逸掩舟砾奶卯星柠鸳篡肩敖镶斡黍包朴年皑苦巴泼荤浇朵第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((4))C语言模块调用汇编模块中的函数语言模块调用汇编模块中的函数该函数名在汇编程序中必须是全局该函数名在汇编程序中必须是全局的符号,即必须用的符号,即必须用.global声明,然后在声明,然后在C语言中申明该函数的原型,最后在使语言中申明该函数的原型,最后在使用时与一般的用时与一般的C函数一样。

      函数一样5))C语言模块使用汇编模块中的变量语言模块使用汇编模块中的变量该变量在汇编程序中必须是全局的该变量在汇编程序中必须是全局的符号,即必须用符号,即必须用.global声明,然后在声明,然后在C语言中申明该变量的原型,最后在使用语言中申明该变量的原型,最后在使用时与一般的时与一般的C变量一样变量一样 恍厂默捎迅音恨滦羌凿震耸蕊篙挨咎窥切游澳滴宫熏铬躁顶郎嗡休锣轧碾第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6.4 内存模式内存模式在在uClinux环境下,内存模式为平环境下,内存模式为平模式,即整个内存空间最大为模式,即整个内存空间最大为4GB所有任务共享这所有任务共享这4GB的空间,而不的空间,而不是每个任务有单独的是每个任务有单独的4G虚拟空间虚拟空间所有的寻址都是所有的寻址都是32位地址的方式,位地址的方式,因此程序模块间可以很容易的共享变量因此程序模块间可以很容易的共享变量和数据优木产全阂翘亲任冉投泳铲番朔绷炉炙故弱漾钉象医曳丙糙夯宰颊碟耗厨第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.6.5 StrongARM & ARM71.1.寄存器名字寄存器名字寄存器名字寄存器名字寄存器名字如表寄存器名字如表寄存器名字如表寄存器名字如表3-13-1所示。

      所示 类型型说 明明R0~~r14r14通用寄存器通用寄存器F0~~f7f7浮点寄存器浮点寄存器Pc指令指指令指针Ps机器状机器状态寄存器寄存器fps浮点状浮点状态寄存器寄存器踩沫讲忆藐拆挪瞅核甫火余泡处误岁逐猩箱羽沉低抚杯鹿隧叮纱娘倾岔仲第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 如何在汇编模块中调用如何在汇编模块中调用C语言模块语言模块中的函数中的函数在调用在调用C函数之前,必须在当前栈中空出至函数之前,必须在当前栈中空出至少少8个字节的空间,然后才调用个字节的空间,然后才调用C函数C函数的第一个参数(最左边的参数)用函数的第一个参数(最左边的参数)用r0传递,后面的参数依次用传递,后面的参数依次用r1、、r2等来传递等来传递例如:例如:假定假定C函数为函数为int get_sum (int var1,int var2),则在汇编程序中首先将参数送到则在汇编程序中首先将参数送到r0、、r1中,中,然后将栈指针减然后将栈指针减8,最后调用,最后调用get_sum注意注意:C函数名在汇编中使用时不用加下划线函数名在汇编中使用时不用加下划线臣俞巨苍泼著倘峦屈切敷萨岗喳当匣坑盔访雾翻红层锚楷穿顾赖竖描瞳滥第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.注释符号.注释符号以以“@”开头的程序行是注释行。

      开头的程序行是注释行4.一段程序.一段程序在下面的程序中有在下面的程序中有.data .bss .text等三个预定等三个预定义的段,在程序的后面定义了一个用户自己的段义的段,在程序的后面定义了一个用户自己的段.mytext,属性为可执行段属性为可执行段在程序中还用在程序中还用.global 声明了几个本文件中的符声明了几个本文件中的符号为全局符号号为全局符号,在其他模块中可以使用这些符号在其他模块中可以使用这些符号((var1作为变量作为变量,u1b_set作为函数使用)作为函数使用)青疟币欢歌鸡伸蚁挫恰测铲当憾印波舔古犊拆洋犹道球除声那剪韶彬害敬第3章程序设计基础ppt课件第3章程序设计基础ppt课件 .title “example”.data.global var1var1:.long 0x897678 ,0x2378789.byte 89 ,56, 23.string “ hello”.bss.global zero_varzero_var:.short 0,0,0.long 0,0,0,0硕借俏茧玩凡胸须桥吊粳平评巫怀崎培析钻毁蜀搁宫长戏霍运阎胜父顽脑第3章程序设计基础ppt课件第3章程序设计基础ppt课件 .textUART1INIT_TEST:ldr r3,=SYSCON1ldr r0,[r3]tst r0,#UART1ENbeq 2f1:ldr r1,[r3]tst r1,#UTXFF1bne 1b镀虱婿戌丛剐针采轰悉葬咬殉国嗓姻睫阮蛮阁烈下咐审珠注滞晌咆价蜀掸第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2:bic r0,r0,#UART1ENstr r0,[r3]bic r0,r0,#SIRENstr r0,[r3]orr r0,r0,#UART1ENstr r0,[r3]ldr r3,=SYSFLG2ldr r0,[r3]and r0,r0,#0x40mov pc,lr司逗犯挚闽桥孕蚁泼嘴柴煮爆惑少缸楞述纺虽羞磨臃疲挽布液帮净功吱唆第3章程序设计基础ppt课件第3章程序设计基础ppt课件 .section “.mytext” , “ax”.global u1b_setu1b_set:ldr r3,=UBLCR1str r0,[r3]mov pc,lr.end刷撞样急斯迸仅诅乒碉砒汰孙鹏弟五踪津耗冯悯融管乃皇拟振鹃捡摹郎饱第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.7 简单程序设计简单程序设计3.7.1 顺序程序设计顺序程序设计例例3-1 用用ARM指令实现的指令实现的C赋值语句:赋值语句:x=(a+b)-c可以用可以用r0表示表示a、、rl表示表示b、、r2表示表示c和和r3表示表示x,用,用r4作为间接寻址寄存器。

      作为间接寻址寄存器在进行算术运算之前,代码必须先把在进行算术运算之前,代码必须先把a、、b、、c的值装入到寄存器,运算结束后,还要的值装入到寄存器,运算结束后,还要把把x的值存回存储器中的值存回存储器中慕棱骗疟猜拒吉缨僵茹郸犀蛔破也骏艺带疙盈涌勺匿鲁稚司芽允募例钱俭第3章程序设计基础ppt课件第3章程序设计基础ppt课件 阳茁兔恍溺双撮佳赘渤界豆摊乒罐亨唤钝脑卯疟值检寿击巾狸迁玩守孝厚第3章程序设计基础ppt课件第3章程序设计基础ppt课件这段代码执行下面这些必须的步骤这段代码执行下面这些必须的步骤::ADR r4,a;读取变量;读取变量 a 的地址的地址LDR r0,[r4];读;读a的内容到的内容到 r0ADR r4,b;读取变量;读取变量b的地址的地址LDR rl,[r4] ;读;读b内容到内容到 r1ADD r3,r0,rl;;a+b 的结果保存在的结果保存在r3ADR r4,c;读取变量;读取变量c的地址的地址LDR r2,[r4];读;读c的内容到的内容到r2SUB r3,r3,r2 ;;(a+b)-c结果保存到结果保存到r3ADR r4,x;读;读x的地址的地址STR r3,[r4] ;保存变量;保存变量x哪沿饯飞厉噶装斜垃牵本原陷降堂卞贡孟蹋形汀凰瞪鹊误今挚硬免嗅塌胎第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例例例例3-2 3-2 用用用用ARMARM指令实现的指令实现的指令实现的指令实现的C C赋值语句:赋值语句:赋值语句:赋值语句:z=(a<<2)|(b&15)z=(a<<2)|(b&15)可以使用可以使用可以使用可以使用r0r0表示表示表示表示a a和和和和z z,,,,r1r1表示表示表示表示b b,,,,r4r4表示地址进行表示地址进行表示地址进行表示地址进行编码,代码如下:编码,代码如下:编码,代码如下:编码,代码如下: ADR r4,a ADR r4,a ;读取变量;读取变量;读取变量;读取变量a a的地址到的地址到的地址到的地址到r4r4 LDR r0,[r4] LDR r0,[r4] ;读;读;读;读a a的内容到的内容到的内容到的内容到r0r0 MOV r0,r0,LSL 2 MOV r0,r0,LSL 2 ;实现;实现;实现;实现a<<2 a<<2 操作,结果保存在操作,结果保存在操作,结果保存在操作,结果保存在r0r0 ADR r4,b ADR r4,b ;读取变量;读取变量;读取变量;读取变量b b的地址到的地址到的地址到的地址到r4r4 LDR rl,[r4] LDR rl,[r4] ;读;读;读;读b b的内容到的内容到的内容到的内容到r1r1 AND r1,r1,#15 AND r1,r1,#15 ;实现;实现;实现;实现b&15 b&15 操作,结果保存在操作,结果保存在操作,结果保存在操作,结果保存在r1r1中中中中 ORR rl,r0,rl ORR rl,r0,rl ;计算;计算;计算;计算z z的结果的结果的结果的结果 ADR r4,z ADR r4,z ;读取变量;读取变量;读取变量;读取变量z z的地址到的地址到的地址到的地址到r4r4 STR rl,[r4] STR rl,[r4] ;保存变量;保存变量;保存变量;保存变量z z 纸舞做已匪徐恋戎德潦抹冈蛇励丽畦扮瘸这羹前疵墨凹曙业腆爵车纯坯醇第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.7.2 分支程序设计分支程序设计我们用示例我们用示例我们用示例我们用示例3-33-3作为探讨条件执行的用法的方法。

      作为探讨条件执行的用法的方法作为探讨条件执行的用法的方法作为探讨条件执行的用法的方法 例例例例3-3 3-3 在在在在ARMARM中实现下面中实现下面中实现下面中实现下面if if语句:语句:语句:语句: if(a=b, a>=b,跳转到跳转到跳转到跳转到 fblock fblock子程序执行子程序执行子程序执行子程序执行 MOV r0,#5 MOV r0,#5 ;令;令;令;令x = 5x = 5 ADR r4,x ADR r4,x ;读取;读取;读取;读取x x的地址到的地址到的地址到的地址到r4r4 STR r0,[r4] STR r0,[r4] ;保存变量;保存变量;保存变量;保存变量x x ADR r4,c ADR r4,c ;读取变量;读取变量;读取变量;读取变量c c的地址到的地址到的地址到的地址到r4r4 LDR r0,[r4] LDR r0,[r4] ;读;读;读;读c c 的内容到的内容到的内容到的内容到r0r0 ADR r4,d ADR r4,d ;读取变量;读取变量;读取变量;读取变量d d的地址到的地址到的地址到的地址到r4 r4 妆划驹咐立据茧戳向琵弗紫躯眠办站脐伙完虞坷州坟赋披呈矿缠疯婆灿驾第3章程序设计基础ppt课件第3章程序设计基础ppt课件 LDR rl,[r4] ;读取;读取d的内容到的内容到r1 ADD r0,r0,rl ;计算;计算a+b,结果保存在,结果保存在r0 ADR r4,y ;读取变量;读取变量y的地址的地址 STR r0,[r4] ;结果保存在;结果保存在y中中 B after ;程序跳转到;程序跳转到after 子块子块fblock: ADR r4,c ;读取变量;读取变量c的地址的地址 LDR r0,[r4] ;读;读c的内容到的内容到r0 ADR r4,d ;读取变量;读取变量d的地址到的地址到r4 LDR rl,[r4] ;读变量;读变量d的内容到的内容到r1 SUB r0,r0,rl ;计算;计算a – b 结果保存在结果保存在r0 ADR r4,x ;读取变量;读取变量x的地址的地址 STR r0,[r4] ;结果保存在;结果保存在 x中中after: …偿逞募洽罪求陈健突掸涛蔗土升刮起笨骗你朔鲸孪槐绎猎申婪肇雌习授闲第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例例3-4 在在ARM中实现中实现C的的switch语句语句 C中的中的switch语句采用下列形式:语句采用下列形式: switch(test){ case 0:...:...break;; case 1:...:...break;; }上述语句也可以像上述语句也可以像if语句那样编码,首语句那样编码,首先测试先测试test=A,然后测试,然后测试test=B,依此类推,依此类推. 用基址加偏移量寻址并建立分支表的方用基址加偏移量寻址并建立分支表的方法执行起来会更有效地实现:法执行起来会更有效地实现: 肩溢洗盲若誊鄙涝渺凄央陵奎矮匝擎机酚吉驳壁费偶漆椎损勃恃户卷放穿第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ADR r2,test ;读取变量读取变量test的地址的地址 LDR r0,,[r2] ;读读test的内容到的内容到r0 ADR rl,switchtab ;读取读取switchtab 的地址到的地址到r1 LDR rl5,[rl,r0,LSL #2] switchtab: .word case 0      .word case l   …case0:: … @code for case 0casel:: … @code for case 1见建跪古屠啥萨躬览瘁焰瞬秽构畏边茅缸瘴连凹村蒙悦懈筐菏赫喊现甥尚第3章程序设计基础ppt课件第3章程序设计基础ppt课件 这种实现方法使用这种实现方法使用这种实现方法使用这种实现方法使用testtest值作为一个表的偏移量,其中值作为一个表的偏移量,其中值作为一个表的偏移量,其中值作为一个表的偏移量,其中该表保存了实现各种情况的代码段的地址。

      该表保存了实现各种情况的代码段的地址该表保存了实现各种情况的代码段的地址该表保存了实现各种情况的代码段的地址这段代码的核心就是这段代码的核心就是这段代码的核心就是这段代码的核心就是LDRLDR指令,它把多种功能集中在指令,它把多种功能集中在指令,它把多种功能集中在指令,它把多种功能集中在一个简单的指令里:一个简单的指令里:一个简单的指令里:一个简单的指令里:ØØ它将它将它将它将r0r0的值左移两位,把偏移量转化为字地址的值左移两位,把偏移量转化为字地址的值左移两位,把偏移量转化为字地址的值左移两位,把偏移量转化为字地址ØØ它用基址加偏移量寻址的方法把左移了的它用基址加偏移量寻址的方法把左移了的它用基址加偏移量寻址的方法把左移了的它用基址加偏移量寻址的方法把左移了的testtest的值的值的值的值( (存放在存放在存放在存放在r0r0中中中中) )加到保存在加到保存在加到保存在加到保存在r1r1中的表的基址中中的表的基址中中的表的基址中中的表的基址中ØØ它将该指令计算出的新地址置为程序计数器它将该指令计算出的新地址置为程序计数器它将该指令计算出的新地址置为程序计数器它将该指令计算出的新地址置为程序计数器(r15)(r15)的的的的值。

      值每一个每一个每一个每一个casecase都由存放在存储器某处的一段代码实现都由存放在存储器某处的一段代码实现都由存放在存储器某处的一段代码实现都由存放在存储器某处的一段代码实现分支表从名为分支表从名为分支表从名为分支表从名为switchtabswitchtab的单元开始的单元开始的单元开始的单元开始wordword语句是在该处装入一个语句是在该处装入一个语句是在该处装入一个语句是在该处装入一个3232位地址到存储器的一位地址到存储器的一位地址到存储器的一位地址到存储器的一种方法,因此分支表包含了对应于各个种方法,因此分支表包含了对应于各个种方法,因此分支表包含了对应于各个种方法,因此分支表包含了对应于各个casecase的代码段起的代码段起的代码段起的代码段起点的地址点的地址点的地址点的地址稽脱锑儿誉视甥舔悟列殉骏艳缄蓑盲寿列伺僧程栈武跃瞒翔默施氢帅灸梗第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.7.3 循环程序设计 循环程序设计 循环是非常通用的循环是非常通用的循环是非常通用的循环是非常通用的C C语句循环能用条件分支自然地实现,因为循环总是循环能用条件分支自然地实现,因为循环总是循环能用条件分支自然地实现,因为循环总是循环能用条件分支自然地实现,因为循环总是对存在数组中的值进行操作,循环也是对基址加偏对存在数组中的值进行操作,循环也是对基址加偏对存在数组中的值进行操作,循环也是对基址加偏对存在数组中的值进行操作,循环也是对基址加偏移量寻址模式的另一种用法较好的说明。

      移量寻址模式的另一种用法较好的说明移量寻址模式的另一种用法较好的说明移量寻址模式的另一种用法较好的说明例例例例3-4 3-4 用用用用ARMARM指令实现指令实现指令实现指令实现FIRFIR过滤器过滤器过滤器过滤器FIR(finite impulser response)FIR(finite impulser response)过滤器是一种过滤器是一种过滤器是一种过滤器是一种处理信号的常用方法;处理信号的常用方法;处理信号的常用方法;处理信号的常用方法;FIRFIR过滤器是简单的对积求和:过滤器是简单的对积求和:过滤器是简单的对积求和:过滤器是简单的对积求和: ∑ cixi ∑ cixi 1≤i≤n 1≤i≤n作为过滤器使用时,作为过滤器使用时,作为过滤器使用时,作为过滤器使用时,xixi假定为周期性采集的数假定为周期性采集的数假定为周期性采集的数假定为周期性采集的数据样品,据样品,据样品,据样品,cici是系数。

      是系数这个计算总是按如下方式进行:这个计算总是按如下方式进行:这个计算总是按如下方式进行:这个计算总是按如下方式进行: 能婴糯纺菇琅韩滑妄介插挠绽政讨香各檄洋细腿诺毯淹乐侥蓖珠戳床徊宿第3章程序设计基础ppt课件第3章程序设计基础ppt课件 这种表示假定样品是周期性采集而来的,每次一个新的样这种表示假定样品是周期性采集而来的,每次一个新的样品到来都要重新计算一次品到来都要重新计算一次FIR过滤器的输出过滤器的输出△△方框表示存储刚刚到来的样品产生方框表示存储刚刚到来的样品产生xi时延元素时延元素延迟的样品分别单独与延迟的样品分别单独与c相乘相乘,然后求和得到过滤器的输出然后求和得到过滤器的输出ΔΔΔΔΣfc1c2c3c4x1x2x3x4你独蒋获辅鞭方燕锰黔蛊舒帧拔腺籽腕烃承倒晃符两琼纳隧仍垃鄙靠奠迟第3章程序设计基础ppt课件第3章程序设计基础ppt课件 FIR过滤器的过滤器的C语言代码如下:语言代码如下: for(i=0,,f=0;i

      将每个进行编址将每个数组的第零元素的地址数组的第零元素的地址,装入一个寄装入一个寄存器存器,存放存放i的寄存器则用作偏移量的寄存器则用作偏移量次跃秋驱伎溢糕嫁链至盈詹伦者淀低乐寅亢膏雁眉诉粤翠喻彦贴佩癣遇倚第3章程序设计基础ppt课件第3章程序设计基础ppt课件 下面就是该循环的代码:下面就是该循环的代码: MOV r0,#0 ;使用;使用r0作为计数器作为计数器i,置初值,置初值      ;为;为0 MOV r8,#0 ;使用;使用r8作为字节偏移量,置作为字节偏移量,置;初值为;初值为0 ADR r2,n ;读取;读取n的地址到的地址到r2 LDR rl,,[r2];读;读n的值到的值到r1 MOV r2,#0 ;使用;使用r2作为作为 f,置初值为,置初值为 0 ADR r3,c;读取;读取c的地址到的地址到r3 作为作为c[i]数数;组的首地址;组的首地址 ADR r5,x;读取;读取x的地址到的地址到r5,作为,作为x[i];数组的首地址;数组的首地址 放捷蚜喊谆貌瘦撵速徘源舌吟擂莱哮引醇几拈骆沼寡货攻交舅驱芜削折挽第3章程序设计基础ppt课件第3章程序设计基础ppt课件 l oopl oop:::: LDR r4 LDR r4,,,,[r3,r8] [r3,r8]  ;读取 ;读取 ;读取 ;读取 c[i] c[i] 的值到的值到的值到的值到r4 r4     LDR r6,[r5,r8]LDR r6,[r5,r8];读取;读取;读取;读取x[i] x[i] 的值到的值到的值到的值到r6r6     MUL r4,r4,r6MUL r4,r4,r6;计算;计算;计算;计算 c[i]*s[i] c[i]*s[i],,,,;结果保存到;结果保存到;结果保存到;结果保存到r4r4     ADD r2,r2,r4ADD r2,r2,r4             ;求和送给;求和送给;求和送给;求和送给f f ;修改循环计数器和数组下标;修改循环计数器和数组下标;修改循环计数器和数组下标;修改循环计数器和数组下标     ADD r8,r8,#4ADD r8,r8,#4;偏移量增加;偏移量增加;偏移量增加;偏移量增加3232位位位位     ADD r0,r0,#1ADD r0,r0,#1;;;;i++i++ ;测试推出循环条件;测试推出循环条件;测试推出循环条件;测试推出循环条件     CMP r0,rlCMP r0,rl     BLT LoopBLT Loop;;;;if i

      写,我们都要注意代码中的数值精确度 32位位X 32位的乘法得到位的乘法得到64位的结果位的结果ARM的的MUL指令把结果的低指令把结果的低32位保存到目的位保存到目的寄存器中只要结果不超过寄存器中只要结果不超过32位,就能得到位,就能得到所需结果所需结果如果输入值正是可能有时超过如果输入值正是可能有时超过32位,我位,我们就要重新设计代码来计算高分辨率的值们就要重新设计代码来计算高分辨率的值宅矾碴钉肚续贱札栗隶计绍钉矢鉴剧粥誓冈巧悍婚疲衰凹伴况酚迷驻戴痰第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.7.4子程序设计子程序设计 C C语言的另一重要类是函数语言的另一重要类是函数语言的另一重要类是函数语言的另一重要类是函数每个每个每个每个C C函数返回一个值函数返回一个值函数返回一个值函数返回一个值( (除非它的返回类型是除非它的返回类型是除非它的返回类型是除非它的返回类型是void)void);一般把不返回值的结构称为;一般把不返回值的结构称为;一般把不返回值的结构称为;一般把不返回值的结构称为子例程子例程子例程子例程或或或或过程过程过程过程考虑下面这个考虑下面这个考虑下面这个考虑下面这个C C函数的简单用法:函数的简单用法:函数的简单用法:函数的简单用法: x=a+bx=a+b;;;; foo(x)foo(x);;;; y=c-dy=c-d;;;;当函数被调用后马上返回到调用代码中,在上当函数被调用后马上返回到调用代码中,在上当函数被调用后马上返回到调用代码中,在上当函数被调用后马上返回到调用代码中,在上例中就是返回到对例中就是返回到对例中就是返回到对例中就是返回到对y y赋值的语句。

      一个简单的分支是赋值的语句一个简单的分支是赋值的语句一个简单的分支是赋值的语句一个简单的分支是不够的,因为我们不知要返回到哪儿要想正确返不够的,因为我们不知要返回到哪儿要想正确返不够的,因为我们不知要返回到哪儿要想正确返不够的,因为我们不知要返回到哪儿要想正确返回,就要在调用函数或过程时保存回,就要在调用函数或过程时保存回,就要在调用函数或过程时保存回,就要在调用函数或过程时保存PCPC的值,当调用的值,当调用的值,当调用的值,当调用过程结束时,将过程结束时,将过程结束时,将过程结束时,将PCPC设置到下条指令的地址设置到下条指令的地址设置到下条指令的地址设置到下条指令的地址拨州挥悟肌熄打朝节梗宰晶铆余圃祭摩涛播挝暖履传蕾骂搜酸纪挑懂嫂昏第3章程序设计基础ppt课件第3章程序设计基础ppt课件 分支链接指令在分支链接指令在分支链接指令在分支链接指令在ARMARM中用于过程调用中用于过程调用中用于过程调用中用于过程调用这样,例如:这样,例如:这样,例如:这样,例如: BL fooBL foo将执行一个分支并链接到从定位点将执行一个分支并链接到从定位点将执行一个分支并链接到从定位点将执行一个分支并链接到从定位点foofoo开始的代码开始的代码开始的代码开始的代码( (用相对用相对用相对用相对PCPC寻址的方式寻址的方式寻址的方式寻址的方式) )。

      分支链接其实和分支很相似,分支链接其实和分支很相似,分支链接其实和分支很相似,分支链接其实和分支很相似,只不过是在分支前将当前只不过是在分支前将当前只不过是在分支前将当前只不过是在分支前将当前PCPC的值存在的值存在的值存在的值存在r14r14中过程返回中过程返回中过程返回中过程返回时,将时,将时,将时,将r14r14中的值移入中的值移入中的值移入中的值移入r15r15中即可:中即可:中即可:中即可:MOV r15MOV r15,,,,r14r14当然在调用过程中不能覆盖保存在当然在调用过程中不能覆盖保存在当然在调用过程中不能覆盖保存在当然在调用过程中不能覆盖保存在r14r14中的中的中的中的PCPC值但是这种机制只能调用一层过程但是这种机制只能调用一层过程但是这种机制只能调用一层过程但是这种机制只能调用一层过程例如例如例如例如: :如果我们在另一个如果我们在另一个如果我们在另一个如果我们在另一个C C函数中调用一个函数中调用一个函数中调用一个函数中调用一个C C函数,第二函数,第二函数,第二函数,第二个函数调用将会覆盖个函数调用将会覆盖个函数调用将会覆盖个函数调用将会覆盖r14r14,破坏第一个调用函数的返回,破坏第一个调用函数的返回,破坏第一个调用函数的返回,破坏第一个调用函数的返回地址。

      地址允许嵌套过程调用允许嵌套过程调用允许嵌套过程调用允许嵌套过程调用( (包括递归调用包括递归调用包括递归调用包括递归调用) )的标准过程将建的标准过程将建的标准过程将建的标准过程将建立一个栈完成立一个栈完成立一个栈完成立一个栈完成 趟痞顿辰焰拈待漳碳告译深畏媳榆咽意诉怕买湍竖酚句臻懒釉遇绣槛絮来第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例例3-5 ARM中的过程调用中的过程调用C语言描述如下:语言描述如下:void f1(int a){f2(a);;}ARM的的C编译程序常规是用编译程序常规是用r13指指向栈顶假定参数向栈顶假定参数a已经传人栈中的已经传人栈中的f1(),并且假设我们必须在调用,并且假设我们必须在调用f2()前将前将f2的的参数参数(碰巧是同一个值碰巧是同一个值)入栈应陨蓟崖蚜姿瘁傻缨宫感凭虚翼灿拆痔铂渗肋咋囊魄犀敞辨始芭呢捎愧唤第3章程序设计基础ppt课件第3章程序设计基础ppt课件 下面是包含对下面是包含对下面是包含对下面是包含对f2()f2()调用的调用的调用的调用的f1()f1()的手写代码:的手写代码:的手写代码:的手写代码: f1 f1::::LDR r0LDR r0,,,,[r13][r13];读取栈顶单元的内容到;读取栈顶单元的内容到;读取栈顶单元的内容到;读取栈顶单元的内容到r0r0 ;调用;调用;调用;调用f2()f2() STMFA rl3! STMFA rl3!,,,,{rl4} {rl4} ;将;将;将;将f1f1返回地址存储到栈中返回地址存储到栈中返回地址存储到栈中返回地址存储到栈中 STMFA rl3! STMFA rl3!,,,,{r0} {r0} ;将;将;将;将 f2 f2 的参数保存到栈顶的参数保存到栈顶的参数保存到栈顶的参数保存到栈顶 BL f2 BL f2  ;跳转到  ;跳转到  ;跳转到  ;跳转到 f2 f2执行执行执行执行 ;返回到;返回到;返回到;返回到f1()f1() SUB r13 SUB r13,,,,#4 #4 ;;;; f2 f2的参数出栈的参数出栈的参数出栈的参数出栈 LDR r13! LDR r13!,,,,r15 r15 ;返回到;返回到;返回到;返回到R15R15划倪妊躯手樊驻闻足厅木粪锣嗓惑瑚纬骨袁米莽畅瘩刻逊胚豢旋诛根釉赎第3章程序设计基础ppt课件第3章程序设计基础ppt课件 我们用基址加偏移量寻址法将传入我们用基址加偏移量寻址法将传入f1()的参数值装入的参数值装入r0中。

      调用中调用f2()时,先将时,先将f1()的返回地址入栈,该地址在执行进入的返回地址入栈,该地址在执行进入f1()的的分支链接指令时保存在分支链接指令时保存在r14中,然后将中,然后将f2()的参数入栈的参数入栈这两种情况下,我们都是使用自动增这两种情况下,我们都是使用自动增长的地址来入栈和调节栈指针的长的地址来入栈和调节栈指针的要返回,我们首先要调整栈,将掩盖要返回,我们首先要调整栈,将掩盖了了f1()返回地址的返回地址的f2()的参数去掉;然后用的参数去掉;然后用自动增长寻址弹出自动增长寻址弹出f1()的返回地址,放入的返回地址,放入PC(r15)中 脊侩下抿寒蒙躬曝化甫截墒扛搂哉塌澜务觅释梧蜡涯务黑叔劫铃渗吭匀肘第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.8 混合语言编程混合语言编程在应用系统的程序设计中,若所有在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工的编程任务均用汇编语言来完成,其工作量是可想而知的,同时,不利于系统作量是可想而知的,同时,不利于系统升级或应用软件移植升级或应用软件移植事实上,事实上,ARM体系结构支持体系结构支持C/C++以及与汇编语言的混合编程,在一个完以及与汇编语言的混合编程,在一个完整的程序设计中,除了初始化部分用汇整的程序设计中,除了初始化部分用汇编语言完成以外,其主要的编程任务一编语言完成以外,其主要的编程任务一般都用般都用C/C++完成。

      完成乱镑戒瘁缅贿锻牵馁屑扎软窑冈番屏啼司绢脑柠冠缄漂侥苯冗舷沾布弥妹第3章程序设计基础ppt课件第3章程序设计基础ppt课件 汇编语言与汇编语言与C/C++的混合编程通常的混合编程通常有以下几种方式:有以下几种方式:1.在在C/C++代码中嵌入汇编指令;代码中嵌入汇编指令;2.在汇编程序和在汇编程序和C/C++的程序之间进的程序之间进行变量的互访;行变量的互访;3.汇编程序、汇编程序、C/C++程序间的相互调程序间的相互调用尔炙匣枢彻嚣烃魔莽割澈亭猿刊蔚铲麦亮血骏堂嘎玉哮塔腥具霍滚抛有择第3章程序设计基础ppt课件第3章程序设计基础ppt课件 在实际的编程应用中,使用较多的方在实际的编程应用中,使用较多的方式是:式是:Ø程序的程序的初始化部分初始化部分用用汇编语言汇编语言完成,完成,然后用然后用C/C++完成主要的完成主要的编程任务编程任务;Ø程序在执行时首先完成初始化过程,程序在执行时首先完成初始化过程,然后跳转到然后跳转到C/C++程序代码中,汇编程序程序代码中,汇编程序和和C/C++程序之间一般没有参数的传递,程序之间一般没有参数的传递,也没有频繁的相互调用,因此,整个程序也没有频繁的相互调用,因此,整个程序的结构显得相对简单,容易理解,以下进的结构显得相对简单,容易理解,以下进行详细介绍。

      行详细介绍格吗虐古税翠材锭浪妈儡庆钦戴齐洞谅盯岿坑紊筒浦疡吞妒卑林哼糊本絮第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3.8.1如何在如何在C语言内嵌汇编语言语言内嵌汇编语言在在在在C C程序中嵌入汇编程序,可以实现一些高级程序中嵌入汇编程序,可以实现一些高级程序中嵌入汇编程序,可以实现一些高级程序中嵌入汇编程序,可以实现一些高级语言所没有的功能,提高程序执行效率语言所没有的功能,提高程序执行效率语言所没有的功能,提高程序执行效率语言所没有的功能,提高程序执行效率armccarmcc编译器的内嵌汇编器支持编译器的内嵌汇编器支持编译器的内嵌汇编器支持编译器的内嵌汇编器支持ARMARM指令集,指令集,指令集,指令集,tcctcc编译器的内嵌汇编器支持编译器的内嵌汇编器支持编译器的内嵌汇编器支持编译器的内嵌汇编器支持ThumbThumb指令集1. 1. 内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法__asm __asm { { 指令指令指令指令[; [;指令指令指令指令] ] ////* *注释注释注释注释* *////………… [ [指令指令指令指令] ]} } 嵌入汇编程序如例嵌入汇编程序如例嵌入汇编程序如例嵌入汇编程序如例3-63-6所示,给出了所示,给出了所示,给出了所示,给出了IRQIRQ中断使中断使中断使中断使能能能能/ /关闭函数关闭函数关闭函数关闭函数enable_IRQenable_IRQ和和和和 disable_IRQ disable_IRQ。

      劣鲸肛唾茸践饯词泽际碘剪企约浸革逾僳池暑霓墩揽肘勇鸵闪腻肝睦适很第3章程序设计基础ppt课件第3章程序设计基础ppt课件 例例3-6 使能/禁能使能/禁能IRQ中断中断 __inline void enable_IRQ(void) { int tmp;; __asm //嵌入汇编代码嵌入汇编代码 { MRS tmp,,CPSR //读取读取CPSR的值的值 BIC tmp,tmp,#0x80 MSR CPSR_c,tmp }}磅烩府送谗坐云耿凸藩摄痘宰湾似盟阮忿画少厢粳短鼠婪弘典航汀陷窥线第3章程序设计基础ppt课件第3章程序设计基础ppt课件 __inline void disable_IRQ(vold) int tmp;;__asm{ MRS tmp,,CPSR ORR tmp,,tmp,,#0x80 MSR CPSR_c,,tmp }}就草轿骄肝障砰梅缘奎亨吩符蕾尘锭恳辐壕厩叭及溃匪盎朗奔库恍履叉辊第3章程序设计基础ppt课件第3章程序设计基础ppt课件 2. 内嵌汇编的指令用法内嵌汇编的指令用法 (1) 操作数操作数Ø内嵌的汇编指令中作为操作数的寄存器和内嵌的汇编指令中作为操作数的寄存器和常量可以是常量可以是C表达式。

      表达式Ø这些表达式可以是这些表达式可以是char、、short或或int类型,类型,而且这些表达式都是作为无符号数进行操作而且这些表达式都是作为无符号数进行操作Ø若需要有符号数,用户需要自己处理与符若需要有符号数,用户需要自己处理与符号有关的操作号有关的操作Ø编译器将会计算这些表达式的值,并为其编译器将会计算这些表达式的值,并为其分配寄存器分配寄存器 俭础窃众引诛荆弹晰褥愉癌滴砷妖焦非矣圆宜检铅接胶揪痊凳字遥要猿悟第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (2) (2) 物理寄存器物理寄存器物理寄存器物理寄存器内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下限制限制限制限制:::: 1.1.不能直接向不能直接向不能直接向不能直接向PCPC寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用B B或或或或BLBL指令实现指令实现指令实现指令实现2.2.使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的C C表达式。

      因为表达式过于复杂时,将会需要较多的表达式因为表达式过于复杂时,将会需要较多的表达式因为表达式过于复杂时,将会需要较多的表达式因为表达式过于复杂时,将会需要较多的物理寄存器这些寄存器可能与指令中的物理寄存物理寄存器这些寄存器可能与指令中的物理寄存物理寄存器这些寄存器可能与指令中的物理寄存物理寄存器这些寄存器可能与指令中的物理寄存器在使用时发生冲突器在使用时发生冲突器在使用时发生冲突器在使用时发生冲突3.3.编译器可能会使用编译器可能会使用编译器可能会使用编译器可能会使用R12R12或或或或R13R13存放编译的中间结果存放编译的中间结果存放编译的中间结果存放编译的中间结果在计算表达式的值时可能会将寄存器在计算表达式的值时可能会将寄存器在计算表达式的值时可能会将寄存器在计算表达式的值时可能会将寄存器R0~R3R0~R3、、、、R12R12和和和和R14R14用于子程序调用因此,在内嵌的汇编指令用于子程序调用因此,在内嵌的汇编指令用于子程序调用因此,在内嵌的汇编指令用于子程序调用因此,在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理存中,不要将这些寄存器同时指定为指令中的物理存中,不要将这些寄存器同时指定为指令中的物理存中,不要将这些寄存器同时指定为指令中的物理存储器。

      储器4.4.通常内嵌的汇编指令中不要指定物理寄存器,因为通常内嵌的汇编指令中不要指定物理寄存器,因为通常内嵌的汇编指令中不要指定物理寄存器,因为通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的这可能会影响编译器分配寄存器,进而影响代码的这可能会影响编译器分配寄存器,进而影响代码的这可能会影响编译器分配寄存器,进而影响代码的效率赦竖顿贺钞茅碟乌睹烙康存栏梭介努变累幽宠并炳嘱迈焊沼隙萌趋坯阅壕第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (3) 常量在内嵌汇编指令中,常量前面的常量在内嵌汇编指令中,常量前面的“#”可以省略可以省略4) 指令展开内嵌的汇编指令中,如果包含指令展开内嵌的汇编指令中,如果包含常量操作数,则该指令有可能被内嵌汇编器常量操作数,则该指令有可能被内嵌汇编器展开成几条指令展开成几条指令5) 标号C程序中的标号可以被内嵌的汇编程序中的标号可以被内嵌的汇编指令使用但是只有指令指令使用但是只有指令B可以使用可以使用C程序中程序中的标号,而指令的标号,而指令BL则不能使用则不能使用 (6) 内存单元的分配所有的内存分配均由内存单元的分配。

      所有的内存分配均由C编译器完成,分配的内存单元通过变量供内编译器完成,分配的内存单元通过变量供内嵌汇编器使用内嵌汇编器不支持内嵌汇编嵌汇编器使用内嵌汇编器不支持内嵌汇编程序中用于内存分配的伪指令程序中用于内存分配的伪指令 嚷睬怒完狠旅翻闲详权瑶届哈柄驯厌毋抠姚经陌寒潍顾丹淡伪泌胺对抽蜘第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (7) SWI和和BL指令在内嵌的在内嵌的SWI和和BL指令中,除了正常的操作指令中,除了正常的操作数域外,还必须增加以下数域外,还必须增加以下3个可选的寄存器列个可选的寄存器列表:表: 1.1.第第1个寄存器列表中的寄存器用于输入个寄存器列表中的寄存器用于输入的参数2.2.第第2个寄存器列表中的寄存器用于存储返个寄存器列表中的寄存器用于存储返回的结果回的结果3.3.第第3个寄存器列表中的寄存器的内容可能个寄存器列表中的寄存器的内容可能被被调用的子程序破坏,即这些寄存器是供被被调用的子程序破坏,即这些寄存器是供被调用的子程序作为工作寄存器被调用的子程序作为工作寄存器 须任捅慑镣七筒爆钨须便宰戈勤禹辨副禁苗帖壳碳阮语伐舷织博婴蝴趣掩第3章程序设计基础ppt课件第3章程序设计基础ppt课件 3. 3. 内嵌汇编器内嵌汇编器内嵌汇编器内嵌汇编器与与与与armasmarmasm汇编器汇编器汇编器汇编器的差异的差异的差异的差异ØØ内嵌汇编器不支持通过内嵌汇编器不支持通过内嵌汇编器不支持通过内嵌汇编器不支持通过“.”“.”指示符或指示符或指示符或指示符或PCPC获取当前获取当前获取当前获取当前指令地址;指令地址;指令地址;指令地址;ØØ不支持不支持不支持不支持“LDR Rn“LDR Rn,=,=,=,=expr”expr”伪指令,而使用伪指令,而使用伪指令,而使用伪指令,而使用“MOV “MOV RnRn,,,,expr”expr”指令向寄存器赋值;指令向寄存器赋值;指令向寄存器赋值;指令向寄存器赋值;ØØ不支持标号表达式;不支持不支持标号表达式;不支持不支持标号表达式;不支持不支持标号表达式;不支持ADRADR和和和和ADRLADRL伪指令;伪指令;伪指令;伪指令;ØØ不支持不支持不支持不支持BXBX指令;指令;指令;指令;ØØ不能向不能向不能向不能向PCPC赋值。

      赋值ØØ使用使用使用使用0x0x前缀代替前缀代替前缀代替前缀代替“&”“&”,表示十六进制数表示十六进制数表示十六进制数表示十六进制数ØØ当使用当使用当使用当使用8 8位移位常数导致位移位常数导致位移位常数导致位移位常数导致CPSRCPSR的的的的ALUALU标志更新时,标志更新时,标志更新时,标志更新时,N N、、、、Z Z、、、、C C和和和和V V标志中的标志中的标志中的标志中的C C不具有真实意义不具有真实意义不具有真实意义不具有真实意义 另抡穴散羽儡摆峙早里痹夕锤程面玖譬异揪撰黎全颓澈搀柴取囚逼临装暖第3章程序设计基础ppt课件第3章程序设计基础ppt课件 4. 内嵌汇编注意事项内嵌汇编注意事项(1)(1)必须小心使用物理寄存器必须小心使用物理寄存器必须小心使用物理寄存器必须小心使用物理寄存器. .如如如如R0~R3R0~R3、、、、PCPC、、、、LRLR和和和和CPSRCPSR中的中的中的中的N N、、、、Z Z、、、、C C和和和和V V标标标标志位志位志位志位, ,因为计算汇编代码中的因为计算汇编代码中的因为计算汇编代码中的因为计算汇编代码中的C C表达式时表达式时表达式时表达式时, ,可能会使用这可能会使用这可能会使用这可能会使用这些物理寄存器些物理寄存器些物理寄存器些物理寄存器, ,并会修改并会修改并会修改并会修改N N、、、、Z Z、、、、C C和和和和V V 标志位。

      标志位例如:例如:例如:例如: __asm __asm { MOV var{ MOV var,,,,x x ADD yADD y,,,,varvar,,,,x/yx/y } }计算计算计算计算x/yx/y时时时时R0R0会被修改内嵌汇编器探测到隐含会被修改内嵌汇编器探测到隐含会被修改内嵌汇编器探测到隐含会被修改内嵌汇编器探测到隐含的寄存器冲突就会报错的寄存器冲突就会报错的寄存器冲突就会报错的寄存器冲突就会报错忙馋伟柏谓篮锗笺俄口诵驼狞吸遗锤顾柔奖啮彝晨蔷章冲帘削曼窖篱骏棠第3章程序设计基础ppt课件第3章程序设计基础ppt课件 ((2)不要使用寄存器代替变量不要使用寄存器代替变量尽管有时寄尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器明显对应某个变量,但也不能直接使用寄存器代替变量存器代替变量例如:例如: int bad_f(int x) // x存放在存放在R0中中 { __asm { ADD R0,,R0,,#1 //发生寄存器冲发生寄存器冲突,实际上突,实际上x的值没有变化的值没有变化 } return(x);; } 繁蔽槽军嘉纬狼殖鼻赢争戮宗绢湘捻毋登凰纪就咏逗器糯妄吨练啼钠涸氛第3章程序设计基础ppt课件第3章程序设计基础ppt课件 尽管根据编译器的编译规则似乎可以确尽管根据编译器的编译规则似乎可以确定定R0对应对应x,但这样的代码会使内嵌汇编器,但这样的代码会使内嵌汇编器认为发生了寄存器冲突。

      认为发生了寄存器冲突用其它寄存器代替用其它寄存器代替R0存放参数存放参数x,使得,使得该函数将该函数将x原封不动地返回原封不动地返回这段代码的正确写法如下:这段代码的正确写法如下: int bad_f(int x) { __asm { ADD x,,x,,#1 } return(x);; }柱零赫宰辞贤舶躲成恢耙沙乎苏挣疙壕降佯数化予宵队旗硷很剖挤撩衣沙第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (3) (3) 使用内嵌式汇编无需保存和恢复寄存器使用内嵌式汇编无需保存和恢复寄存器使用内嵌式汇编无需保存和恢复寄存器使用内嵌式汇编无需保存和恢复寄存器事实上,除了事实上,除了事实上,除了事实上,除了CPSRCPSR和和和和SPSRSPSR寄存器,对物理寄寄存器,对物理寄寄存器,对物理寄寄存器,对物理寄存器先读后写都会引起汇编器报错存器先读后写都会引起汇编器报错存器先读后写都会引起汇编器报错存器先读后写都会引起汇编器报错例如:例如:例如:例如: int f(int x)int f(int x) { __asrn{ __asrn { STMFD SP!{ STMFD SP!,,,,{R0} //{R0} //保存保存保存保存R0R0。

      先读后写,汇编出错先读后写,汇编出错先读后写,汇编出错先读后写,汇编出错 ADD R0ADD R0,,,,x x,,,,l l EOR xEOR x,,,,R0R0,,,,x x LDMFD SP!LDMFD SP!,,,,{R0}{R0} } } return(x)return(x);;;; } } 更风养曳霞吼审澜童篆敲泡昔再兰殆尼祈紊誊乍颤俱先循摄疚蕊琳柞昂严第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (4)LDM和和STM指令的寄存器列表中指令的寄存器列表中只允许使用物理寄存器只允许使用物理寄存器内嵌汇编可以修改处理器模式、协内嵌汇编可以修改处理器模式、协处理器模式以及处理器模式以及FP、、SL、、SB等等APCS寄存器但是编译器在编译时并不了寄存器但是编译器在编译时并不了解这些变化,因此必须保证在执行解这些变化,因此必须保证在执行C代代码前恢复相应被修改的处理器模式码前恢复相应被修改的处理器模式防见劫沤侣秆颊互聪位汕扦层看凌蛇拐希款撤壤湖哗尿葫蜒脑验突盂妇意第3章程序设计基础ppt课件第3章程序设计基础ppt课件 (5) 汇编语言中的汇编语言中的“,,”号作为操作数分隔符。

      号作为操作数分隔符如果有如果有C表达式作为操作数,若表达式中包含表达式作为操作数,若表达式中包含有有“,,”,则必须使用符号,则必须使用符号“(”和和“)”将其归约将其归约为一个汇编操作数为一个汇编操作数例如:例如:__asm{ ADD x,,y,,(f(),,z) //“f(),,z”为一个带为一个带有有“,,”的的C表达式表达式} 酉搭司履吉护八奥矮溜北析患阿巩祥桓栖检盘历乞瘪叮怂守捏颁痰牌皇栋第3章程序设计基础ppt课件第3章程序设计基础ppt课件 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.