版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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-gcc 3 交叉连接器arm-elf-ld 3.1 需求分析 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,第 3 章 目录
2、,1 GNU GCC简介 2 C/C+交叉编译器arm-elf-gcc 3 交叉连接器arm-elf-ld 3.1 需求分析 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,3.1 GNU GCC简介,GNU集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种编程语言、支持多种CPU的交叉编译工具。,输出预处理后的C/C+源程序(展开头文件和替换宏) 输出C/C+源程序的汇编代码 输出二进制目标文件 生成静态库 生成可执行程序 转换文件格式,GNU GCC的基本功能,3.1 GN
3、U GCC简介,GCC组成,-C/C+交叉编译器arm-elf-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产生一个交叉参考表和一个标准的
4、符号表,产生的代码和数据能够放在多个区 (Section)中。,3.1 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是用于自动编译、链接程序的
5、实用工具,使用make后就不需要手工的编译每个程序文件。要使用make,首先要编写makefile。 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 根据用户的链接选项
6、(包括指定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。,程序的编译过程,C/C+源文件,Arm-elf-gcc,头文件,汇编文件,Arm-elf-as,目标文件,源文件列表,生成库,连接命令文件,可重定位模块,Arm-eif-ld,Arm-elf-ar,用户库,库列表,可执行程序,第 3 章 目录,1 GNU GCC简介 2 C/C+交叉编译器arm-elf-gcc 3 交叉连接器arm-elf-ld 3.1 需求分析 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,概述,3.2 C/C+交叉编译器arm-el
7、f-gcc,-命令格式,arm-elf-gcc options file 在命令arm-elf-gcc后面跟一个或多个选项,选项间用空格隔开,然后跟一个或多个目标文件。,例如,将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说明
8、文件的输入类型为language,输出控制选项:,概述,3.2 C/C+交叉编译器arm-elf-gcc,-命令选项列表,-ansi 支持所有ANSI C程序,C语言选项:,概述,3.2 C/C+交叉编译器arm-elf-gcc,-命令选项列表,-w 关闭所有警告 -Wall 打开所有警告 -Wimplicit 如果有隐含申明,显示警告信息 -Wno-implicit 不显示对隐含申明的警告,警告选项:,概述,3.2 C/C+交叉编译器arm-elf-gcc,-命令选项列表,-g 在文件中产生调试信息(调试信息的文件格式有stabs、COFF、XCOFF、DWARF),调试选项:,概述,3.2
9、 C/C+交叉编译器arm-elf-gcc,-命令选项列表,-O0 不优化 -O1 一级优化 -O2 二级优化 -O3 三级优化,优化选项:,概述,3.2 C/C+交叉编译器arm-elf-gcc,-命令选项列表,-E 运行C的预处理器 -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,-命令选项列表,
10、-I dir 设置搜索路径为dir -I- 指定只对 #include “file”,有效的头文件搜索目录,搜索路径选项:,概述,3.2 C/C+交叉编译器arm-elf-gcc,-源文件类型的识别,*.c C源文件 *.i 经过预处理后的C源文件 *.h C头文件 *.ii 经过预处理后的C+源文件 *.cc C+源文件 *.cxx C+源文件 *.cpp C+源文件 *.CC+源文件 *.s 不需要预处理的汇编文件 *.S需要预处理的汇编文件,arm-elf-gcc能够自动根据文件名后缀识别文件类型.,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,例如,将test.c编译成汇
11、编程序并存放于文件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: arm-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/
12、C+文件生成汇编文件。,-将C/C+文件生成汇编文件,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,例如,对test.c进行预处理并将结果输出到屏幕: arm-elf-gcc E test.c,-E 只对源文件进行预处理并且缺省输出到标准输出。,-预处理文件的生成,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,头文件的引用有两种形式: 一种是# include“filename”, 一种是# include 。 前一种形式的路径搜索顺序是:当前目录、指定的搜索路径;后一种形式只搜索指定路径。 -I dir 将目录dir添加到头文件搜索目录列表的第一项。 -I- -I
13、-以前用-I指定的头文件搜索目录只对 # include“file” 有效,对 # include 无效; -I-以后指定的头文件搜索目录对以上两种形式的头文件都有效。,-设置头文件搜索路径,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,头文件的引用有两种形式: 一种是# include“filename”, 一种是# include 。 前一种形式的路径搜索顺序是:当前目录、指定的搜索路径;后一种形式只搜索指定路径。 -I dir -I-,-设置头文件搜索路径,例如,编译test.c,在当前目录和/include中搜索test.c所包含的头文件: arm-elf-gcc I .
14、/ 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 打开所有警告信息。,可以使用以-W开头的不同选项对特定警告进行设定。对于每种警告类型都有相应以-Wno-开始的选项关闭警告。,-控制警告产生,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,-O1 可以部分减小代码尺寸,对运行速度有一定
15、的提高。较多地使用了寄存器变量,提高指令的并行度。 -O2 除了解循环、函数插装和静态变量优化,几乎包含arm-elf-gcc所有优化选项。一般在生成固化代码时使用该选项较为适宜。 -O3 包含-O2的所有优化,并且还包含了解循环、函数插装和静态变量优化。通常情况下,该级优化生成的代码执行速度最快,但是代码尺寸比-O2大一些。,arm-elf-gcc支持多种优化选项,总体上划分为三级优化:,-实现优化,命令使用,3.2 C/C+交叉编译器arm-elf-gcc,例如: 编译test.c并且预定义宏 RUN_CACHE 值为1: arm-elf-gcc c D RUN_CACHE test.c
16、编译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-gcc 3 交叉连接器arm-elf-ld 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,概述,3.2 交叉连接器arm-elf-ld,-命令格式,arm-elf-ld option file 命令行后跟
17、选项和可重定位的目标文件名。,例如: 链接的输入文件为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指定程序入口 -M输出链接信息 -lar指定链接库 -L dir添加搜索路径 -o设置输出文件名 -Tcommandfile指定链接命令文件 -v显示版本信息 -Map制定输出映像文件,
18、命令使用,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,-输出链接信息,-M 在标准端口打印出符号映象表和内存分布信息。,例如:链接的输入文件为demo.o,输出文件为demo.elf,在标准端口打印出符号映象表和内存分
19、布信息,命令如下: 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-ld Map map.txt o demo.elf demo.o,命令使用,3.2 交叉连接器arm-elf-ld,-指定链接的库出
20、,-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添加到库的搜索路径,命令如下: arm-elf-ld -L./lib o demo.elf demo.o,命令使用,3.2 交叉连接器ar
21、m-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 linkcmds参数,就能在链接时自动调用linkcmds文件,例如:链接的输入文件为demo.o,输出文件为demo.
22、elf,链接定位文件为linkcmds,则命令如下: arm-elf-ld T linkcmds o demo.elf demo.o,linkcmds连接命令文件,3.2 交叉连接器arm-elf-ld,-编写linkcmds,arm-elf-ld的命令语言是一种描述性的脚本语言,它主要应用于控制:有哪些输入文件、文件的格式怎样、输出文件中的模块怎样布局、分段的地址空间怎样分布、以及未初始化的数据段怎样处理等。 用命令语言写成的文件(通常称为linkcmds)具有可重用性,不必每次在命令行输入一大堆命令选项.并且对于不同的应用,只需对linkcmds进行简单的修改就可以使用。,linkcmds
23、连接命令文件,3.2 交叉连接器arm-elf-ld,-编写linkcmds,(1)arm-elf-ld命令语言 (2)表达式 (3)linkcmds的结构 (4)对程序入口的说明 (5)对程序头的说明 (6)对内存布局的说明 (7)对分段的说明 (8)注释,第 3 章 目录,1 GNU GCC简介 2 C/C+交叉编译器arm-elf-gcc 3 交叉连接器arm-elf-ld 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,3.3工程管理器 make,概述,-命令格式,make -f makefile option ta
24、rget make命令后跟-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设置的工作目录 -s不显示执行的
25、命令,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工程管理
26、器 make,命令使用,-指定包含文件的搜索路径,-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
27、r,3.3工程管理器 make,命令使用,-显示执行过程中的工作目录,-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
28、文件包含: 显式规则 隐含规则 变量定义 指令 注释,3.3工程管理器 make,编写一个makefile,-编写makefile 中的规则,targets :dependencies command 或者 targets :dependencies ;command command ,指定目标名,通常是一个程序产生的目标文件名,也可能是执行一个动作的名字,名字之间用空格隔开。,描述产生target所需的文件,一个target通常依赖于多个dependency。,用于指定该规则的命令。,3.3工程管理器 make,编写一个makefile,例如: smcinit:smc.o config.o
29、arm-elf-ar ruvs o smcinit.a smc.o config.o smc.o:smc.c include.h arm-elf-gcc c o smc.o smc.c config.o:config.c include.h arm-elf-gcc c o config.o config.c clean: 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
30、ruvs o smcinit.a smc.o config.o;arm-elf-gcc 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,此时只需要输入命令: make make将读入makefile,然后执行第一条规则,例子中该规则是链接目标文件生
31、成库,因此必须执行规则smcinit依赖的规则smc.o和config.o。在执行过程中将自动更新他们所依赖的文件。 有些规则不是被依赖的规则,需要make指定才能被运行,如上面的例子中的clean规则可以这样执行: make clean 这两种方式的结果一样。只是第一种方式没指明目标名,第二种方式指明了目标名。,3.3工程管理器 make,编写一个makefile,-设置makefile中文件的搜索路径,在makefile中,可以通过给VPATH赋值来设置规则中目标文件和依赖文件的搜索目录。make首先搜索当前目录,如果未找到依赖的文件,make将按照VPATH中给的目录依次搜索。,3.3工
32、程管理器 make,编写一个makefile,-如何定义变量,在makefile中变量可以被这样定义: CC = arm-elf-gcc AS := arm-elf -as AR = arm-elf -ar LIBPATH := ./lib 从上面的定义中可以看出,有两种定义变量的形式: 变量名 = 值 变量名:= 值,为了简化makefile以及减少不必要的错误,可以用变量的形式来代表目标文件名或字符串, 在需要使用时直接调用变量。,3.3工程管理器 make,编写一个makefile,-引用变量,有两种方式: $VarName $(VarName) 两种方式的效果一样。 VarName表示
33、变量名。,3.3工程管理器 make,编写一个makefile,-make提供的常用变量,例如: demo.o : demo.c demo.h $CC $CFLAGS $ -o $ $的值为demo.c, $的值为demo.o, 而$的值为demo.c demo.h。,$表示目标名 $ 表示所有的依赖文件 $ 第一个依赖文件,3.3工程管理器 make,编写一个makefile,-make里的常用函数,常用的函数有: (1)$(subst from,to,text)将字text中的from子串替换为to子串。 (2)$(patsubst pattern,replacement,text)按模式
34、pattern 替换text中的字串。,函数的使用方式有两种: $(function arguments) $function arguments,3.3工程管理器 make,编写一个makefile,-隐含规则,实际上使用的隐含规则如下所示: 对*.c-*.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-gcc 3
35、 交叉连接器arm-elf-ld 4 工程管理器 MAKE 5 交叉汇编器 arm-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,3.5 交叉汇编器 arm-elf-as,概述,-命令格式,arm-elf-as option asmfile 在命令arm-elf-as后面跟一个或多个选项,以及该选项的子选项,选项间用空格隔开,然后跟汇编源文件名。,例如:将demo.s编译成目标文件,并且设置头文件的搜索目录为C:demoinclude: arm-elf-as I/c/demo/include demo.s,3.5 交叉汇编器 arm-elf-as,概述,-命令选项列表,-
36、adhlns显示arm-elf-as信息 -f不进行预处理 -I path设置头文件搜索路径 -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
37、-as的搜索路径,搜索.include ”file” 指示的文件。 -I可以被使用多次以添加多个目录,当前工作目录将最先被搜索,然后从左到右依次搜索-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
38、交叉汇编器 arm-elf-as,命令使用,-设置目标文件名字,-I path 添加路径path到arm-elf-as的搜索路径,搜索.include ”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输
39、出目标文件demo.o,不输出警告信息: arm-elf-as W o demo.o demo.s,3.5 交叉汇编器 arm-elf-as,命令使用,-设置是否进行预处理,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-gcc 3 交叉连接器arm-elf-ld 4 工程管理器 MAKE 5 交叉汇编器 arm
40、-elf-as 6 汇编语言编程 7 简单程序设计 8 混合语言编程,3.6 汇编语言编程,汇编语言,-基本元素,(1)字符集 汇编中使用下列字符组成源程序的各种语法元素:大写字母 A Z;小写字母 a z;数字 0 9;符号 + - * / = ( ) ; , . : $ 指令 *注释* 指令 ,如何在C语言内嵌汇编语言,3.8混合语言编程,- 内嵌汇编的语法,例3-6 使能禁能IRQ中断 _inline void enable_IRQ(void) int tmp; _asm /嵌入汇编代码 MRS tmp,CPSR /读取CPSR的值 BIC tmp,tmp,#0 x80 MSR CPSR
41、_c,tmp ,如何在C语言内嵌汇编语言,3.8混合语言编程,- 内嵌汇编的语法,例3-6 使能禁能IRQ中断 _inline void disable_IRQ(vold) int tmp; _asm MRS tmp,CPSR ORR tmp,tmp,#0 x80 MSR CPSR_c,tmp ,如何在C语言内嵌汇编语言,3.8混合语言编程,- 内嵌汇编的指令用法,(1) 操作数 内嵌的汇编指令中作为操作数的寄存器和常量可以是C表达式。,(2) 物理寄存器 内嵌汇编中使用物理寄存器有以下限制: 不能直接向PC寄存器赋值 使用物理寄存器的指令中,不要使用过于复杂的C表达式。 编译器可能会使用R12或R13存放编译的中间结果 通常内嵌的汇编指令中不要指定物理寄存器,,如何在C语言内嵌汇编语言,3.8混合语言编程,- 内嵌汇编的指令用法,(3) 常量。在内嵌汇编指令中,常量前面的“#”可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 包分配工作制度
- 台球房工作制度
- 2026年境外投资风险评估与管理制度
- 人事部工作制度
- 严打工作制度
- 初三工作制度
- 厂服工作制度
- 养身馆工作制度
- 南方工作制度
- 加油站工作制度
- 2025年南浔银行招聘考试题库
- DB32∕T 4304-2022 高速公路经营管理安全生产隐患排查治理规程
- 2025年重庆市初中学业水平考试中考(会考)生物试卷(真题+答案)
- 项目施工奖惩管理办法
- 隧道爆破安全培训课件
- 喝酒划拳活动方案
- 日语数字考试题目及答案
- CJ/T 83-2016水处理用斜管
- T/CI 467-2024复合集流体(铜箔)
- 《赤壁之战》课本剧剧本:感受三国英雄的壮志豪情
- 《平顶山平煤神马集团公司成本管理现状、问题及完善对策》7100字
评论
0/150
提交评论