嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 赵宏 王小牛 任学惠 第八章

上传人:E**** 文档编号:89378466 上传时间:2019-05-24 格式:PPT 页数:27 大小:258.50KB
返回 下载 相关 举报
嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  赵宏 王小牛 任学惠 第八章_第1页
第1页 / 共27页
嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  赵宏 王小牛 任学惠 第八章_第2页
第2页 / 共27页
嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  赵宏 王小牛 任学惠 第八章_第3页
第3页 / 共27页
嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  赵宏 王小牛 任学惠 第八章_第4页
第4页 / 共27页
嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  赵宏 王小牛 任学惠 第八章_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 赵宏 王小牛 任学惠 第八章》由会员分享,可在线阅读,更多相关《嵌入式系统应用教程 中国通信学会普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 赵宏 王小牛 任学惠 第八章(27页珍藏版)》请在金锄头文库上搜索。

1、第8章 ARM汇编语言程序设计,尽管ARM嵌入式系统主要采用C语言作为开发语言,但是一些底层代码和关键代码还是需要用汇编语言编写。因为手工编写的汇编代码能达到最好的优化效果。 学习ARM汇编语言程序设计需要有ARM汇编语言编译器。前主要的ARM汇编语言编译器有三个:一个是ARM公司开发的标准ARM汇编语言编译器armasm;另一个是GNU为支持ARM而开发的GNU ARM汇编语言编译器 arm-elf-as;还有一个是IAR公司开发的IAR ARM汇编语言编译器iasmarm。 本章主要介绍ADS环境下标准ARM汇编语言程序设计。,目 录,8.1 用ADS调试ARM汇编语言程序 8.2 ARM

2、汇编语言程序基本结构 8.3 ARM汇编语言程序中的符号和表达式 8.4 ARM汇编语言伪操作 8.5 ARM汇编语言程序伪指令 8.6 ARM汇编语言程序宏指令 8.7 ARM汇编语言程序子程序 8.8 GNU ARM汇编简介 习题,8.1 用ADS调试ARM汇编语言程序,ADS(ARM Developer Suite)是ARM公司推出的ARM系统开发工具,最新版本是1.2。主要应用平台为各种版本的Windows。ARM ADS由以下六部分组成: 1代码生成工具(Code Generation Tools) 2集成开发环境(CodeWarrior IDE from Metrowerks) 3

3、调试器(Debuggers) 4指令集模拟器(Instruction Set Simulators) 5ARM 开发包(ARM Firmware Suite) 6ARM应用库(ARM Applications Library),8.1 用ADS调试ARM汇编语言程序,1. 在命令行方式下调试 假设ARM汇编语言源程序名为ex3_1.s 用工具armasm汇编ex3_1.s,生成目标代码ex1.o: c:asmarmasm ex3_1.s o ex1.o 用工具armlink链接目标代码ex1.o,生成可执行文件ex1: c:asmarmlink ex1.o o ex1 用工具armsd调试可执

4、行文件ex1: c:asmarmsd ex1,8.1 用ADS调试ARM汇编语言程序,2. 在IDE环境下调试 创建一个新工程:,8.1 用ADS调试ARM汇编语言程序,2. 在IDE环境下调试 编译和链接工程:,8.1 用ADS调试ARM汇编语言程序,2. 在IDE环境下调试 在AXD中调试工程:,8.2 ARM汇编语言程序基本结构,ARM汇编语言程序基本结构包括ARM汇编语言语句格式和ARM汇编语言程序格式,下面分别介绍。 1. ARM汇编语言语句格式: ARM汇编语言语句格式如下所示: symbol instruction| pseudo-instruction| directive ;

5、comment symbol为符号。 instruction为机器指令。 pseudo-instruction为伪指令。 directive为伪操作。 comment为注释。,8.2 ARM汇编语言程序基本结构,2. ARM汇编语言程序结构: ARM汇编语言以段(section)为单位组织汇编语言源程序。段分为代码段和数据段两种,代码段存放执行代码,数据段存放代码段运行时操作的数据。一个ARM汇编语言源程序可以没有数据段,但至少要有一个代码段。一个大的程序可能包含多个代码段和数据段。 ARM汇编语言源程序经过汇编链接处理后生成一个可执行的映像文件(elf或axf格式)。该可执行的映像文件通常包

