资源预览内容
第1页 / 共131页
第2页 / 共131页
第3页 / 共131页
第4页 / 共131页
第5页 / 共131页
第6页 / 共131页
第7页 / 共131页
第8页 / 共131页
第9页 / 共131页
第10页 / 共131页
亲,该文档总共131页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于s3c44B0X嵌入式uCLinux系统原理及应用1PPT学习交流n本章主要内容:本章主要内容:(1)GCC编译过程(2)C/C+交叉编译器arm-elf-gcc(3)交叉汇编器 arm-elf-as (4)交叉连接器arm-elf-l d(5)工程管理器make(6)汇编语言编程(7)混合编程2PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld3.1需求分析4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程3PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld3.1需求分析4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程4PPT学习交流3.1 GNU GCC简介简介 GNU集成编译环境集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种编程是一种面向嵌入式领域、支持多种编程语言、支持多种语言、支持多种CPU的交叉编译工具。的交叉编译工具。 输出预处理后的输出预处理后的输出预处理后的输出预处理后的C/C+C/C+源程序(展开头文件和替换宏)源程序(展开头文件和替换宏)源程序(展开头文件和替换宏)源程序(展开头文件和替换宏)输出输出输出输出C/C+C/C+源程序的汇编代码源程序的汇编代码源程序的汇编代码源程序的汇编代码输出二进制目标文件输出二进制目标文件输出二进制目标文件输出二进制目标文件生成静态库生成静态库生成静态库生成静态库生成可执行程序生成可执行程序生成可执行程序生成可执行程序转换文件格式转换文件格式转换文件格式转换文件格式l lGNU GCCGNU GCC的基本功能的基本功能的基本功能的基本功能5PPT学习交流3.1 GNU GCC简介简介lGCC组成-C/C+C/C+交叉编译器交叉编译器交叉编译器交叉编译器arm-elf-gccarm-elf-gcc arm-elf-gcc是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。他程序来实现将程序源文件编译成目标文件的功能。他程序来实现将程序源文件编译成目标文件的功能。他程序来实现将程序源文件编译成目标文件的功能。 arm-elf-gcc具有丰富的命令选项,可以控制编具有丰富的命令选项,可以控制编具有丰富的命令选项,可以控制编具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。译的各个阶段,满足用户的各种编译需求。译的各个阶段,满足用户的各种编译需求。译的各个阶段,满足用户的各种编译需求。6PPT学习交流3.1 GNU GCC简介简介lGCC组成-汇编器汇编器汇编器汇编器 arm-elf-asarm-elf-as arm-elf-as将汇编语言程序转换为将汇编语言程序转换为将汇编语言程序转换为将汇编语言程序转换为ELFELF (Executable and Linking Format (Executable and Linking Format,执行时链接,执行时链接,执行时链接,执行时链接文件格式文件格式文件格式文件格式) )格式的可重定位目标代码,这些目标代格式的可重定位目标代码,这些目标代格式的可重定位目标代码,这些目标代格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。码同其它目标模块或函数库易于定位和链接。码同其它目标模块或函数库易于定位和链接。码同其它目标模块或函数库易于定位和链接。说明说明说明说明:arm-elf-asarm-elf-as产生一个交叉参考表和一个标准的符号表,产生一个交叉参考表和一个标准的符号表,产生一个交叉参考表和一个标准的符号表,产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区产生的代码和数据能够放在多个区产生的代码和数据能够放在多个区产生的代码和数据能够放在多个区 (Section)(Section)中。中。中。中。7PPT学习交流3.1 GNU GCC简介简介lGCC组成-连接器连接器连接器连接器arm-elf-ldarm-elf-ld arm-elf-gcc是编译的前端程序,是编译的前端程序,是编译的前端程序,是编译的前端程序,arm-elf-ldarm-elf-ld根据根据根据根据链接定位文件链接定位文件链接定位文件链接定位文件LinkcmdsLinkcmds中的代码区、数据区、中的代码区、数据区、中的代码区、数据区、中的代码区、数据区、BSSBSS区和栈区等定位信息,将可重定位的目标模块链接区和栈区等定位信息,将可重定位的目标模块链接区和栈区等定位信息,将可重定位的目标模块链接区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。成一个单一的、绝对定位的目标程序。成一个单一的、绝对定位的目标程序。成一个单一的、绝对定位的目标程序。8PPT学习交流3.1 GNU GCC简介简介lGCC组成-库管理器库管理器库管理器库管理器arm-elf-ararm-elf-ar arm-elf-ar将多个可重定位的目将多个可重定位的目将多个可重定位的目将多个可重定位的目标模块归档为一个函数库文件。标模块归档为一个函数库文件。标模块归档为一个函数库文件。标模块归档为一个函数库文件。9PPT学习交流3.1 GNU GCC简介简介lGCC组成-工程管理器工程管理器工程管理器工程管理器MAKEMAKE arm-elf-gcc MakeMake是用于自动编译、链接是用于自动编译、链接是用于自动编译、链接是用于自动编译、链接程序的实用工具程序的实用工具程序的实用工具程序的实用工具, ,使用使用使用使用makemake后就不需要手工的编后就不需要手工的编后就不需要手工的编后就不需要手工的编译每个程序文件。要使用译每个程序文件。要使用译每个程序文件。要使用译每个程序文件。要使用make,make,首先要编写首先要编写首先要编写首先要编写makefilemakefile。 Makefile描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,并提供更新文件的命令。并提供更新文件的命令。并提供更新文件的命令。并提供更新文件的命令。10PPT学习交流3.1 GNU GCC简介简介lGCC组成-其他实用程序其他实用程序其他实用程序其他实用程序 arm-elf-objcopy目标文件格式转换工具等;目标文件格式转换工具等;目标文件格式转换工具等;目标文件格式转换工具等;11PPT学习交流3.1 GNU GCC简介简介lGCC编译程序的基本过程 arm-elf-gcc根据输入文件的后缀来确定文件的根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括优化选项、调试信类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为息选项等)将其编译成相应的汇编临时文件(后缀为.s);); arm-elf-as将该汇编文件编译成目标文件(后将该汇编文件编译成目标文件(后缀为缀为.o);); arm-elf-ld 根据用户的链接选项(包括指定链接根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接起来生成可执行文命令文件等)将目标文件和各种库链接起来生成可执行文件。件。程序的编译过程程序的编译过程12PPT学习交流C/C+源文件源文件Arm-elf-gcc头文件头文件汇编文件汇编文件Arm-elf-as目标文件目标文件源文件列表源文件列表生成库生成库连接命令文件连接命令文件可重定位模块可重定位模块Arm-eif-ldArm-elf-ar用户库用户库库列表库列表可执行程序可执行程序13PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld3.1需求分析4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程14PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令格式 arm-elf-gcc options filearm-elf-gcc options file在命令在命令在命令在命令arm-elf-gccarm-elf-gcc后面跟一个或多个选项,选项间后面跟一个或多个选项,选项间后面跟一个或多个选项,选项间后面跟一个或多个选项,选项间用空格隔开,然后跟一个或多个目标文件。用空格隔开,然后跟一个或多个目标文件。用空格隔开,然后跟一个或多个目标文件。用空格隔开,然后跟一个或多个目标文件。例如,例如,例如,例如,将将将将test.c test.c 编译成目标文件编译成目标文件编译成目标文件编译成目标文件test.o test.o 并且生成调试信并且生成调试信并且生成调试信并且生成调试信息:息:息:息: arm-elf-gcc g c o test.o test.c arm-elf-gcc g c o test.o test.c 15PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-c-c 将输入的源文件编译成目标文件将输入的源文件编译成目标文件将输入的源文件编译成目标文件将输入的源文件编译成目标文件-S-S 将将将将C/C+C/C+文件生成汇编文件文件生成汇编文件文件生成汇编文件文件生成汇编文件-o file -o file 将输出内容存于文件将输出内容存于文件将输出内容存于文件将输出内容存于文件filefile-pipe -pipe 在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式-v-v 打印出编译过程中执行的命令打印出编译过程中执行的命令打印出编译过程中执行的命令打印出编译过程中执行的命令-x language-x language说明文件的输入类型为说明文件的输入类型为说明文件的输入类型为说明文件的输入类型为languagelanguage输出控制选项:输出控制选项:16PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-ansi -ansi 支持所有支持所有支持所有支持所有ANSI CANSI C程序程序程序程序C语言选项:语言选项:17PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-w -w 关闭所有警告关闭所有警告关闭所有警告关闭所有警告-Wall -Wall 打开所有警告打开所有警告打开所有警告打开所有警告-Wimplicit -Wimplicit 如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息-Wno-implicit -Wno-implicit 不显示对隐含申明的警告不显示对隐含申明的警告不显示对隐含申明的警告不显示对隐含申明的警告警告选项:警告选项:18PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-g -g 在文件中产生调试信息在文件中产生调试信息在文件中产生调试信息在文件中产生调试信息( (调试信息的文件格式有调试信息的文件格式有调试信息的文件格式有调试信息的文件格式有stabsstabs、COFFCOFF、XCOFFXCOFF、DWARF)DWARF)调试选项:调试选项:19PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表- -O0 O0 不优化不优化不优化不优化-O1 -O1 一级优化一级优化一级优化一级优化-O2 -O2 二级优化二级优化二级优化二级优化-O3 -O3 三级优化三级优化三级优化三级优化优化选项:优化选项:20PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-E -E 运行运行运行运行C C的预处理器的预处理器的预处理器的预处理器-C -C 在运用在运用在运用在运用-E-E进行预处理时不去掉注释进行预处理时不去掉注释进行预处理时不去掉注释进行预处理时不去掉注释-D macro -D macro 定义宏定义宏定义宏定义宏macromacro为为为为1 1-D macro=defn -D macro=defn 定义宏定义宏定义宏定义宏macromacro为为为为defndefn预处理选项:预处理选项:21PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-Wa-Wa,option option 将选项将选项将选项将选项optionoption传递传递传递传递 给汇编器给汇编器给汇编器给汇编器汇编选项:汇编选项:22PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-命令选项列表-I dir -I dir 设置搜索路径为设置搜索路径为设置搜索路径为设置搜索路径为dirdir-I- -I- 指定只对指定只对指定只对指定只对 #include “file”,#include “file”,有效的头文件搜索有效的头文件搜索有效的头文件搜索有效的头文件搜索目录目录目录目录 搜索路径选项:搜索路径选项:23PPT学习交流l l概述概述3.2 C/C+交叉编译器交叉编译器arm-elf-gcc-源文件类型的识别*.c *.c CC源文件源文件源文件源文件* *.i .i 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件* *.h .h CC头文件头文件头文件头文件* *.ii .ii 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C+C+源文件源文件源文件源文件* *.cc .cc C+C+源文件源文件源文件源文件* *.cxx .cxx C+C+源文件源文件源文件源文件* *.cpp .cpp C+C+源文件源文件源文件源文件* *.C.CC+C+源文件源文件源文件源文件* *.s .s 不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件* *.S.S需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件arm-elf-gccarm-elf-gcc能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型. .24PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如,例如,将将将将test.ctest.c编译成汇编程序并存放于文件编译成汇编程序并存放于文件编译成汇编程序并存放于文件编译成汇编程序并存放于文件test.txttest.txt:arm-elf-gcc S o test.txt test.carm-elf-gcc S o test.txt test.c -o file -o file将输出内容存于文件将输出内容存于文件将输出内容存于文件将输出内容存于文件filefile,仅适用于只有一个输出,仅适用于只有一个输出,仅适用于只有一个输出,仅适用于只有一个输出文件时。文件时。文件时。文件时。-输出文件名的指定25PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如,例如, 将将将将test.ctest.c编译成编译成编译成编译成test.otest.o:arm-elf-gcc c o test.o test.carm-elf-gcc c o test.o test.c -c -c将输入的源文件编译成目标文件。将输入的源文件编译成目标文件。将输入的源文件编译成目标文件。将输入的源文件编译成目标文件。-目标文件的生成26PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如,例如,将将将将test.ctest.c编译生成汇编文件编译生成汇编文件编译生成汇编文件编译生成汇编文件test.s:test.s:arm-elf-gcc S o test.s test.carm-elf-gcc S o test.s test.c -S -S将将将将C/C+C/C+文件生成汇编文件。文件生成汇编文件。文件生成汇编文件。文件生成汇编文件。-将C/C+文件生成汇编文件27PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如,例如,对对对对test.ctest.c进行预处理并将结果输出到屏幕:进行预处理并将结果输出到屏幕:进行预处理并将结果输出到屏幕:进行预处理并将结果输出到屏幕:arm-elf-gcc E test.carm-elf-gcc E test.c -E -E只对源文件进行预处理并且缺省输出到标准输出。只对源文件进行预处理并且缺省输出到标准输出。只对源文件进行预处理并且缺省输出到标准输出。只对源文件进行预处理并且缺省输出到标准输出。-预处理文件的生成28PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc头文件的头文件的头文件的头文件的引用引用引用引用有两种形式:有两种形式:有两种形式:有两种形式: 一种是一种是一种是一种是# include“”# include“”, 一种是一种是一种是一种是# include # include 。前一种形式的前一种形式的前一种形式的前一种形式的路径搜索顺序路径搜索顺序路径搜索顺序路径搜索顺序是:当前目录、指定是:当前目录、指定是:当前目录、指定是:当前目录、指定的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。-I dir -I dir 将目录将目录将目录将目录dirdir添加到头文件搜索目录列表的第一项。添加到头文件搜索目录列表的第一项。添加到头文件搜索目录列表的第一项。添加到头文件搜索目录列表的第一项。-I- -I- -I-I-以前以前以前以前用用用用-I -I指定的头文件搜索目录只对指定的头文件搜索目录只对指定的头文件搜索目录只对指定的头文件搜索目录只对 # include“file” # include“file” 有效,对有效,对有效,对有效,对 # include # include 无效;无效;无效;无效; -I-I-以后以后以后以后指定的头文件搜索目录对以上两种形式的头文指定的头文件搜索目录对以上两种形式的头文指定的头文件搜索目录对以上两种形式的头文指定的头文件搜索目录对以上两种形式的头文件都有效。件都有效。件都有效。件都有效。-设置头文件搜索路径29PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc头文件的头文件的头文件的头文件的引用引用引用引用有两种形式:有两种形式:有两种形式:有两种形式: 一种是一种是一种是一种是# include“”# include“”, 一种是一种是一种是一种是# include # include 。前一种形式的前一种形式的前一种形式的前一种形式的路径搜索顺序路径搜索顺序路径搜索顺序路径搜索顺序是:当前目录、指定是:当前目录、指定是:当前目录、指定是:当前目录、指定的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。的搜索路径;后一种形式只搜索指定路径。-I dir-I dir-I-I-设置头文件搜索路径例如,例如,编译编译编译编译test.ctest.c,在当前目录和,在当前目录和,在当前目录和,在当前目录和/include/include中搜索中搜索中搜索中搜索test.ctest.c所所所所包含的头文件:包含的头文件:包含的头文件:包含的头文件: arm-elf-gcc I ./ I/include c test.carm-elf-gcc I ./ I/include c test.c30PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如,例如,如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:arm-elf-gcc c Wimplicit test.carm-elf-gcc c Wimplicit test.c不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:arm-elf-gcc c Wnoimplicit test.carm-elf-gcc c Wnoimplicit test.c常用的警告选项有:常用的警告选项有:常用的警告选项有:常用的警告选项有:-w-w 关闭所有警告信息。关闭所有警告信息。关闭所有警告信息。关闭所有警告信息。-Wall-Wall 打开所有警告信息。打开所有警告信息。打开所有警告信息。打开所有警告信息。 可以使用以可以使用以可以使用以可以使用以-W-W开头的不同选项对特定警告进开头的不同选项对特定警告进开头的不同选项对特定警告进开头的不同选项对特定警告进行设定。对于每种警告类型都有相应以行设定。对于每种警告类型都有相应以行设定。对于每种警告类型都有相应以行设定。对于每种警告类型都有相应以-Wno-Wno-开开开开始的选项关闭警告。始的选项关闭警告。始的选项关闭警告。始的选项关闭警告。-控制警告产生31PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc1.1.-O1-O1 可以部分减小代码尺寸,对运行速度有一定的提高。可以部分减小代码尺寸,对运行速度有一定的提高。可以部分减小代码尺寸,对运行速度有一定的提高。可以部分减小代码尺寸,对运行速度有一定的提高。较多地使用了寄存器变量,提高指令的并行度。较多地使用了寄存器变量,提高指令的并行度。较多地使用了寄存器变量,提高指令的并行度。较多地使用了寄存器变量,提高指令的并行度。2.2.-O2-O2 除了解循环、函数插装和静态变量优化,几乎包含除了解循环、函数插装和静态变量优化,几乎包含除了解循环、函数插装和静态变量优化,几乎包含除了解循环、函数插装和静态变量优化,几乎包含arm-elf-gccarm-elf-gcc所有优化选项。一般在生成固化代码时使用该所有优化选项。一般在生成固化代码时使用该所有优化选项。一般在生成固化代码时使用该所有优化选项。一般在生成固化代码时使用该选项较为适宜。选项较为适宜。选项较为适宜。选项较为适宜。3.3.-O3-O3 包含包含包含包含-O2-O2的所有优化,并且还包含了解循环、函数插的所有优化,并且还包含了解循环、函数插的所有优化,并且还包含了解循环、函数插的所有优化,并且还包含了解循环、函数插装和静态变量优化。通常情况下,该级优化生成的代码执装和静态变量优化。通常情况下,该级优化生成的代码执装和静态变量优化。通常情况下,该级优化生成的代码执装和静态变量优化。通常情况下,该级优化生成的代码执行速度最快,但是代码尺寸比行速度最快,但是代码尺寸比行速度最快,但是代码尺寸比行速度最快,但是代码尺寸比-O2-O2大一些。大一些。大一些。大一些。 arm-elf-gccarm-elf-gcc支持多种优化选项,总体上划分支持多种优化选项,总体上划分支持多种优化选项,总体上划分支持多种优化选项,总体上划分为为为为三级优化三级优化三级优化三级优化:-实现优化32PPT学习交流l l命令使命令使用用3.2 C/C+交叉编译器交叉编译器arm-elf-gcc例如例如:编译编译编译编译test.ctest.c并且预定义宏并且预定义宏并且预定义宏并且预定义宏 RUN_CACHE RUN_CACHE 值为值为值为值为1 1: arm-: arm-elf-gcc c D RUN_CACHE test.celf-gcc c D RUN_CACHE test.c编译编译编译编译test.ctest.c并且预定义宏并且预定义宏并且预定义宏并且预定义宏 RUN_CACHE RUN_CACHE 值为值为值为值为0 0: arm-: arm-elf-gcc c D RUN_CACHE=0 test.celf-gcc c D RUN_CACHE=0 test.c-D macro-D macro定义宏定义宏定义宏定义宏macromacro为为为为1 1。-D macro=defn-D macro=defn 定义宏定义宏定义宏定义宏macromacro为为为为defndefn。-在命令行定义33PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程34PPT学习交流l l概述概述3.2 交叉连接器交叉连接器arm-elf-ld -命令格式arm-elf-ld option filearm-elf-ld option file命令行后跟选项和可重定位的目标文件名。命令行后跟选项和可重定位的目标文件名。命令行后跟选项和可重定位的目标文件名。命令行后跟选项和可重定位的目标文件名。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,链接的库为链接的库为链接的库为链接的库为libxxx.alibxxx.a,生成内存映象文件,生成内存映象文件,生成内存映象文件,生成内存映象文件map.txtmap.txt,链接定位文件为,链接定位文件为,链接定位文件为,链接定位文件为linkcmdslinkcmds,则命令如下:,则命令如下:,则命令如下:,则命令如下:arm-elf-ld -Map map.txt -T linkcmds -L./lib o arm-elf-ld -Map map.txt -T linkcmds -L./lib o demo.elf demo.o lxxxdemo.elf demo.o lxxx35PPT学习交流l l概述概述3.2 交叉连接器交叉连接器arm-elf-ld -命令选项列表-e entry-e entry指定程序入口指定程序入口指定程序入口指定程序入口-M-M输出链接信息输出链接信息输出链接信息输出链接信息-lar-lar指定链接库指定链接库指定链接库指定链接库-L dir-L dir添加搜索路径添加搜索路径添加搜索路径添加搜索路径-o-o设置输出文件名设置输出文件名设置输出文件名设置输出文件名-Tcommandfile-Tcommandfile指定链接命令文件指定链接命令文件指定链接命令文件指定链接命令文件-v-v显示版本信息显示版本信息显示版本信息显示版本信息-Map-Map制定输出映像文件制定输出映像文件制定输出映像文件制定输出映像文件36PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -程序入口地址-e entry-e entry以符号以符号以符号以符号entryentry作为程序执行的入口地址,而不从默作为程序执行的入口地址,而不从默作为程序执行的入口地址,而不从默作为程序执行的入口地址,而不从默认的入口地址开始。认的入口地址开始。认的入口地址开始。认的入口地址开始。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,链,链,链,链接定位文件为接定位文件为接定位文件为接定位文件为linkcmdslinkcmds,将入口地址设为,将入口地址设为,将入口地址设为,将入口地址设为_start_start,命令如,命令如,命令如,命令如下:下:下:下:arm-elf-ld T linkcmds e _start o demo.elf demo.oarm-elf-ld T linkcmds e _start o demo.elf demo.o37PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -输出链接信息- -MM在标准端口打印出符号映象表和内存分布信息。在标准端口打印出符号映象表和内存分布信息。在标准端口打印出符号映象表和内存分布信息。在标准端口打印出符号映象表和内存分布信息。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.o,demo.o,输出文件为输出文件为输出文件为输出文件为demo.elf,demo.elf,在标准端口打印出符号映象表和内存分在标准端口打印出符号映象表和内存分在标准端口打印出符号映象表和内存分在标准端口打印出符号映象表和内存分布信息,命令如下:布信息,命令如下:布信息,命令如下:布信息,命令如下:arm-elf-ld M o demo.elf demo.oarm-elf-ld M o demo.elf demo.o如果标准输出设置为显示器,运行命令后将在显示器如果标准输出设置为显示器,运行命令后将在显示器如果标准输出设置为显示器,运行命令后将在显示器如果标准输出设置为显示器,运行命令后将在显示器上显示内存映象信息和符号映象表。上显示内存映象信息和符号映象表。上显示内存映象信息和符号映象表。上显示内存映象信息和符号映象表。 38PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -输出链接信息-Map mapfile-Map mapfile将链接的符号映象表和内存分布信息输出到文件将链接的符号映象表和内存分布信息输出到文件将链接的符号映象表和内存分布信息输出到文件将链接的符号映象表和内存分布信息输出到文件mapfilemapfile里。里。里。里。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,将链接的符号映象表和内存分布信息输,将链接的符号映象表和内存分布信息输,将链接的符号映象表和内存分布信息输,将链接的符号映象表和内存分布信息输出到文件出到文件出到文件出到文件map.txtmap.txt里,命令如下:里,命令如下:里,命令如下:里,命令如下:arm-elf-ld Map map.txt o demo.elf demo.oarm-elf-ld Map map.txt o demo.elf demo.o39PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -指定链接的库出-lar-lar指定库文件指定库文件指定库文件指定库文件libar.alibar.a为链接的库。为链接的库。为链接的库。为链接的库。可以重复使用可以重复使用可以重复使用可以重复使用-l -l来指定多个链接的库。来指定多个链接的库。来指定多个链接的库。来指定多个链接的库。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,指定,指定,指定,指定libxxx.alibxxx.a为链为链为链为链接的库,输出文件为接的库,输出文件为接的库,输出文件为接的库,输出文件为demo.elfdemo.elf,命令如下:,命令如下:,命令如下:,命令如下:arm-elf-ld o demo.elf demo.o lxxxarm-elf-ld o demo.elf demo.o lxxx40PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -添加库和脚本文件的搜索路径-Ldir-Ldir将将将将dirdir添加到搜索路径。添加到搜索路径。添加到搜索路径。添加到搜索路径。例如例如:例如例如例如例如: :链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,将,将,将,将/lib/lib添加到库的搜索路径,命令如下:添加到库的搜索路径,命令如下:添加到库的搜索路径,命令如下:添加到库的搜索路径,命令如下:arm-elf-ld -L./lib o demo.elf demo.o arm-elf-ld -L./lib o demo.elf demo.o 41PPT学习交流l l命令使命令使用用 3.2 交叉连接器交叉连接器arm-elf-ld -设置输出文件的名字-o output-o output将输出文件名字设定为将输出文件名字设定为将输出文件名字设定为将输出文件名字设定为outputoutput。如果不指定输出文件名,。如果不指定输出文件名,。如果不指定输出文件名,。如果不指定输出文件名,arm-elf-ldarm-elf-ld生成文件名默认为生成文件名默认为生成文件名默认为生成文件名默认为a.outa.out。例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,命令如下:,命令如下:,命令如下:,命令如下:arm-elf-ld o demo.elf demo.oarm-elf-ld o demo.elf demo.o42PPT学习交流l llinkcmds连接命令文件连接命令文件3.2 交叉连接器交叉连接器arm-elf-ld -调用linkcmds 首先写一个链接命令文件首先写一个链接命令文件首先写一个链接命令文件首先写一个链接命令文件linkcmdslinkcmds,然后在,然后在,然后在,然后在arm-elf-ldarm-elf-ld的命令中使用的命令中使用的命令中使用的命令中使用-T linkcmds-T linkcmds参数参数参数参数, ,就能在链就能在链就能在链就能在链接时自动调用接时自动调用接时自动调用接时自动调用linkcmdslinkcmds文件文件文件文件例如例如:链接的输入文件为链接的输入文件为链接的输入文件为链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,链接定位文件为,链接定位文件为,链接定位文件为,链接定位文件为linkcmdslinkcmds,则命令如,则命令如,则命令如,则命令如下下下下: :arm-elf-ld T linkcmds o demo.elf demo.oarm-elf-ld T linkcmds o demo.elf demo.o43PPT学习交流l llinkcmds连接命令文件连接命令文件3.2 交叉连接器交叉连接器arm-elf-ld -编写linkcmds arm-elf-ldarm-elf-ld的命令语言是一种描述性的脚本语言,它主的命令语言是一种描述性的脚本语言,它主的命令语言是一种描述性的脚本语言,它主的命令语言是一种描述性的脚本语言,它主要应用于控制要应用于控制要应用于控制要应用于控制: :有哪些输入文件、文件的格式怎样、输出文件有哪些输入文件、文件的格式怎样、输出文件有哪些输入文件、文件的格式怎样、输出文件有哪些输入文件、文件的格式怎样、输出文件中的模块怎样布局、分段的地址空间怎样分布、以及未初始中的模块怎样布局、分段的地址空间怎样分布、以及未初始中的模块怎样布局、分段的地址空间怎样分布、以及未初始中的模块怎样布局、分段的地址空间怎样分布、以及未初始化的数据段怎样处理等。化的数据段怎样处理等。化的数据段怎样处理等。化的数据段怎样处理等。 用命令语言写成的文件用命令语言写成的文件用命令语言写成的文件用命令语言写成的文件( (通常称为通常称为通常称为通常称为linkcmds)linkcmds)具有可重用具有可重用具有可重用具有可重用性性性性, ,不必每次在命令行输入一大堆命令选项不必每次在命令行输入一大堆命令选项不必每次在命令行输入一大堆命令选项不必每次在命令行输入一大堆命令选项. .并且对于不同的并且对于不同的并且对于不同的并且对于不同的应用应用应用应用, ,只需对只需对只需对只需对linkcmdslinkcmds进行简单的修改就可以使用。进行简单的修改就可以使用。进行简单的修改就可以使用。进行简单的修改就可以使用。44PPT学习交流l llinkcmds连接命令文件连接命令文件3.2 交叉连接器交叉连接器arm-elf-ld -编写linkcmds (1)arm-elf-ld (1)arm-elf-ld命令语言命令语言命令语言命令语言(2 2)表达式)表达式)表达式)表达式(3 3)linkcmdslinkcmds的结构的结构的结构的结构(4 4)对程序入口的说明)对程序入口的说明)对程序入口的说明)对程序入口的说明(5 5)对程序头的说明)对程序头的说明)对程序头的说明)对程序头的说明(6 6)对内存布局的说明)对内存布局的说明)对内存布局的说明)对内存布局的说明(7 7)对分段的说明)对分段的说明)对分段的说明)对分段的说明(8 8)注释)注释)注释)注释45PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程46PPT学习交流3.3工程管理器工程管理器 make l l概述概述-命令格式 make -f makefile option targetmake -f makefile option targetmakemake命令后跟命令后跟命令后跟命令后跟-f -f选项,指定选项,指定选项,指定选项,指定makefilemakefile的名字为的名字为的名字为的名字为makefilemakefile;optionoption表示表示表示表示makemake的一些选项的一些选项的一些选项的一些选项;targettarget是是是是makemake指定的目标,在指定的目标,在指定的目标,在指定的目标,在3.4.33.4.3将详细说明。将详细说明。将详细说明。将详细说明。例如例如:makefilemakefile的名字是的名字是的名字是的名字是my_hello_makemy_hello_make:make f my_hello_makemake f my_hello_make47PPT学习交流3.3工程管理器工程管理器 make l l概述概述-命令选项列表-f -f指定指定指定指定makefilemakefile-e-e使环境变量优先于使环境变量优先于使环境变量优先于使环境变量优先于makefilemakefile的变量的变量的变量的变量-I dir-I dir设定搜索目录设定搜索目录设定搜索目录设定搜索目录-i -i忽略忽略忽略忽略makemake过程中所有错误过程中所有错误过程中所有错误过程中所有错误-n-n只显示执行过程,而不真正执行只显示执行过程,而不真正执行只显示执行过程,而不真正执行只显示执行过程,而不真正执行-r -r使隐含规则无效使隐含规则无效使隐含规则无效使隐含规则无效-w-w显示工作目录显示工作目录显示工作目录显示工作目录-C dir-C dir读取读取读取读取makefilemakefile设置的工作目录设置的工作目录设置的工作目录设置的工作目录-s-s不显示执行的命令不显示执行的命令不显示执行的命令不显示执行的命令 48PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-指定makefile-f makefile-f makefile用该选项指定用该选项指定用该选项指定用该选项指定makefilemakefile的名字为的名字为的名字为的名字为makefilemakefile。如果如果如果如果makemake中多次使用中多次使用中多次使用中多次使用-f -f指定多个指定多个指定多个指定多个makefilemakefile,则所有,则所有,则所有,则所有makefilemakefile将链接起来作为最后的将链接起来作为最后的将链接起来作为最后的将链接起来作为最后的makefilemakefile。如果不指定如果不指定如果不指定如果不指定makemake默认的默认的默认的默认的makefilemakefile依次为依次为依次为依次为“ “makefile”makefile”、“ “Makefile”Makefile”。例如例如:make f my_hello_makemake f my_hello_make49PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-指定环境变量优先于makefile 文件中的变量- -e e使环境变量优先于使环境变量优先于使环境变量优先于使环境变量优先于makefilemakefile文件中的变量。文件中的变量。文件中的变量。文件中的变量。例如例如: make emake e50PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-指定包含文件的搜索路径-I dir-I dir指定在解析指定在解析指定在解析指定在解析makefilemakefile文件中的文件中的文件中的文件中的.include.include时的搜索路时的搜索路时的搜索路时的搜索路径为径为径为径为dirdir。如果有多个路径,将按输入顺序依次查找。如果有多个路径,将按输入顺序依次查找。如果有多个路径,将按输入顺序依次查找。如果有多个路径,将按输入顺序依次查找。例如例如: make I/include/mkmake I/include/mk51PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-忽略错误-i -i忽略忽略忽略忽略makemake执行过程中的所有错误。执行过程中的所有错误。执行过程中的所有错误。执行过程中的所有错误。例如例如: make imake i52PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-显示命令的执行过程-n-n只显示命令的执行过程而不真正执行。只显示命令的执行过程而不真正执行。只显示命令的执行过程而不真正执行。只显示命令的执行过程而不真正执行。例如例如: make nmake n53PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-使隐含规则无效 -r -r使使使使makemake的隐含规则无效,清除后缀名规则中默认的后缀清的隐含规则无效,清除后缀名规则中默认的后缀清的隐含规则无效,清除后缀名规则中默认的后缀清的隐含规则无效,清除后缀名规则中默认的后缀清单。单。单。单。例如例如: make rmake r54PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-显示执行过程中的工作目录 -w-w显示显示显示显示makemake执行过程中的工作目录。执行过程中的工作目录。执行过程中的工作目录。执行过程中的工作目录。例如例如: make wmake w55PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-读取makefile文件前设置工作 目录-C dir-C dir在读取在读取在读取在读取makefilemakefile文件以前将工作目录改变为文件以前将工作目录改变为文件以前将工作目录改变为文件以前将工作目录改变为dirdir,完成,完成,完成,完成makemake后改回原来的目录。后改回原来的目录。后改回原来的目录。后改回原来的目录。例如例如: make C bspmake C bsp56PPT学习交流3.3工程管理器工程管理器 make l l命令使用命令使用-不显示所执行的命令-s-s运行运行运行运行makemake时用选项时用选项时用选项时用选项-s-s可以不显示执行的命令,只显示生成可以不显示执行的命令,只显示生成可以不显示执行的命令,只显示生成可以不显示执行的命令,只显示生成的结果文件。的结果文件。的结果文件。的结果文件。例如例如: make smake s57PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -makefile的结构makefilemakefile文件包含:文件包含:文件包含:文件包含: 显式规则显式规则显式规则显式规则 隐含规则隐含规则隐含规则隐含规则 变量定义变量定义变量定义变量定义 指令指令指令指令 注释注释注释注释58PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -编写makefile 中的规则targets targets :dependenciesdependenciescommandcommand或者或者或者或者targets targets :dependencies dependencies ;commandcommandcommandcommand指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名字,名字之间用空格隔开。字,名字之间用空格隔开。字,名字之间用空格隔开。字,名字之间用空格隔开。描述产生描述产生描述产生描述产生targettarget所需的文件,一个所需的文件,一个所需的文件,一个所需的文件,一个targettarget通常依赖于多个通常依赖于多个通常依赖于多个通常依赖于多个dependencydependency。用于指定该规则的命令。用于指定该规则的命令。用于指定该规则的命令。用于指定该规则的命令。59PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile 例如:例如:例如:例如: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 smc.o config.oarm-elf-ar ruvs o smcinit.a smc.o config.o;arm-elf-arm-elf-gcc c o smc.o smc.cgcc 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的文件。的文件。的文件。的文件。 -编写makefile 中的规则60PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -makef调用makefile中的规则在默认情况下,在默认情况下,在默认情况下,在默认情况下,makemake运行不是以运行不是以运行不是以运行不是以“ “.”.”开头的第一条规则。在上面的例子开头的第一条规则。在上面的例子开头的第一条规则。在上面的例子开头的第一条规则。在上面的例子中,中,中,中,makemake默认执行的是规则默认执行的是规则默认执行的是规则默认执行的是规则smcinitsmcinit,此时只需要输入命令:,此时只需要输入命令:,此时只需要输入命令:,此时只需要输入命令: makemakemakemake将读入将读入将读入将读入makefilemakefile,然后执行第一条规则,例子中该规则是链接目标文,然后执行第一条规则,例子中该规则是链接目标文,然后执行第一条规则,例子中该规则是链接目标文,然后执行第一条规则,例子中该规则是链接目标文件生成库,因此必须执行规则件生成库,因此必须执行规则件生成库,因此必须执行规则件生成库,因此必须执行规则smcinitsmcinit依赖的规则依赖的规则依赖的规则依赖的规则smc.osmc.o和和和和config.oconfig.o。在执。在执。在执。在执行过程中将自动更新他们所依赖的文件。行过程中将自动更新他们所依赖的文件。行过程中将自动更新他们所依赖的文件。行过程中将自动更新他们所依赖的文件。有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要有些规则不是被依赖的规则,需要makemake指定才能被运行,如上面的例子中指定才能被运行,如上面的例子中指定才能被运行,如上面的例子中指定才能被运行,如上面的例子中的的的的cleanclean规则可以这样执行:规则可以这样执行:规则可以这样执行:规则可以这样执行:make cleanmake clean这两种方式的结果一样。只是第一种方式没指明目标名,第二种方式指明这两种方式的结果一样。只是第一种方式没指明目标名,第二种方式指明这两种方式的结果一样。只是第一种方式没指明目标名,第二种方式指明这两种方式的结果一样。只是第一种方式没指明目标名,第二种方式指明了目标名。了目标名。了目标名。了目标名。61PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -设置makefile中文件的搜索路径 在在在在makefilemakefile中,可以通过给中,可以通过给中,可以通过给中,可以通过给VPATHVPATH赋值来设置规赋值来设置规赋值来设置规赋值来设置规则中目标文件和依赖文件的搜索目录。则中目标文件和依赖文件的搜索目录。则中目标文件和依赖文件的搜索目录。则中目标文件和依赖文件的搜索目录。makemake首先搜首先搜首先搜首先搜索当前目录,如果未找到依赖的文件,索当前目录,如果未找到依赖的文件,索当前目录,如果未找到依赖的文件,索当前目录,如果未找到依赖的文件,makemake将按照将按照将按照将按照VPATHVPATH中给的目录依次搜索。中给的目录依次搜索。中给的目录依次搜索。中给的目录依次搜索。62PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -如何定义变量在在在在makefilemakefile中变量可以被这样定义:中变量可以被这样定义:中变量可以被这样定义:中变量可以被这样定义:CC = arm-elf-gccCC = arm-elf-gccAS AS := arm-elf -as= arm-elf -asAR = arm-elf -arAR = arm-elf -arLIBPATH LIBPATH := ./lib= ./lib从上面的定义中可以看出,有两种定义变量的形式:从上面的定义中可以看出,有两种定义变量的形式:从上面的定义中可以看出,有两种定义变量的形式:从上面的定义中可以看出,有两种定义变量的形式: 变量名变量名变量名变量名 = = 值值值值 变量名:变量名:变量名:变量名:= = 值值值值 为了简化为了简化为了简化为了简化makefilemakefile以及减少不必要的错误,可以用变以及减少不必要的错误,可以用变以及减少不必要的错误,可以用变以及减少不必要的错误,可以用变量的形式来代表目标文件名或字符串,量的形式来代表目标文件名或字符串,量的形式来代表目标文件名或字符串,量的形式来代表目标文件名或字符串,在需要使用时直接调用变量。在需要使用时直接调用变量。在需要使用时直接调用变量。在需要使用时直接调用变量。63PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -引用变量有两种方式:有两种方式:有两种方式:有两种方式:$VarName$VarName$(VarName)$(VarName) 两种方式的效果一样。两种方式的效果一样。两种方式的效果一样。两种方式的效果一样。VarNameVarName表示变量名。表示变量名。表示变量名。表示变量名。64PPT学习交流3.3工程管理器工程管理器 make l l编写一个编写一个makefile -make提供的常用变量例如:例如:例如:例如:demo.o : demo.c demo.hdemo.o : demo.c demo.h$CC $CFLAGS $ -o $CC $CFLAGS $ -o $的值为的值为的值为的值为demo.cdemo.c,$的值为的值为的值为的值为demo.odemo.o,而而而而$的值为的值为的值为的值为demo.c demo.hdemo.c demo.h。 $表示目标名表示目标名表示目标名表示目标名$ $ 表示所有的依赖文件表示所有的依赖文件表示所有的依赖文件表示所有的依赖文件$ $*.o.c-*.o的的的的隐含规则隐含规则隐含规则隐含规则为:为:为:为:%.o%.o:%.c%.c$CC $CFLAGS $ -o $CC $CFLAGS $*.o.s-*.o的的的的隐含规则隐含规则隐含规则隐含规则为:为:为:为: %.o%.o:%.s%.s$AS $ASFLAGS $ -o $AS $ASFLAGS $ -o $隐含规则是指由隐含规则是指由隐含规则是指由隐含规则是指由makemake自定义的规则自定义的规则自定义的规则自定义的规则, ,常用的有:常用的有:常用的有:常用的有: 由由由由* *.c.c的文件生成的文件生成的文件生成的文件生成* *.o.o的文件的文件的文件的文件 由由由由* *.s.s的文件生成的文件生成的文件生成的文件生成* *.o.o的文件的文件的文件的文件 67PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程68PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l概述概述-命令格式arm-elf-as option asmfilearm-elf-as option asmfile在命令在命令在命令在命令arm-elf-asarm-elf-as后面跟一个或多个选项,以及该后面跟一个或多个选项,以及该后面跟一个或多个选项,以及该后面跟一个或多个选项,以及该选项的子选项,选项间用空格隔开,然后跟汇编源选项的子选项,选项间用空格隔开,然后跟汇编源选项的子选项,选项间用空格隔开,然后跟汇编源选项的子选项,选项间用空格隔开,然后跟汇编源文件名。文件名。文件名。文件名。例如例如:将将将将demo.sdemo.s编译成目标文件,并且设置头文件编译成目标文件,并且设置头文件编译成目标文件,并且设置头文件编译成目标文件,并且设置头文件的搜索目录为的搜索目录为的搜索目录为的搜索目录为C:demoincludeC:demoinclude:arm-elf-as I/c/demo/include demo.sarm-elf-as I/c/demo/include demo.s69PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l概述概述-命令选项列表-adhlns显示arm-elf-as信息-f不进行预处理-Ipath设置头文件搜索路径-o设定输出文件名-v显示版本信息-W不显示警告提示-Z不显示错误提示70PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-生成目标文件每次运行arm-elf-as只输出一个目标文件,默认状态下名字为a.out。可以通过-o选项指定输出文件名字,通常都以.o为后缀。例如例如:编译编译demo.s输出目标文件输出目标文件demo.o:arm-elf-as o demo.o demo.s71PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-设置头文件搜索路径-Ipath添加路径path到arm-elf-as的搜索路径,搜索.include”file”指示的文件。-I可以被使用多次以添加多个目录,当前工作目录将最先被搜索,然后从左到右依次搜索-I指定的目录。例如例如:编译编译demo.s时指定两个搜索目录,当前目录时指定两个搜索目录,当前目录和和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s 72PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-显示arm-elf-as信息内容-adhlns打开arm-elf-as信息显示。dhlns为其子选项,分别表示:d不显示调试信息h显示源码信息l显示汇编列表n不进行格式处理s显示符号列表73PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-设置目标文件名字-Ipath添加路径path到arm-elf-as的搜索路径,搜索.include”file”指示的文件。-I可以被使用多次以添加多个目录,当前工作目录将最先被搜索,然后从左到右依次搜索-I指定的目录。例如例如:编译编译demo.s时指定两个搜索目录,当前目录时指定两个搜索目录,当前目录和和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s 74PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-如何取消警告内容-W加选项-W以后,运行arm-elf-as就不输出警告信息。例如例如:编译编译demo.s输出目标文件输出目标文件demo.o,不输出警,不输出警告信息:告信息:arm-elf-as W o demo.o demo.s 75PPT学习交流3.53.5交叉汇编器交叉汇编器 arm-elf-asarm-elf-asl l命令使用命令使用-设置是否进行预处理arm-elf-as内部的预处理程序,完成以下工作:调整并删除多余空格,删除注释,将字符常量改成对应的数值。例如例如:编译编译demo.s输出目标文件输出目标文件demo.o,并且编译,并且编译时不进行预处理,则命令如下:时不进行预处理,则命令如下:arm-elf-as f o demo.o demo.s 76PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程77PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(1 1)字符集)字符集)字符集)字符集 汇编中使用下列字符组成源程序的各种语法元素:大汇编中使用下列字符组成源程序的各种语法元素:大汇编中使用下列字符组成源程序的各种语法元素:大汇编中使用下列字符组成源程序的各种语法元素:大写字母写字母写字母写字母 A A Z Z;小写字母;小写字母;小写字母;小写字母 a a z z;数字;数字;数字;数字 0 0 9 9;符;符;符;符号号号号 + - * / = ( ) ; , . : $ & # % _ “ - | + - * / = ( ) ; , . : $ & # % _ “ - | ? ! ? !。 其中大小写字母作用不同。其中大小写字母作用不同。其中大小写字母作用不同。其中大小写字母作用不同。78PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(2 2)约定的名字)约定的名字)约定的名字)约定的名字 包括寄存器名、指令名字和伪操作符。每一个伪包括寄存器名、指令名字和伪操作符。每一个伪包括寄存器名、指令名字和伪操作符。每一个伪包括寄存器名、指令名字和伪操作符。每一个伪操作符表示一定功能的操作。操作符表示一定功能的操作。操作符表示一定功能的操作。操作符表示一定功能的操作。79PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(2 2)约定的名字)约定的名字)约定的名字)约定的名字 伪操作符可以分为六类:伪操作符可以分为六类:伪操作符可以分为六类:伪操作符可以分为六类: 数据定义伪操作符数据定义伪操作符数据定义伪操作符数据定义伪操作符 符号定义伪操作符符号定义伪操作符符号定义伪操作符符号定义伪操作符 程序结构伪操作符程序结构伪操作符程序结构伪操作符程序结构伪操作符 条件汇编伪操作符条件汇编伪操作符条件汇编伪操作符条件汇编伪操作符 宏伪操作符宏伪操作符宏伪操作符宏伪操作符 其他伪操作符其他伪操作符其他伪操作符其他伪操作符80PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(3 3)定义的名字)定义的名字)定义的名字)定义的名字 汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。可以定义的名字。可以定义的名字。可以定义的名字。 标号标号标号标号标号只能由标号只能由标号只能由标号只能由a a z z 、A A Z Z、0 0 9 9、_ _等字符组成,标号的长度不受等字符组成,标号的长度不受等字符组成,标号的长度不受等字符组成,标号的长度不受限制限制限制限制, ,大小写字母有区别。大小写字母有区别。大小写字母有区别。大小写字母有区别。81PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(3 3)定义的名字)定义的名字)定义的名字)定义的名字 汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。可以定义的名字。可以定义的名字。可以定义的名字。 分段名分段名分段名分段名汇编系统中预定义的分段名有汇编系统中预定义的分段名有汇编系统中预定义的分段名有汇编系统中预定义的分段名有: .text : .text .bss .data .sdata .sbss .bss .data .sdata .sbss 等,但是用户可以自己等,但是用户可以自己等,但是用户可以自己等,但是用户可以自己定义段名,语法如下:定义段名,语法如下:定义段名,语法如下:定义段名,语法如下:.section section_name attribute.section section_name attribute82PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(3 3)定义的名字)定义的名字)定义的名字)定义的名字 汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。可以定义的名字。可以定义的名字。可以定义的名字。 分段名分段名分段名分段名汇编系统中预定义的分段名有汇编系统中预定义的分段名有汇编系统中预定义的分段名有汇编系统中预定义的分段名有: .text : .text .bss .data .sdata .sbss .bss .data .sdata .sbss 等,但是用户可以自己等,但是用户可以自己等,但是用户可以自己等,但是用户可以自己定义段名,语法如下:定义段名,语法如下:定义段名,语法如下:定义段名,语法如下:.section section_name attribute.section section_name attribute例如:例如:例如:例如:定义一个可以执行的代码段定义一个可以执行的代码段定义一个可以执行的代码段定义一个可以执行的代码段 .mytext.mytext.section .mytext,ax.section .mytext,axmycodemycode83PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(3 3)定义的名字)定义的名字)定义的名字)定义的名字 汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。可以定义的名字。可以定义的名字。可以定义的名字。 宏定义名宏定义名宏定义名宏定义名宏定义的语法如下:宏定义的语法如下:宏定义的语法如下:宏定义的语法如下:.macro macro_name parm1 parmN.macro macro_name parm1 parmNmacro bodymacro body.endm.endm84PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(4 4)常数)常数)常数)常数 二进制数由二进制数由二进制数由二进制数由0b0b或者或者或者或者0B0B开头,如:开头,如:开头,如:开头,如:0b10001010b1000101、 0B10011100B1001110;十六进制数以十六进制数以十六进制数以十六进制数以0x0x或者或者或者或者0X0X开头,如:开头,如:开头,如:开头,如:0x45670x4567、 0X100890X10089;八进制数由八进制数由八进制数由八进制数由0 0开头,如:开头,如:开头,如:开头,如:03450345、0987009870;十进制数以非零数开头,如:十进制数以非零数开头,如:十进制数以非零数开头,如:十进制数以非零数开头,如:345345、129801298085PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(5 5)当前地址数)当前地址数)当前地址数)当前地址数 当前的地址数用点号当前的地址数用点号当前的地址数用点号当前的地址数用点号“ “.”.”表示,在汇编程序中可以直接表示,在汇编程序中可以直接表示,在汇编程序中可以直接表示,在汇编程序中可以直接使用该符号。使用该符号。使用该符号。使用该符号。(6 6)表达式)表达式)表达式)表达式 在汇编程序中可以使用表达式,在表达式中可以使用常在汇编程序中可以使用表达式,在表达式中可以使用常在汇编程序中可以使用表达式,在表达式中可以使用常在汇编程序中可以使用表达式,在表达式中可以使用常数和数值。数和数值。数和数值。数和数值。 可以使用的运算符有:可以使用的运算符有:可以使用的运算符有:可以使用的运算符有: 前缀运算符号前缀运算符号前缀运算符号前缀运算符号- - 取负数取负数取负数取负数 取补数取补数取补数取补数 中缀运算符号中缀运算符号中缀运算符号中缀运算符号* * / % | & / % | & !+ -+ -86PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-基本元素(7 7)注释符号)注释符号)注释符号)注释符号 不同芯片的汇编程序中,注释的符号有所不同,不同芯片的汇编程序中,注释的符号有所不同,不同芯片的汇编程序中,注释的符号有所不同,不同芯片的汇编程序中,注释的符号有所不同,以以以以“ “”开头的程序行是注释行。开头的程序行是注释行。开头的程序行是注释行。开头的程序行是注释行。87PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-语句语句(1 1)语句类型注释符号)语句类型注释符号)语句类型注释符号)语句类型注释符号 汇编语句按其作用和编译的情况分为两大类:汇编语句按其作用和编译的情况分为两大类:汇编语句按其作用和编译的情况分为两大类:汇编语句按其作用和编译的情况分为两大类:执行性语句执行性语句执行性语句执行性语句和和和和说明性语句说明性语句说明性语句说明性语句。88PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-语句语句(2 2)数据语句)数据语句)数据语句)数据语句 一字节数据定义语句一字节数据定义语句一字节数据定义语句一字节数据定义语句两字节数据定义语句两字节数据定义语句两字节数据定义语句两字节数据定义语句四字节数据定义语句四字节数据定义语句四字节数据定义语句四字节数据定义语句八字节数据定义八字节数据定义八字节数据定义八字节数据定义单个字串定义单个字串定义单个字串定义单个字串定义多个字串多个字串多个字串多个字串1 1多个字串多个字串多个字串多个字串2 2重复数据定义重复数据定义重复数据定义重复数据定义89PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-语句语句(3 3)列表控制语句)列表控制语句)列表控制语句)列表控制语句 .title “heading”.title “heading”在汇编列表中将在汇编列表中将在汇编列表中将在汇编列表中将“ “heading“heading“作为标题。作为标题。作为标题。作为标题。.list.list系统遇此语句就输出列表文件。系统遇此语句就输出列表文件。系统遇此语句就输出列表文件。系统遇此语句就输出列表文件。90PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-语句语句(4 4)一般执行语句)一般执行语句)一般执行语句)一般执行语句 不同的芯片有不同指令集,见相关的指令手册。不同的芯片有不同指令集,见相关的指令手册。不同的芯片有不同指令集,见相关的指令手册。不同的芯片有不同指令集,见相关的指令手册。91PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-程序结构程序结构(1 1)程序结构语句)程序结构语句)程序结构语句)程序结构语句 程序结构语句程序结构语句程序结构语句程序结构语句是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。92PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-程序结构程序结构(1 1)程序结构语句)程序结构语句)程序结构语句)程序结构语句 程序结构语句程序结构语句程序结构语句程序结构语句是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程是伪操作符定义的说明语句,用于说明程序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。序段的开始、结束以及源程序的结束等。代码段的开始代码段的开始 .text 数据段的开始数据段的开始数据段的开始数据段的开始 .data.data 源程序的结束源程序的结束源程序的结束源程序的结束 .end.end93PPT学习交流3.6 汇编语言编程汇编语言编程l l汇编语言汇编语言-程序结构程序结构(2 2)过程(函数)的定义)过程(函数)的定义)过程(函数)的定义)过程(函数)的定义过程的结构如下:过程的结构如下:过程的结构如下:过程的结构如下:过程名:过程名:过程名:过程名:过程体过程体过程体过程体返回语句返回语句返回语句返回语句例如:例如:例如:例如:.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,r2r1,r2tsttstr1,#UTXFF1r1,#UTXFF1bnebne1b1bldrldrr2,=UARTDR1r2,=UARTDR1strbstrbr0,r2r0,r2movmovpc,lrpc,lr一般情况下,一般情况下,一般情况下,一般情况下,.type .type 和和和和.align.align声明可以缺省。声明可以缺省。声明可以缺省。声明可以缺省。 94PPT学习交流3.6 汇编语言编程汇编语言编程l l宏语句与条件编程宏语句与条件编程-等价语句等价语句(1 1). .equequ语句语句语句语句语法:语法:语法:语法: .equ symbol.equ symbol,expressionexpression例子:例子:例子:例子: .equ PPC_PC.equ PPC_PC,32*432*4应用:应用:应用:应用: stwstwr4r4,PPC_PC(r1)PPC_PC(r1) (2 2) .set.set语句语句语句语句与与与与.equ.equ的功能相同。的功能相同。的功能相同。的功能相同。 95PPT学习交流3.6 汇编语言编程汇编语言编程l l宏语句与条件编程宏语句与条件编程 -宏定义与宏调用宏定义与宏调用宏定义:宏定义:.macro macro_name param1 ,param2,.paramN.macro body.endm例如:例如:例如:例如:(使用(使用(使用(使用ARMARM的汇编指令集说明)的汇编指令集说明)的汇编指令集说明)的汇编指令集说明).macro ROMSEC_patova TTPA.macro ROMSEC_patova TTPA, pa_startpa_start,va_startva_start,tmptmp,icic ldrldrtmptmp,=APFIELD_ROM=APFIELD_ROMaddaddTTPA,TTPA,va_start,LSR #18TTPA,TTPA,va_start,LSR #18addaddtmptmp,tmptmp,pa_startpa_start20:20:strstrtmptmp,TTPATTPA,#4#4addaddtmptmp,tmptmp,#0x10000#0x10000subssubs icic,icic,#1#1bne bne 20b20b .endm.endm96PPT学习交流3.6 汇编语言编程汇编语言编程l l宏语句与条件编程宏语句与条件编程-重复块和源文件的嵌入重复块和源文件的嵌入(1) 重复块重复块定义:定义:.rept countcontents.endr例如:例如:.rept 2.long 0x12908.endr等价于:等价于:.long 0x12908.long 0x12908(2) 源文件的嵌入源文件的嵌入在一个汇编文件中可以在一个汇编文件中可以嵌入其它汇编文件,嵌入其它汇编文件,例如汇编头文件等。例如汇编头文件等。方法如下:方法如下:.include “”97PPT学习交流3.6 汇编语言编程汇编语言编程l l宏语句与条件编程宏语句与条件编程-条件编译条件编译n.if expression 表达式为非零则编译后面的语句,否则后面的语句被忽略。表达式为非零则编译后面的语句,否则后面的语句被忽略。n.ifdef symbol如果符号被定义则编译后面的语句,否则后面的语句被忽如果符号被定义则编译后面的语句,否则后面的语句被忽略。略。n.ifndef symbol如果符号未被定义则编译后面的语句,否则后面的语句被如果符号未被定义则编译后面的语句,否则后面的语句被忽略。忽略。n.else表示与前面的表示与前面的if语句的条件相反。语句的条件相反。n.endif表示条件判断结束。表示条件判断结束。98PPT学习交流3.6 汇编语言编程汇编语言编程l l宏语句与条件编程宏语句与条件编程-条件编译条件编译例如:例如:.macro sum from=0, to=5 .long from .if to - from sum “(from+1)”,to .endif.endm应用:应用:sum,5等价于等价于.long 0 .long 5条件判断可以嵌套使用,条件判断可以嵌套使用,if-else-endif遵循最近匹配遵循最近匹配的原则。的原则。99PPT学习交流3.6 汇编语言编程汇编语言编程l l模块化程序设计模块化程序设计 -全局符号全局符号 在模块中定义的、要被别的模块使用的在模块中定义的、要被别的模块使用的在模块中定义的、要被别的模块使用的在模块中定义的、要被别的模块使用的符号(包括变量名和函数名)都必须被声明符号(包括变量名和函数名)都必须被声明符号(包括变量名和函数名)都必须被声明符号(包括变量名和函数名)都必须被声明为全局符号。为全局符号。为全局符号。为全局符号。方法如下:方法如下:方法如下:方法如下:.global symbol.global symbol 在本模块中要使用其他模块中的全局符在本模块中要使用其他模块中的全局符在本模块中要使用其他模块中的全局符在本模块中要使用其他模块中的全局符号,可以用号,可以用号,可以用号,可以用.extern symbol.extern symbol的方式声明,但的方式声明,但的方式声明,但的方式声明,但也可以不用声明在汇编时自动认为它是其它也可以不用声明在汇编时自动认为它是其它也可以不用声明在汇编时自动认为它是其它也可以不用声明在汇编时自动认为它是其它模块中的全局符号。模块中的全局符号。模块中的全局符号。模块中的全局符号。100PPT学习交流3.6 汇编语言编程汇编语言编程l l模块化程序设计模块化程序设计 -模块间的符号互用模块间的符号互用 (1)汇编模块与汇编模块间的调用)汇编模块与汇编模块间的调用(2)汇编模块调用)汇编模块调用C语言模块中的函数语言模块中的函数(3)汇编模块使用)汇编模块使用C语言模块中的变量语言模块中的变量(4)C语言模块调用汇编模块中的函数语言模块调用汇编模块中的函数 (5)C语言模块使用汇编模块中的变量语言模块使用汇编模块中的变量101PPT学习交流3.6 汇编语言编程汇编语言编程l l内存模式内存模式 在在 uClinux 环境下,内存模式为平模式,环境下,内存模式为平模式,即整个内存空间最大为即整个内存空间最大为4GB。所有任务共享这所有任务共享这4GB的空间,而不是每个任务的空间,而不是每个任务有单独的有单独的4G虚拟空间。虚拟空间。所有的寻址都是所有的寻址都是32位地址的方式,因此程序位地址的方式,因此程序模块间可以很容易的共享变量和数据。模块间可以很容易的共享变量和数据。102PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -寄存器名字寄存器名字类型类型说说 明明r0r14r14通用寄存器通用寄存器f0f7f7浮点寄存器浮点寄存器pc指令指针指令指针ps机器状态寄存器机器状态寄存器fps浮点状态寄存器浮点状态寄存器103PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -如何在汇编模块中调如何在汇编模块中调如何在汇编模块中调如何在汇编模块中调用用用用C C语言模块中的函数语言模块中的函数语言模块中的函数语言模块中的函数在调用在调用C函数之前,必须在当前栈中空函数之前,必须在当前栈中空出至少出至少8个字节的空间,然后才调用个字节的空间,然后才调用C函数。函数。C函数的第一个参数(最左边的参数)用函数的第一个参数(最左边的参数)用r0传传递,后面的参数依次用递,后面的参数依次用r1、r2等来传递。等来传递。例如:例如:假定假定假定假定C C函数为函数为函数为函数为int get_sum (int var1,int var2),int get_sum (int var1,int var2),则在汇编程序中首先将参数送到则在汇编程序中首先将参数送到则在汇编程序中首先将参数送到则在汇编程序中首先将参数送到r0r0、r1r1中,然后中,然后中,然后中,然后将栈指针减将栈指针减将栈指针减将栈指针减8 8,最后调用,最后调用,最后调用,最后调用get_sumget_sum。注意注意:C C函数名在汇编中使用时不用加下划线函数名在汇编中使用时不用加下划线函数名在汇编中使用时不用加下划线函数名在汇编中使用时不用加下划线104PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -注释符号注释符号注释符号注释符号以以“”开头的程序行是注释行。开头的程序行是注释行。105PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -一般程序一般程序一般程序一般程序.title “example”.title “example”.data.data.global var1.global var1var1:var1:.long 0x897678 ,0x2378789.long 0x897678 ,0x2378789.byte 89 ,56, 23.byte 89 ,56, 23.string “ hello”.string “ hello”.bss.bss.global zero_var.global zero_varzero_var:zero_var:.short 0,0,0.short 0,0,0.long 0,0,0,0.long 0,0,0,0106PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -一般程序一般程序一般程序一般程序.text.textUART1INIT_TEST:UART1INIT_TEST:ldr r3,=SYSCON1ldr r3,=SYSCON1ldr r0,r3ldr r0,r3tst r0,#UART1ENtst r0,#UART1ENbeq 2fbeq 2f1:1:ldr r1,r3ldr r1,r3tst r1,#UTXFF1tst r1,#UTXFF1bne 1bbne 1b2:2:bic r0,r0,#UART1ENbic r0,r0,#UART1ENstr r0,r3str r0,r3bic r0,r0,#SIRENbic r0,r0,#SIREN107PPT学习交流3.6 汇编语言编程汇编语言编程l lStrongARM&ARM7 -一般程序一般程序一般程序一般程序str r0,r3str r0,r3orr r0,r0,#UART1ENorr r0,r0,#UART1ENstr r0,r3str r0,r3ldr r3,=SYSFLG2ldr r3,=SYSFLG2ldr r0,r3ldr r0,r3and r0,r0,#0x40and r0,r0,#0x40mov pc,lrmov pc,lr.section “.mytext” , “ax”.section “.mytext” , “ax”.global u1b_set.global u1b_setu1b_set:u1b_set:ldr r3,=UBLCR1ldr r3,=UBLCR1str r0,r3str r0,r3mov pc,lrmov pc,lr.end.end108PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程109PPT学习交流3.7简单程序设计简单程序设计l l顺序程序设计顺序程序设计 例例3-1 用用用用ARMARM指令实现的指令实现的指令实现的指令实现的C C赋值语句:赋值语句:赋值语句:赋值语句:x=(a+b)-cx=(a+b)-c 可以用可以用可以用可以用r0r0表示表示表示表示a a、rl rl表示表示表示表示b b、r2r2表示表示表示表示c c和和和和r3r3表示表示表示表示x x,用用用用r4r4作为间接寻址寄存器。作为间接寻址寄存器。作为间接寻址寄存器。作为间接寻址寄存器。ADR r4,aADR r4,a;读取变量;读取变量;读取变量;读取变量 a a 的地址的地址的地址的地址LDR r0,r4LDR r0,r4;读;读;读;读a a的内容到的内容到的内容到的内容到 r0r0ADR r4,bADR r4,b;读取变量;读取变量;读取变量;读取变量b b的地址的地址的地址的地址LDR rl,r4 LDR rl,r4 ;读;读;读;读b b内容到内容到内容到内容到 r1r1ADD r3,r0,rlADD r3,r0,rl;a+b a+b 的结果保存在的结果保存在的结果保存在的结果保存在r3r3ADR r4,cADR r4,c;读取变量;读取变量;读取变量;读取变量c c的地址的地址的地址的地址LDR r2,r4LDR r2,r4;读;读;读;读c c的内容到的内容到的内容到的内容到r2r2SUB r3,r3,r2SUB r3,r3,r2 ;(a+b)-c(a+b)-c结果保存到结果保存到结果保存到结果保存到r3r3ADR r4,xADR r4,x;读;读;读;读x x的地址的地址的地址的地址STR r3,r4 STR r3,r4 ;保存变量;保存变量;保存变量;保存变量x x110PPT学习交流3.7简单程序设计简单程序设计l l顺序程序设计顺序程序设计 例例3-2 用用ARM指令实现的指令实现的C赋值语句:赋值语句:z=(a2)|(b&15)可以使用可以使用r0表示表示a和和z,r1表示表示b,r4表示地址进行编码表示地址进行编码 ADR r4,a ;读取变量;读取变量a的地址到的地址到r4 LDR r0,r4 ;读;读a的内容到的内容到r0 MOV r0,r0,LSL 2 ;实现;实现a2 操作,结果保存在操作,结果保存在r0 ADR r4,b ;读取变量;读取变量b的地址到的地址到r4 LDR rl,r4 ;读;读b的内容到的内容到r1 AND r1,r1,#15 ;实现;实现b&15 操作,结果保存在操作,结果保存在r1中中 ORR rl,r0,rl ;计算;计算z的结果的结果 ADR r4,z ;读取变量;读取变量z的地址到的地址到r4 STR rl,r4 ;保存变量;保存变量z 111PPT学习交流3.7简单程序设计简单程序设计l l分支程序设计分支程序设计 例例3-3在在在在ARMARM中实现下面中实现下面中实现下面中实现下面if if语句:语句:语句:语句: if(ab)if(ab) x=5 x=5; y=c+dy=c+d: else x=c-d else x=c-d; 实实现现上上述述指指令令的的第第一一种种方方法法比比较较传传统统并并且且和和其其他他微微处处理理器器相相似似。下下列列指指令令使使用用条条件件分分支支和无条件数据操作:和无条件数据操作:112PPT学习交流3.7简单程序设计简单程序设计l l分支程序设计分支程序设计 例例3-4在在在在ARMARM中实现中实现中实现中实现C C的的的的switchswitch语句语句语句语句 C C中的中的中的中的switchswitch语句采语句采语句采语句采用下列形式:用下列形式:用下列形式:用下列形式: switch(test)switch(test) case 0 case 0:breakbreak; case 1case 1:breakbreak; 上上述述语语句句也也可可以以像像if语语句句那那样样编编码码,首首先先测测试试test=A,然后测试,然后测试test=B,依此类推,依此类推.113PPT学习交流3.7简单程序设计简单程序设计l l循环程序设计循环程序设计 例例3-5用用用用ARMARM指令实现指令实现指令实现指令实现FIRFIR过滤器过滤器过滤器过滤器FIR(finite impulser response)FIR(finite impulser response)过滤器是一种处理信号的常用过滤器是一种处理信号的常用过滤器是一种处理信号的常用过滤器是一种处理信号的常用方法;方法;方法;方法;FIRFIR过滤器是简单的对积求和:过滤器是简单的对积求和:过滤器是简单的对积求和:过滤器是简单的对积求和: cixicixi 1in 1in作为过滤器使用时,作为过滤器使用时,作为过滤器使用时,作为过滤器使用时,xixi假定为周期性采集的数据样品,假定为周期性采集的数据样品,假定为周期性采集的数据样品,假定为周期性采集的数据样品,cici是系是系是系是系数。数。数。数。114PPT学习交流 这种表示假定样品是周期性采集而来的,每次一个这种表示假定样品是周期性采集而来的,每次一个新的样品到来都要重新计算一次新的样品到来都要重新计算一次FIR过滤器的输出。过滤器的输出。 方框表示存储刚刚到来的样品产生方框表示存储刚刚到来的样品产生xi时延元素。时延元素。延迟的样品分别单独与延迟的样品分别单独与c相乘相乘,然后求和得到过滤器的输出然后求和得到过滤器的输出fc1c2c3c4x1x2x3x4115PPT学习交流3.7简单程序设计简单程序设计l l子程序设计子程序设计 每个每个每个每个C C函数返回一个值函数返回一个值函数返回一个值函数返回一个值( (除非它的返回类型是除非它的返回类型是除非它的返回类型是除非它的返回类型是void)void);一般把不返回值的结构称为;一般把不返回值的结构称为;一般把不返回值的结构称为;一般把不返回值的结构称为子例程子例程子例程子例程或或或或过程过程过程过程。116PPT学习交流第第 3 3章章 目录目录1GNUGCC简介2C/C+交叉编译器arm-elf-gcc3交叉连接器arm-elf-ld4工程管理器MAKE5交叉汇编器arm-elf-as6汇编语言编程7简单程序设计8混合语言编程117PPT学习交流3.8混合语言编程混合语言编程汇编语言与汇编语言与C/C+的混合编程通常有以下几的混合编程通常有以下几种方式:种方式:1.在在C/C+代码中嵌入汇编指令;代码中嵌入汇编指令;2.在汇编程序和在汇编程序和C/C+的程序之间进行变量的的程序之间进行变量的互访;互访;3.汇编程序、汇编程序、C/C+程序间的相互调用。程序间的相互调用。118PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法_asm _asm 指令指令指令指令; ;指令指令指令指令 * *注释注释注释注释* * 指令指令指令指令 119PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法例例3-6 使能禁能使能禁能IRQ中断中断 _inline void enable_IRQ(void) int tmp; _asm /嵌入汇编代码嵌入汇编代码 MRS tmp,CPSR /读取读取CPSR的值的值 BIC tmp,tmp,#0x80 MSR CPSR_c,tmp 120PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法内嵌汇编的语法例例3-6 使能禁能使能禁能IRQ中断中断 _inline void disable_IRQ(vold) int tmp;_asm MRS tmp,CPSR ORR tmp,tmp,#0x80 MSR CPSR_c,tmp 121PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法(1) (1) 操作数操作数操作数操作数内嵌的汇编指令中作为操作数的寄存器和常量可以是内嵌的汇编指令中作为操作数的寄存器和常量可以是内嵌的汇编指令中作为操作数的寄存器和常量可以是内嵌的汇编指令中作为操作数的寄存器和常量可以是C C表表表表达式。达式。达式。达式。(2) (2) 物理寄存器物理寄存器物理寄存器物理寄存器 内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下内嵌汇编中使用物理寄存器有以下限制限制限制限制:uu不能直接向不能直接向不能直接向不能直接向PCPC寄存器赋值寄存器赋值寄存器赋值寄存器赋值uu使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的C C表达式。表达式。表达式。表达式。uu编译器可能会使用编译器可能会使用编译器可能会使用编译器可能会使用R12R12或或或或R13R13存放编译的中间结果存放编译的中间结果存放编译的中间结果存放编译的中间结果uu通常内嵌的汇编指令中不要指定物理寄存器,通常内嵌的汇编指令中不要指定物理寄存器,通常内嵌的汇编指令中不要指定物理寄存器,通常内嵌的汇编指令中不要指定物理寄存器,122PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法(3) (3) 常量。在内嵌汇编指令中,常量前面的常量。在内嵌汇编指令中,常量前面的常量。在内嵌汇编指令中,常量前面的常量。在内嵌汇编指令中,常量前面的“ “#”#”可以省可以省可以省可以省略。略。略。略。( (4) 4) 指令展开。内嵌的汇编指令中,如果包含常量操作数,指令展开。内嵌的汇编指令中,如果包含常量操作数,指令展开。内嵌的汇编指令中,如果包含常量操作数,指令展开。内嵌的汇编指令中,如果包含常量操作数,则该指令有可能被内嵌汇编器展开成几条指令。则该指令有可能被内嵌汇编器展开成几条指令。则该指令有可能被内嵌汇编器展开成几条指令。则该指令有可能被内嵌汇编器展开成几条指令。(5) (5) 标号。标号。标号。标号。C C程序中的标号可以被内嵌的汇编指令使用。程序中的标号可以被内嵌的汇编指令使用。程序中的标号可以被内嵌的汇编指令使用。程序中的标号可以被内嵌的汇编指令使用。但是只有指令但是只有指令但是只有指令但是只有指令B B可以使用可以使用可以使用可以使用C C程序中的标号,而指令程序中的标号,而指令程序中的标号,而指令程序中的标号,而指令BLBL则不则不则不则不能使用。能使用。能使用。能使用。123PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法(6) (6) 内存单元的分配。内存单元的分配。内存单元的分配。内存单元的分配。 所有的内存分配均由所有的内存分配均由所有的内存分配均由所有的内存分配均由C C编译器完成,分配的编译器完成,分配的编译器完成,分配的编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌汇编内存单元通过变量供内嵌汇编器使用。内嵌汇编内存单元通过变量供内嵌汇编器使用。内嵌汇编内存单元通过变量供内嵌汇编器使用。内嵌汇编器不支持内嵌汇编程序中用于内存分配的伪指令。器不支持内嵌汇编程序中用于内存分配的伪指令。器不支持内嵌汇编程序中用于内存分配的伪指令。器不支持内嵌汇编程序中用于内存分配的伪指令。124PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法内嵌汇编的指令用法(7)SWI(7)SWI和和和和BLBL指令。指令。指令。指令。 在内嵌的在内嵌的在内嵌的在内嵌的SWISWI和和和和BLBL指令中,除了正常的操作数域外,指令中,除了正常的操作数域外,指令中,除了正常的操作数域外,指令中,除了正常的操作数域外,还必须增加以下还必须增加以下还必须增加以下还必须增加以下3 3个可选的寄存器列表:个可选的寄存器列表:个可选的寄存器列表:个可选的寄存器列表: 第第第第1 1个寄存器列表中的寄存器用于输入的参数。个寄存器列表中的寄存器用于输入的参数。个寄存器列表中的寄存器用于输入的参数。个寄存器列表中的寄存器用于输入的参数。第第第第2 2个寄存器列表中的寄存器用于存储返回的结果。个寄存器列表中的寄存器用于存储返回的结果。个寄存器列表中的寄存器用于存储返回的结果。个寄存器列表中的寄存器用于存储返回的结果。第第第第3 3个寄存器列表中的寄存器的内容可能被被调用的子程个寄存器列表中的寄存器的内容可能被被调用的子程个寄存器列表中的寄存器的内容可能被被调用的子程个寄存器列表中的寄存器的内容可能被被调用的子程序破坏,即这些寄存器是供被调用的子程序作为工作序破坏,即这些寄存器是供被调用的子程序作为工作序破坏,即这些寄存器是供被调用的子程序作为工作序破坏,即这些寄存器是供被调用的子程序作为工作寄存器。寄存器。寄存器。寄存器。 125PPT学习交流l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 3.8混合语言编程混合语言编程- - 内嵌汇编器与内嵌汇编器与内嵌汇编器与内嵌汇编器与armasmarmasm汇编器的差异汇编器的差异汇编器的差异汇编器的差异内嵌汇编器不支持通过内嵌汇编器不支持通过内嵌汇编器不支持通过内嵌汇编器不支持通过“ “.”.”指示符或指示符或指示符或指示符或PCPC获取当前指令获取当前指令获取当前指令获取当前指令地址地址地址地址不支持不支持不支持不支持“ “LDR RnLDR Rn,expr”expr”伪指令,而使用伪指令,而使用伪指令,而使用伪指令,而使用“ “MOV RnMOV Rn,expr”expr”指令向寄存器赋值;指令向寄存器赋值;指令向寄存器赋值;指令向寄存器赋值;不支持标号表达式;不支持不支持标号表达式;不支持不支持标号表达式;不支持不支持标号表达式;不支持ADRADR和和和和ADRLADRL伪指令;伪指令;伪指令;伪指令;不支持不支持不支持不支持BXBX指令;不能向指令;不能向指令;不能向指令;不能向PCPC赋值。赋值。赋值。赋值。使用使用使用使用0x0x前缀代替前缀代替前缀代替前缀代替“ “&”&”,表示十六进制数,表示十六进制数,表示十六进制数,表示十六进制数。当使用当使用当使用当使用8 8位移位常数导致位移位常数导致位移位常数导致位移位常数导致CPSRCPSR的的的的ALUALU标志更新时,标志更新时,标志更新时,标志更新时,N N、Z Z、C C和和和和V V标志中的标志中的标志中的标志中的C C不具有真实意义。不具有真实意义。不具有真实意义。不具有真实意义。126PPT学习交流3.8混合语言编程混合语言编程l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 - - 内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项(1)必须小心使用物理寄存器必须小心使用物理寄存器.如如R0R3、PC、LR和和CPSR中的中的N、Z、C和和V标志位标志位,因为因为计算汇编代码中的计算汇编代码中的C表达式时表达式时,可能会使用这些物理寄存器可能会使用这些物理寄存器,并会并会修改修改N、Z、C和和V 标志位。标志位。例如:例如: _asm MOV var,x ADD y,var,x/y 计算计算x/y时时R0会被修改。内嵌汇编器探测到隐含的寄存器会被修改。内嵌汇编器探测到隐含的寄存器冲突就会报错。冲突就会报错。127PPT学习交流3.8混合语言编程混合语言编程l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 - - 内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项(2)不要使用寄存器代替变量。)不要使用寄存器代替变量。例如:例如: int bad_f(int x) / x存放在存放在R0中中 _asm ADD R0,R0,#1 /发生寄存器冲突,实际上发生寄存器冲突,实际上x的值没有变化的值没有变化 return(x); 尽管根据编译器的编译规则似乎可以确定尽管根据编译器的编译规则似乎可以确定尽管根据编译器的编译规则似乎可以确定尽管根据编译器的编译规则似乎可以确定R0R0对应对应对应对应x x,但这样的代码会使内嵌汇编器认为发生了寄存器冲,但这样的代码会使内嵌汇编器认为发生了寄存器冲,但这样的代码会使内嵌汇编器认为发生了寄存器冲,但这样的代码会使内嵌汇编器认为发生了寄存器冲突。突。突。突。128PPT学习交流3.8混合语言编程混合语言编程l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 - - 内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项(4)LDM和和STM指令的寄存器列表中只允许指令的寄存器列表中只允许使用物理寄存器。使用物理寄存器。内嵌汇编可以修改处理器模式、协处理器模式以及内嵌汇编可以修改处理器模式、协处理器模式以及FP、SL、SB等等APCS寄存器。但是编译器在编译时并不了解这些变寄存器。但是编译器在编译时并不了解这些变化,因此必须保证在执行化,因此必须保证在执行C代码前恢复相应被修改的处理器模式。代码前恢复相应被修改的处理器模式。129PPT学习交流3.8混合语言编程混合语言编程l l如何在如何在C语言内嵌汇编语言语言内嵌汇编语言 - - 内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项内嵌汇编注意事项(5) 汇编语言中的汇编语言中的“,”号作为操作数分隔号作为操作数分隔符。符。如果有如果有C表达式作为操作数,若表达式中包含有表达式作为操作数,若表达式中包含有“,”,则必则必 须使用符号须使用符号“(”和和“)”将其归约为一个汇编操作数。将其归约为一个汇编操作数。例如:例如:_asm ADD x,y,(f(),z) /“f(),z”为一个带有为一个带有“,”的的C表达式表达式 130PPT学习交流小结 在本章中,主要介绍了关于,GCC编译过程,编译工具,汇编语言编程及C语言和汇编语言混合编程等问题131PPT学习交流
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号