




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 基于s3c44B0X嵌入式uCLinux系统原理及运用主讲人:李岩哈尔滨理工大学计算机学院.本章主要内容:(1)GCC编译过程(2)C/C+交叉编译器arm-elf-gcc(3)交叉汇编器 arm-elf-as (4)交叉衔接器arm-elf-l d(5)工程管理器make(6)汇编言语编程(7)混合编程. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程. 第 3 章 目录1 GNU GCC简介2
2、C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.1 GNU GCC简介 GNU集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种编程言语、支持多种CPU的交叉编译工具。 输出预处置后的C/C+源程序展开头文件和交换宏输出C/C+源程序的汇编代码输出二进制目的文件生成静态库生成可执行程序转换文件格式GNU GCC的根本功能.3.1 GNU GCC简介GCC组成-C/C+交叉编译器arm-elf
3、-gcc arm-elf-gcc是编译的前端程序,它经过调用其他程序来实现将程序源文件编译成目的文件的功能。 arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。.3.1 GNU GCC简介GCC组成-汇编器 arm-elf-as arm-elf-as将汇编言语程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目的代码,这些目的代码同其它目的模块或函数库易于定位和链接。阐明:arm-elf-as产生一个交叉参考表和一个规范的符号表,产生的代码和数据可以放在多个区 (Section)中。.3.1
4、 GNU GCC简介GCC组成-衔接器arm-elf-ld arm-elf-gcc是编译的前端程序,arm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目的模块链接成一个单一的、绝对定位的目的程序。.3.1 GNU GCC简介GCC组成-库管理器arm-elf-ar arm-elf-ar将多个可重定位的目标模块归档为一个函数库文件。.3.1 GNU GCC简介GCC组成-工程管理器MAKE arm-elf-gcc Make是用于自动编译、链接程序的适用工具,运用make后就不需求手工的编译每个程序文件。要运用make,首先要编写make
5、file。 Makefile描画程序文件之间的依赖关系,并提供更新文件的命令。.3.1 GNU GCC简介GCC组成-其他适用程序 arm-elf-objcopy目的文件格式转换工具等;.3.1 GNU GCC简介GCC编译程序的根本过程 arm-elf-gcc根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项包括优化选项、调试信息选项等将其编译成相应的汇编暂时文件后缀为.s; arm-elf-as将该汇编文件编译成目的文件后缀为.o; arm-elf-ld 根据用户的链接选项包括指定链接命令文件等将目的文件和各种库链接起来生成可执行文件。程序的编译过程.C/C+源文件Arm-elf-
6、gcc头文件汇编文件Arm-elf-as目的文件源文件列表生成库衔接命令文件可重定位模块Arm-eif-ldArm-elf-ar用户库库列表可执行程序. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 3.1 需求分析4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.概述3.2 C/C+交叉编译器arm-elf-gcc-命令格式 arm-elf-gcc options file在命令arm-elf-gcc后面跟一个或多个选项,选项间用空格隔开,然后跟一个或多个目的文
7、件。例如,将test.c 编译成目的文件test.o 并且生成调试信息: arm-elf-gcc g c o test.o test.c .概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-c 将输入的源文件编译成目的文件-S 将C/C+文件生成汇编文件-o file 将输出内容存于文件file-pipe 在编译的不同阶段之间采用管道通讯方式-v 打印出编译过程中执行的命令-x language阐明文件的输入类型为language输出控制选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-ansi 支持一切ANSI C程序C言语选项:.概述3.2 C/
8、C+交叉编译器arm-elf-gcc-命令选项列表-w 封锁一切警告-Wall 翻开一切警告-Wimplicit 假设有隐含声明,显示警告信息-Wno-implicit 不显示对隐含声明的警告警告选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-g 在文件中产生调试信息(调试信息的文件格式有stabs、COFF、XCOFF、DWARF)调试选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-O0 不优化-O1 一级优化-O2 二级优化-O3 三级优化优化选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-E 运转C的预处
9、置器-C 在运用-E进展预处置时不去掉注释-D macro 定义宏macro为1-D macro=defn 定义宏macro为defn预处置选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-Wa,option 将选项option传送 给汇编器汇编选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-命令选项列表-I dir 设置搜索途径为dir-I- 指定只对 #include “file,有效的头文件搜索目录 搜索途径选项:.概述3.2 C/C+交叉编译器arm-elf-gcc-源文件类型的识别*.c C源文件*.i 经过预处置后的C源文件*.h C头文件*
10、.ii 经过预处置后的C+源文件*.cc C+源文件*.cxx C+源文件*.cpp C+源文件*.CC+源文件*.s 不需求预处置的汇编文件*.S需求预处置的汇编文件arm-elf-gcc可以自动根据文件名后缀识别文件类型.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如,将test.c编译成汇编程序并存放于文件test.txt:arm-elf-gcc S o test.txt test.c -o file将输出内容存于文件file,仅适用于只需一个输出文件时。-输出文件名的指定.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如, 将test.c编译成test.o:a
11、rm-elf-gcc c o test.o test.c -c将输入的源文件编译成目的文件。-目的文件的生成.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如,将test.c编译生成汇编文件test.s:arm-elf-gcc S o test.s test.c -S将C/C+文件生成汇编文件。-将C/C+文件生成汇编文件.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如,对test.c进展预处置并将结果输出到屏幕:arm-elf-gcc E test.c -E只对源文件进展预处置并且缺省输出到规范输出。-预处置文件的生成.命令运用3.2 C/C+交叉编译器arm-el
12、f-gcc头文件的援用有两种方式: 一种是# include“filename, 一种是# include 。前一种方式的途径搜索顺序是:当前目录、指定的搜索途径;后一种方式只搜索指定途径。-I dir 将目录dir添加到头文件搜索目录列表的第一项。-I- -I-以前用-I指定的头文件搜索目录只对 # include“file 有效,对 # include 无效; -I-以后指定的头文件搜索目录对以上两种方式的头文件都有效。-设置头文件搜索途径.命令运用3.2 C/C+交叉编译器arm-elf-gcc头文件的援用有两种方式: 一种是# include“filename, 一种是# includ
13、e 。前一种方式的途径搜索顺序是:当前目录、指定的搜索途径;后一种方式只搜索指定途径。-I dir-I-设置头文件搜索途径例如,编译test.c,在当前目录和/include中搜索test.c所包含的头文件: arm-elf-gcc I ./ I/include c test.c.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如,假设有隐含声明,显示警告信息:arm-elf-gcc c Wimplicit test.c不显示对隐含声明的警告:arm-elf-gcc c Wnoimplicit test.c常用的警告选项有:-w 封锁一切警告信息。-Wall 翻开一切警告信息。 可以
14、运用以-W开头的不同选项对特定警告进展设定。对于每种警告类型都有相应以-Wno-开场的选项封锁警告。-控制警告产生.命令运用3.2 C/C+交叉编译器arm-elf-gcc-O1 可以部分减小代码尺寸,对运转速度有一定的提高。较多地运用了存放器变量,提高指令的并行度。-O2 除了解循环、函数插装和静态变量优化,几乎包含arm-elf-gcc一切优化选项。普通在生成固化代码时运用该选项较为适宜。-O3 包含-O2的一切优化,并且还包含了解循环、函数插装和静态变量优化。通常情况下,该级优化生成的代码执行速度最快,但是代码尺寸比-O2大一些。 arm-elf-gcc支持多种优化选项,总体上划分为三级
15、优化:-实现优化.命令运用3.2 C/C+交叉编译器arm-elf-gcc例如:编译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-D macro定义宏macro为1。-D macro=defn 定义宏macro为defn。-在命令行定义. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5 交叉汇编器
16、 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.概述3.2 交叉衔接器arm-elf-ld -命令格式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.2 交叉衔接器arm-elf-ld -命令选项列表-e entry指定程序入口-
17、M输出链接信息-lar指定链接库-L dir添加搜索途径-o设置输出文件名-Tcommandfile指定链接命令文件-v显示版本信息-Map制定输出映像文件.命令运用 3.2 交叉衔接器arm-elf-ld -程序入口地址-e entry以符号entry作为程序执行的入口地址,而不从默许的入口地址开场。例如:链接的输入文件为demo.o,输出文件为demo.elf,链接定位文件为linkcmds,将入口地址设为_start,命令如下:arm-elf-ld T linkcmds e _start o demo.elf demo.o.命令运用 3.2 交叉衔接器arm-elf-ld -输出链接信息
18、-M在规范端口打印出符号映象表和内存分布信息。例如:链接的输入文件为demo.o,输出文件为demo.elf,在规范端口打印出符号映象表和内存分布信息,命令如下:arm-elf-ld M o demo.elf demo.o假设规范输出设置为显示器,运转命令后将在显示器上显示内存映象信息和符号映象表。 .命令运用 3.2 交叉衔接器arm-elf-ld -输出链接信息-Map mapfile将链接的符号映象表和内存分布信息输出到文件mapfile里。例如:链接的输入文件为demo.o,输出文件为demo.elf,将链接的符号映象表和内存分布信息输出到文件map.txt里,命令如下:arm-elf
19、-ld Map map.txt o demo.elf demo.o.命令运用 3.2 交叉衔接器arm-elf-ld -指定链接的库出-lar指定库文件libar.a为链接的库。可以反复运用-l来指定多个链接的库。例如:链接的输入文件为demo.o,指定libxxx.a为链接的库,输出文件为demo.elf,命令如下:arm-elf-ld o demo.elf demo.o lxxx.命令运用 3.2 交叉衔接器arm-elf-ld -添加库和脚本文件的搜索途径-Ldir将dir添加到搜索途径。例如:例如:链接的输入文件为demo.o,输出文件为demo.elf,将/lib添加到库的搜索途径,
20、命令如下:arm-elf-ld -L./lib o demo.elf demo.o .命令运用 3.2 交叉衔接器arm-elf-ld -设置输出文件的名字-o output将输出文件名字设定为output。假设不指定输出文件名,arm-elf-ld生成文件名默以为a.out。例如:链接的输入文件为demo.o,输出文件为demo.elf,命令如下:arm-elf-ld o demo.elf demo.o.linkcmds衔接命令文件3.2 交叉衔接器arm-elf-ld -调用linkcmds 首先写一个链接命令文件linkcmds,然后在arm-elf-ld的命令中运用-T linkcmd
21、s参数,就能在链接时自动调用linkcmds文件例如:链接的输入文件为demo.o,输出文件为demo.elf,链接定位文件为linkcmds,那么命令如下:arm-elf-ld T linkcmds o demo.elf demo.o.linkcmds衔接命令文件3.2 交叉衔接器arm-elf-ld -编写linkcmds arm-elf-ld的命令言语是一种描画性的脚本言语,它主要运用于控制:有哪些输入文件、文件的格式怎样、输出文件中的模块怎样规划、分段的地址空间怎样分布、以及未初始化的数据段怎样处置等。 用命令言语写成的文件(通常称为linkcmds)具有可重用性,不用每次在命令行输入
22、一大堆命令选项.并且对于不同的运用,只需对linkcmds进展简单的修正就可以运用。.linkcmds衔接命令文件3.2 交叉衔接器arm-elf-ld -编写linkcmds (1)arm-elf-ld命令言语2表达式3linkcmds的构造4对程序入口的阐明5对程序头的阐明6对内存规划的阐明7对分段的阐明8注释. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.3工程管理器 make 概述-命令格式 make
23、 -f makefile option targetmake命令后跟-f选项,指定makefile的名字为makefile;option表示make的一些选项;target是make指定的目的,在3.4.3将详细阐明。例如:makefile的名字是my_hello_make:make f my_hello_make.3.3工程管理器 make 概述-命令选项列表-f指定makefile-e使环境变量优先于makefile的变量-I dir设定搜索目录-i忽略make过程中一切错误-n只显示执行过程,而不真正执行-r使隐含规那么无效-w显示任务目录-C dir读取makefile设置的任务目录-
24、s不显示执行的命令 .3.3工程管理器 make 命令运用-指定makefile-f makefile用该选项指定makefile的名字为makefile。假设make中多次运用-f指定多个makefile,那么一切makefile将链接起来作为最后的makefile。假设不指定makefile,make默许的makefile依次为“makefile、“Makefile。例如:make f my_hello_make.3.3工程管理器 make 命令运用-指定环境变量优先于makefile 文件中的变量-e使环境变量优先于makefile文件中的变量。例如: make e.3.3工程管理器 m
25、ake 命令运用-指定包含文件的搜索途径-I dir指定在解析makefile文件中的.include时的搜索途径为dir。假设有多个途径,将按输入顺序依次查找。例如: make I/include/mk.3.3工程管理器 make 命令运用-忽略错误-i忽略make执行过程中的一切错误。例如: make i.3.3工程管理器 make 命令运用-显示命令的执行过程-n只显示命令的执行过程而不真正执行。例如: make n.3.3工程管理器 make 命令运用-使隐含规那么无效 -r使make的隐含规那么无效,去除后缀名规那么中默许的后缀清单。例如: make r.3.3工程管理器 make
26、命令运用-显示执行过程中的任务目录 -w显示make执行过程中的任务目录。例如: make w.3.3工程管理器 make 命令运用-读取makefile文件前设置任务 目录-C dir在读取makefile文件以前将任务目录改动为dir,完成make后改回原来的目录。例如: make C bsp.3.3工程管理器 make 命令运用-不显示所执行的命令-s运转make时用选项-s可以不显示执行的命令,只显示生成的结果文件。例如: make s.3.3工程管理器 make 编写一个makefile -makefile的构造makefile文件包含: 显式规那么 隐含规那么 变量定义 指令 注释
27、.3.3工程管理器 make 编写一个makefile -编写makefile 中的规那么targets :dependenciescommand或者targets :dependencies ;commandcommand指定目的名,通常是一个程序产生的目的文件名,也能够是执行一个动作的名字,名字之间用空格隔开。描画产生target所需的文件,一个target通常依赖于多个dependency。用于指定该规那么的命令。.3.3工程管理器 make 编写一个makefile 例如:smcinit:smc.o config.oarm-elf-ar ruvs o smcinit.a smc.o c
28、onfig.osmc.o:smc.c include.harm-elf-gcc c o smc.o smc.cconfig.o:config.c include.harm-elf-gcc c o config.o config.cclean:rm *.o 表示目的名的有smcinit、smc.o、config.o。smcinit依赖于smc.o和config.o,而smc.o又依赖于smc.c和include.h,config.o依赖于config.o和include.h. 各目的分别由命令arm-elf-ar ruvs o smcinit.a smc.o config.o;arm-elf-g
29、cc c o smc.o smc.c;arm-elf-gcc c o config.o config.c来生成。clean为一动作名,删除一切后缀为.o的文件。 -编写makefile 中的规那么.3.3工程管理器 make 编写一个makefile -makef调用makefile中的规那么在默许情况下,make运转不是以“.开头的第一条规那么。在上面的例子中,make默许执行的是规那么smcinit,此时只需求输入命令: makemake将读入makefile,然后执行第一条规那么,例子中该规那么是链接目的文件生成库,因此必需执行规那么smcinit依赖的规那么smc.o和config.o
30、。在执行过程中将自动更新他们所依赖的文件。有些规那么不是被依赖的规那么,需求make指定才干被运转,如上面的例子中的clean规那么可以这样执行:make clean这两种方式的结果一样。只是第一种方式没指明目的名,第二种方式指明了目的名。.3.3工程管理器 make 编写一个makefile -设置makefile中文件的搜索途径 在makefile中,可以经过给VPATH赋值来设置规那么中目的文件和依赖文件的搜索目录。make首先搜索当前目录,假设未找到依赖的文件,make将按照VPATH中给的目录依次搜索。.3.3工程管理器 make 编写一个makefile -如何定义变量在makef
31、ile中变量可以被这样定义:CC = arm-elf-gccAS := arm-elf -asAR = arm-elf -arLIBPATH := ./lib从上面的定义中可以看出,有两种定义变量的方式: 变量名 = 值 变量名:= 值 为了简化makefile以及减少不用要的错误,可以用变量的方式来代表目的文件名或字符串,在需求运用时直接调用变量。.3.3工程管理器 make 编写一个makefile -援用变量有两种方式:$VarName$(VarName)两种方式的效果一样。VarName表示变量名。.3.3工程管理器 make 编写一个makefile -make提供的常用变量例如:d
32、emo.o : demo.c demo.h$CC $CFLAGS $ -o $的值为demo.c,$的值为demo.o,而$的值为demo.c demo.h。 $表示目的名$ 表示一切的依赖文件$*.o的隐含规那么为:%.o:%.c$CC $CFLAGS $*.o的隐含规那么为: %.o:%.s$AS $ASFLAGS $ -o $隐含规那么是指由make自定义的规那么,常用的有: 由*.c的文件生成*.o的文件 由*.s的文件生成*.o的文件 . 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5
33、交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.5 交叉汇编器 arm-elf-as概述-命令格式arm-elf-as option asmfile在命令arm-elf-as后面跟一个或多个选项,以及该选项的子选项,选项间用空格隔开,然后跟汇编源文件名。例如:将demo.s编译成目的文件,并且设置头文件的搜索目录为C:demoinclude:arm-elf-as I/c/demo/include demo.s.3.5 交叉汇编器 arm-elf-as概述-命令选项列表-adhlns显示arm-elf-as信息-f不进展预处置-I path设置头文件搜索途径
34、-o设定输出文件名-v显示版本信息-W不显示警告提示-Z不显示错误提示.3.5 交叉汇编器 arm-elf-as命令运用-生成目的文件 每次运转arm-elf-as只输出一个目的文件,默许形状下名字为a.out。 可以经过-o选项指定输出文件名字,通常都以.o为后缀。例如:编译demo.s输出目的文件demo.o:arm-elf-as o demo.o demo.s.3.5 交叉汇编器 arm-elf-as命令运用-设置头文件搜索途径-I path添加途径path到arm-elf-as的搜索途径,搜索.include file 指示的文件。-I可以被运用多次以添加多个目录,当前任务目录将最先被
35、搜索,然后从左到右依次搜索-I指定的目录。例如:编译demo.s时指定两个搜索目录,当前目录和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s .3.5 交叉汇编器 arm-elf-as命令运用-显示arm-elf-as信息内容-adhlns翻开arm-elf-as信息显示。dhlns为其子选项,分别表示:d 不显示调试信息h 显示源码信息l 显示汇编列表n不进展格式处置s 显示符号列表.3.5 交叉汇编器 arm-elf-as命令运用-设置目的文件名字-I path添加途径path到arm-elf-as的搜索途径,搜索.include
36、file 指示的文件。-I可以被运用多次以添加多个目录,当前任务目录将最先被搜索,然后从左到右依次搜索-I指定的目录。例如:编译demo.s时指定两个搜索目录,当前目录和C:demoinclude:arm-elf-as I./ I/c/demo/include demo.s .3.5 交叉汇编器 arm-elf-as命令运用-如何取消警告内容-W加选项-W以后,运转arm-elf-as就不输出警告信息。例如:编译demo.s输出目的文件demo.o,不输出警告信息:arm-elf-as W o demo.o demo.s .3.5 交叉汇编器 arm-elf-as命令运用-设置能否进展预处置
37、arm-elf-as内部的预处置程序,完成以下任务:调整并删除多余空格,删除注释,将字符常量改成对应的数值。例如:编译demo.s输出目的文件demo.o,并且编译时不进展预处置,那么命令如下:arm-elf-as f o demo.o demo.s . 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.6 汇编言语编程汇编言语-根本元素1字符集 汇编中运用以下字符组成源程序的各种语法元素:大写字母 A Z;小写字
38、母 a z;数字 0 9;符号 + - * / = ( ) ; , . : $ & # % _ “ - | ? !。 其中大小写字母作用不同。.3.6 汇编言语编程汇编言语-根本元素2商定的名字 包括存放器名、指令名字和伪操作符。每一个伪操作符表示一定功能的操作。.3.6 汇编言语编程汇编言语-根本元素2商定的名字 伪操作符可以分为六类: 数据定义伪操作符 符号定义伪操作符 程序构造伪操作符 条件汇编伪操作符 宏伪操作符 其他伪操作符.3.6 汇编言语编程汇编言语-根本元素3定义的名字 汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。 标号标号只能由a z 、A Z、0 9、_等字符
39、组成,标号的长度不受限制,大小写字母有区别。.3.6 汇编言语编程汇编言语-根本元素3定义的名字 汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。 分段名汇编系统中预定义的分段名有: .text .bss .data .sdata .sbss 等,但是用户可以本人定义段名,语法如下:.section section_name attribute.3.6 汇编言语编程汇编言语-根本元素3定义的名字 汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。 分段名汇编系统中预定义的分段名有: .text .bss .data .sdata .sbss 等,但是用户可以本人定义段名,语法
40、如下:.section section_name attribute例如:定义一个可以执行的代码段 .mytext.section .mytext,axmycode.3.6 汇编言语编程汇编言语-根本元素3定义的名字 汇编程序中的标号、分段名、宏定义名都是用户可以定义的名字。 宏定义名宏定义的语法如下:.macro macro_name parm1 parmNmacro body.endm.3.6 汇编言语编程汇编言语-根本元素4常数 二进制数由0b或者0B开头,如:0b1000101、 0B1001110;十六进制数以0 x或者0X开头,如:0 x4567、 0X10089;八进制数由0开头
41、,如:0345、09870;十进制数以非零数开头,如:345、12980.3.6 汇编言语编程汇编言语-根本元素5当前地址数 当前的地址数用点号“.表示,在汇编程序中可以直接运用该符号。6表达式 在汇编程序中可以运用表达式,在表达式中可以运用常数和数值。 可以运用的运算符有: 前缀运算符号- 取负数 取补数 中缀运算符号* / % | & !+ -.3.6 汇编言语编程汇编言语-根本元素7注释符号 不同芯片的汇编程序中,注释的符号有所不同,以“开头的程序行是注释行。.3.6 汇编言语编程汇编言语-语句1语句类型注释符号 汇编语句按其作用和编译的情况分为两大类:执行性语句和阐明性语句。.3.6
42、汇编言语编程汇编言语-语句2数据语句 一字节数据定义语句两字节数据定义语句四字节数据定义语句八字节数据定义单个字串定义多个字串1多个字串2反复数据定义.3.6 汇编言语编程汇编言语-语句3列表控制语句 .title “heading在汇编列表中将“heading“作为标题。.list系统遇此语句就输出列表文件。.3.6 汇编言语编程汇编言语-语句4普通执行语句 不同的芯片有不同指令集,见相关的指令手册。.3.6 汇编言语编程汇编言语-程序构造1程序构造语句 程序构造语句是伪操作符定义的阐明语句,用于阐明程序段的开场、终了以及源程序的终了等。.3.6 汇编言语编程汇编言语-程序构造1程序构造语句
43、 程序构造语句是伪操作符定义的阐明语句,用于阐明程序段的开场、终了以及源程序的终了等。代码段的开场 .text 数据段的开场 .data 源程序的终了 .end.3.6 汇编言语编程汇编言语-程序构造2过程函数的定义过程的构造如下:过程名:过程体前往语句例如:.align 2.globl uart1_sendch.type uart1_sendch,functionuart1_sendch:ldrr2,=SYSFLG1:ldrr1,r2tstr1,#UTXFF1bne1bldrr2,=UARTDR1strbr0,r2movpc,lr普通情况下,.type 和.align声明可以缺省。 .3.6
44、 汇编言语编程宏语句与条件编程-等价语句1.equ语句语法: .equ symbol,expression例子: .equ PPC_PC,32*4运用: stwr4,PPC_PC(r1) 2 .set语句与.equ的功能一样。 .3.6 汇编言语编程宏语句与条件编程-宏定义与宏调用宏定义:.macro macro_name param1 ,param2,.paramN.macro body.endm例如:运用ARM的汇编指令集阐明.macro ROMSEC_patova TTPA, pa_start,va_start,tmp,icldrtmp,=APFIELD_ROMaddTTPA,TTPA,
45、va_start,LSR #18addtmp,tmp,pa_start20:strtmp,TTPA,#4addtmp,tmp,#0 x10000subsic,ic,#1bne 20b.endm.3.6 汇编言语编程宏语句与条件编程-反复块和源文件的嵌入(1) 反复块定义:.rept countcontents.endr例如:.rept 2.long 0 x12908.endr等价于:.long 0 x12908.long 0 x12908(2) 源文件的嵌入在一个汇编文件中可以嵌入其它汇编文件,例如汇编头文件等。方法如下:.include “filename.3.6 汇编言语编程宏语句与条件编
46、程-条件编译.if expression 表达式为非零那么编译后面的语句,否那么后面的语句被忽略。.ifdef symbol假设符号被定义那么编译后面的语句,否那么后面的语句被忽略。.ifndef symbol假设符号未被定义那么编译后面的语句,否那么后面的语句被忽略。.else表示与前面的if语句的条件相反。.endif表示条件判别终了。.3.6 汇编言语编程宏语句与条件编程-条件编译例如:.macro sum from=0, to=5 .long from .if to - from sum “(from+1),to .endif.endm运用:sum,5等价于.long 0 .long
47、5条件判别可以嵌套运用,if-else-endif遵照最近匹配的原那么。.3.6 汇编言语编程模块化程序设计 -全局符号 在模块中定义的、要被别的模块运用的符号包括变量名和函数名都必需被声明为全局符号。方法如下:.global symbol 在本模块中要运用其他模块中的全局符号,可以用.extern symbol的方式声明,但也可以不用声明在汇编时自动以为它是其它模块中的全局符号。.3.6 汇编言语编程模块化程序设计 -模块间的符号互用 1汇编模块与汇编模块间的调用2汇编模块调用C言语模块中的函数3汇编模块运用C言语模块中的变量4C言语模块调用汇编模块中的函数 5C言语模块运用汇编模块中的变量
48、.3.6 汇编言语编程内存方式 在 uClinux 环境下,内存方式为平方式,即整个内存空间最大为4GB。一切义务共享这4GB的空间,而不是每个义务有单独的4G虚拟空间。一切的寻址都是32位地址的方式,因此程序模块间可以很容易的共享变量和数据。.3.6 汇编言语编程StrongARM&ARM7 -存放器名字类型说 明r0r14通用寄存器f0f7浮点寄存器pc指令指针ps机器状态寄存器fps浮点状态寄存器.3.6 汇编言语编程StrongARM&ARM7 -如何在汇编模块中调用C言语模块中的函数在调用C函数之前,必需在当前栈中空出至少8个字节的空间,然后才调用C函数。C函数的第一个参数最左边的参
49、数用r0传送,后面的参数依次用r1、r2等来传送。例如:假定C函数为int get_sum (int var1,int var2),那么在汇编程序中首先将参数送到r0、r1中,然后将栈指针减8,最后调用get_sum。留意:C函数名在汇编中运用时不用加下划线.3.6 汇编言语编程StrongARM&ARM7 -注释符号以“开头的程序行是注释行。.3.6 汇编言语编程StrongARM&ARM7 -普通程序.title “example.data.global var1var1:.long 0 x897678 ,0 x2378789.byte 89 ,56, 23.string “ hello.
50、bss.global zero_varzero_var:.short 0,0,0.long 0,0,0,0.3.6 汇编言语编程StrongARM&ARM7 -普通程序.textUART1INIT_TEST:ldr r3,=SYSCON1ldr r0,r3tst r0,#UART1ENbeq 2f1:ldr r1,r3tst r1,#UTXFF1bne 1b2:bic r0,r0,#UART1ENstr r0,r3bic r0,r0,#SIREN.3.6 汇编言语编程StrongARM&ARM7 -普通程序str r0,r3orr r0,r0,#UART1ENstr r0,r3ldr r3,=
51、SYSFLG2ldr r0,r3and r0,r0,#0 x40mov pc,lr.section “.mytext , “ax.global u1b_setu1b_set:ldr r3,=UBLCR1str r0,r3mov pc,lr.end. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.7简单程序设计顺序程序设计 例3-1 用ARM指令实现的C赋值语句:x=(a+b)-c 可以用r0表示a、rl表示b、
52、r2表示c和r3表示x,用r4作为间接寻址存放器。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.7简单程序设计顺序程序设计 例3-2 用ARM指令实现的C赋值语句:z=(a2)|(b&15)可以运用r0表示a和z,r1表示b,r4表示地址进展编码 ADR
53、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 .3.7简单程序设计分支程序设计 例3-3在ARM中实现下面if语句: if(ab) x=5; y=c+d: else x=c-d; 实现上述指令的第一种方法比较传统并且和其他微处置器类
54、似。以下指令运用条件分支和无条件数据操作:.3.7简单程序设计分支程序设计 例3-4在ARM中实现C的switch语句 C中的switch语句采用以下方式: switch(test) case 0:break; case 1:break; 上述语句也可以像if语句那样编码,首先测试test=A,然后测试test=B,依此类推.3.7简单程序设计循环程序设计 例3-5用ARM指令实现FIR过滤器FIR(finite impulser response)过滤器是一种处置信号的常用方法;FIR过滤器是简单的对积求和: cixi 1in作为过滤器运用时,xi假定为周期性采集的数据样品,ci是系数。.
55、这种表示假定样品是周期性采集而来的,每次一个新的样品到来都要重新计算一次FIR过滤器的输出。 方框表示存储刚刚到来的样品产生xi时延元素。延迟的样品分别单独与c相乘,然后求和得到过滤器的输出fc1c2c3c4x1x2x3x4.3.7简单程序设计子程序设计 每个C函数前往一个值(除非它的前往类型是void);普通把不前往值的构造称为子例程或过程。. 第 3 章 目录1 GNU GCC简介2 C/C+交叉编译器arm-elf-gcc3 交叉衔接器arm-elf-ld 4 工程管理器 MAKE5 交叉汇编器 arm-elf-as6 汇编言语编程7 简单程序设计8 混合言语编程.3.8混合言语编程汇编言语与C/C+的混合编程通常有以下几种方式:在C/C+代码中嵌入汇编指令;在汇编程序和C/C+的程序之间进展变量的互访;汇编程序、C/C+程序间的相互调用。.如何在C言语内嵌汇编言语 3.8混合言语编程- 内嵌汇编的语法_asm 指令;指令 *注释* 指令 .如何在C言语内嵌汇编言语 3.8混合言语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年 云浮市妇幼保健院招聘考试笔试试题附答案
- 2025年 莎车县第二中等职业技术学校招聘考试笔试试题附答案
- 挤压冰淇淋生产线行业深度研究分析报告(2024-2030版)
- 中国空气干燥机行业发展前景预测及投资战略研究报告
- 2018-2024年中国水产养殖与捕捞市场运营态势分析及投资前景预测报告
- 中国灰浆泵行业市场全景分析及投资前景展望报告
- 2025年中国精密玻璃模压行业市场发展监测及投资战略规划报告
- 地热发电项目节能评估报告(节能专用)
- 2025年中国移动式压力容器行业发展运行现状及投资潜力预测报告
- 心态培训课件下载
- 2025届上海市闵行区21学校七年级生物第二学期期末调研试题含解析
- 火灾自动报警系统故障应急预案
- 《拓印新貌》教学课件-2024-2025学年沪书画版(五四学制)(2024)初中美术六年级下册
- 湖北省武汉市2025年中考语文二模试题(含答案)
- 25春国家开放大学《中国法律史》形考任务1-3参考答案
- 研发人员绩效考核及奖励制度
- 银行公文写作培训
- GB/T 20972.2-2025石油天然气工业油气开采中用于含硫化氢环境的材料第2部分:抗开裂碳钢、低合金钢和铸铁
- 2024-2025学年浙江绍兴诸暨市三下数学期末统考试题含解析
- 缓刑变更居住地申请书
- 小学四年级下册数学全单元测试题(及答案)
评论
0/150
提交评论