6、括三个部分的内容: 一个或多个代码段。代码段通常是只读的。 零个或多个包含初始值的数据段。数据段通常是可读写的。 零个或多个不包含初始值的数据段。这些数据段被初始化为0,通常是可读写的。,8.3 ARM汇编语言程序的符号和表达式,在ARM汇编语言中,符号包括变量、数字常量、标号和局部标号,表达式包括数字表达式、字符串表达式、逻辑表达式和预定义表达式。 1. ARM汇编语言中的符号 在ARM汇编语言中,符号可以代表地址、变量和数字常量。 变量 在ARM汇编语言中,变量包括数字变量、逻辑变量和字符串变量。 数字常量 在ARM汇编语言中,数字常量是32位的整数。 标号 标号是程序中的指令或者数据地址

7、的符号。 局部标号 局部标号是一个099之间的数字。,8.3 ARM汇编语言程序的符号和表达式,2. ARM汇编语言中的表达式 表达式是由符号、数值、单目或多目操作符以及符号组成的。 数字表达式 数字表达式由数字常量、数字变量、操作符和括号组成。 字符串表达式 字符串表达式由字符串常量、字符串变量、字符串操作符和括号组成。 逻辑表达式 逻辑表达式由逻辑常量true和false、逻辑变量、关系运算符、逻辑操作符和括号组成,取值范围为true或false。 预定义表达式 在ARM汇编语言中,预定义表达式包括各种指令助记符、寄存器名和预定义变量。,8.4 ARM汇编语言的伪操作,在ARM汇编语言中,

8、共有如下6种伪操作,分别是符号定义伪操作、数据定义伪操作、杂项伪操作、汇编控制伪操作、信息报告伪操作和框架描述伪操作。 1.符号定义(Symbol Definition)伪操作 符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名。常见的符号定义伪操作有如下几种: Gable LCLx SETx RLIST 其他符号定义伪操作,8.4 ARM汇编语言的伪操作,2.数据定义(Data Definition)伪操作 数据定义伪操作主要包括DCx、SPACE、MAP、FIELD及LTORG。 DCx DCx伪操作用于分配一块数据单元并初始化,主要包括DCB、DCW、DCWU、

9、DCD、DCDU、DCQ、DCQU、DCFS、DCFSU、DCFD、DCFDU、DCI和DCDO。 SPACE SPACE用于分配一段内存单元,并用0初始化。 MAP和FIELD MAP伪操作和FIELD伪操作配合使用,用来定义结构化内存表的结构。 LTORG LTORG伪操作用于声明一个数据缓冲池(literal pool)的开始。,8.4 ARM汇编语言的伪操作,3. 杂项伪操作 杂项伪操作主要包括AREA、ENTRY、CODE16和CODE32、END、RN、ALIGN、EQU、EXPORT或GLOBAL、EXTERN、GET或INCLUDE、IMPORT、INCBIN、KEEP、NOF

10、P、REQUIRE、REQUIRE8及PRESERVER8和ROUT。,8.4 ARM汇编语言的伪操作,4. 汇编控制伪操作 汇编控制伪操作主要用于条件汇编,包括IF类和WHILE类伪操作。 IF、ELSE及ENDIF IF类伪操作能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。ENDIF WHILE和WEND WHILE和WEND伪操作能够根据条件重复汇编相同的或者几乎相同的一段源代码。,8.4 ARM汇编语言的伪操作,5. 信息报告伪操作 信息报告伪操作用于在汇编过程中报告汇编错误信息和诊断信息,主要包括ASSERT、INFO、OPT、TTL及SUBT。 ASSERT

11、ASSERT伪操作在汇编编译器对汇编程序的第二遍扫描中,如果发现assertion中条件不成立,则报告错误信息。 INFO INFO伪操作支持在汇编处理过程的第一遍扫描或第二遍扫描中报告诊断信息。 OPT OPT伪操作在源程序中设置列表选项。,8.5 ARM汇编语言程序伪指令,ARM汇编语言提供的伪操作和伪指令都是为了方便用户编写汇编语言程序,但二者的使用方法是有区别的。上一节介绍的伪操作只供汇编编译器和连接器在汇编何连接时使用,在程序运行时不会出现任何伪操作,而本节将要介绍的伪指令则在汇编时被汇编编译器替换成能完成该伪指令功能的ARM或Thumb指令序列。ARM伪指令包括ADR、ADRL、L

12、DR和NOP,其中NOP伪指令在汇编时被替换成ARM中的空操作,比如MOV R0, R0,其含义就是什么都不做,但占用了指令周期。本节主要介绍前3个伪指令。,8.5 ARM汇编语言程序伪指令,1. ADR: ADR伪指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中,在编译时被替换成一条合适的指令。其语法格式为: ADRcond register, expr 其中,cond为指令执行的条件;register为目标寄存器;expr为基于PC或基于寄存器(MAP和FIELD伪操作)的地址表达式,其取值范围为: 当地址值不是字对齐时,其取值范围为-255255。 当地址值是字对齐时,其取值范围

13、为-10201020(255个字)。 在汇编编译器处理源程序时,ADR伪指令通常用一条ADD或SUB指令来实现ADR伪指令的功能。如果不能用一条指令实现ADR伪指令的功能,编译器将报告错误。,8.5 ARM汇编语言程序伪指令,2. ADRL: ADRL伪指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中,ADRL伪指令比ADR伪指令可以读取范围更大的地址,在编译时被替换成2条合适的指令。其语法格式为: ADRLcond register, expr 其中,cond为指令执行的条件;register为目标寄存器;expr为基于PC或基于寄存器的地址表达式,其取值范围为: 当地址值不是字对齐

14、时,其取值范围为-64K64K。 当地址值是字对齐时,其取值范围为-256K256K。 在汇编编译器处理源程序时,ADRL伪指令通常用两条指令来实现ADRL伪指令的功能,即使一条指令可以完成该伪指令的功能,汇编器也将用两条指令来替换该伪指令。,8.5 ARM汇编语言程序伪指令,3. LDR: LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,LDR伪指令比ADRL伪指令可以读取范围更大的地址。其语法格式为: LDRcond register, =expr | label-expr 其中,cond为指令执行的条件;register为目标寄存器;=是LDR伪指令与LDR机器指令区别的标志

15、;expr为32位的常数,编译器将根据expr的取值情况,如下处理LDR伪指令: 当expr表示的数值没有超过MOV或MVN指令中立即数的范围时,编译器用合适的MOV或MVN指令来替代LDR伪指令。MOV指令中立即数的范围是0255或者是能通过循环右移一个8位二进制数偶数次能产生的数(参见7.2节操作数预处理的内容)。 当expr表示的数值超过MOV或MVN指令中立即数的范围时,编译器将该数值放到数据缓冲区中,同时用一条基于PC的LDR指令读取该数值。,8.6 ARM汇编语言程序宏指令,宏是汇编语言程序设计中一个非常重要的概念。从功能上来说,宏类似于C语言中的函数,因为宏能实现某种特定的功能,

16、并且还能实现参数传递。从实现上来说,宏又像汇编程序中的伪指令,因为宏在汇编时将其名称直接替换为相应的代码段。 ARM汇编语言用MACRO和MEND两条伪操作来定义一个宏,其中MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束,中间的代码称为宏定义体。为便于引用,为每个定义的宏要取个名字,称为宏指令。这样在程序中就可以通过宏指令多次调用定义的代码段。,8.6 ARM汇编语言程序宏指令,ARM汇编语言宏指令的其语法格式为: MACRO $label macroname $parameter,$parameter ;code ;code MEND 其中,$label在宏指令被展开时替换成相应的符号,通常是一个标号,在一个符号前使用$表示程序被汇编时将使用相应的值来替换$后的符号;macroname为所定义的宏的名称,即宏指令;$parameter为宏指令的参数,当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数,可以在宏定义时为参数指定相应的默认值;code表示宏定义体中的代码。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号