嵌入式系统概论第八章_第1页
嵌入式系统概论第八章_第2页
嵌入式系统概论第八章_第3页
嵌入式系统概论第八章_第4页
嵌入式系统概论第八章_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章ARM汇编语言程序设计尽管ARM嵌入式系统主要采用C语言作为开发语言,但是一些底层代码和关键代码还是需要用汇编语言编写。因为手工编写的汇编代码能达到最好的优化效果。学习ARM汇编语言程序设计需要有ARM汇编语言编译器。前主要的ARM汇编语言编译器有三个:一个是ARM公司开发的标准ARM汇编语言编译器armasm;另一个是GNU为支持ARM而开发的GNUARM汇编语言编译器

arm-elf-as;还有一个是IAR公司开发的IARARM汇编语言编译器iasmarm。本章主要介绍ADS环境下标准ARM汇编语言程序设计。目录8.1用ADS调试ARM汇编语言程序8.2ARM汇编语言程序基本结构8.3ARM汇编语言程序中的符号和表达式8.4ARM汇编语言伪操作8.5ARM汇编语言程序伪指令8.6ARM汇编语言程序宏指令8.7ARM汇编语言程序子程序8.8GNUARM汇编简介习题8.1用ADS调试ARM汇编语言程序

ADS(ARMDeveloperSuite)是ARM公司推出的ARM系统开发工具,最新版本是1.2。主要应用平台为各种版本的Windows。ARMADS由以下六部分组成:1.代码生成工具(CodeGenerationTools)2.集成开发环境(CodeWarriorIDEfromMetrowerks)3.调试器(Debuggers)4.指令集模拟器(InstructionSetSimulators)5.ARM开发包(ARMFirmwareSuite)6.ARM应用库(ARMApplicationsLibrary)8.1用ADS调试ARM汇编语言程序1.在命令行方式下调试假设ARM汇编语言源程序名为ex3_1.s

用工具armasm汇编ex3_1.s,生成目标代码ex1.o:

c:\asm>armasmex3_1.s–oex1.o

用工具armlink链接目标代码ex1.o,生成可执行文件ex1:

c:\asm>armlinkex1.o–oex1

用工具armsd调试可执行文件ex1:

c:\asm>armsdex18.1用ADS调试ARM汇编语言程序2.在IDE环境下调试创建一个新工程:8.1用ADS调试ARM汇编语言程序2.在IDE环境下调试编译和链接工程:8.1用ADS调试ARM汇编语言程序2.在IDE环境下调试在AXD中调试工程:8.2ARM汇编语言程序基本结构ARM汇编语言程序基本结构包括ARM汇编语言语句格式和ARM汇编语言程序格式,下面分别介绍。1.ARM汇编语言语句格式:ARM汇编语言语句格式如下所示:{symbol}{instruction|pseudo-instruction|directive}{;comment}symbol为符号。instruction为机器指令。pseudo-instruction为伪指令。directive为伪操作。comment为注释。8.2ARM汇编语言程序基本结构2.ARM汇编语言程序结构:ARM汇编语言以段(section)为单位组织汇编语言源程序。段分为代码段和数据段两种,代码段存放执行代码,数据段存放代码段运行时操作的数据。一个ARM汇编语言源程序可以没有数据段,但至少要有一个代码段。一个大的程序可能包含多个代码段和数据段。ARM汇编语言源程序经过汇编链接处理后生成一个可执行的映像文件(elf或axf格式)。该可执行的映像文件通常包括三个部分的内容:一个或多个代码段。代码段通常是只读的。零个或多个包含初始值的数据段。数据段通常是可读写的。零个或多个不包含初始值的数据段。这些数据段被初始化为0,通常是可读写的。8.3ARM汇编语言程序的符号和表达式在ARM汇编语言中,符号包括变量、数字常量、标号和局部标号,表达式包括数字表达式、字符串表达式、逻辑表达式和预定义表达式。1.ARM汇编语言中的符号在ARM汇编语言中,符号可以代表地址、变量和数字常量。变量在ARM汇编语言中,变量包括数字变量、逻辑变量和字符串变量。数字常量在ARM汇编语言中,数字常量是32位的整数。标号标号是程序中的指令或者数据地址的符号。局部标号局部标号是一个0~99之间的数字。8.3ARM汇编语言程序的符号和表达式2.ARM汇编语言中的表达式表达式是由符号、数值、单目或多目操作符以及符号组成的。数字表达式数字表达式由数字常量、数字变量、操作符和括号组成。字符串表达式字符串表达式由字符串常量、字符串变量、字符串操作符和括号组成。逻辑表达式逻辑表达式由逻辑常量{true}和{false}、逻辑变量、关系运算符、逻辑操作符和括号组成,取值范围为{true}或{false}。预定义表达式在ARM汇编语言中,预定义表达式包括各种指令助记符、寄存器名和预定义变量。8.4ARM汇编语言的伪操作在ARM汇编语言中,共有如下6种伪操作,分别是符号定义伪操作、数据定义伪操作、杂项伪操作、汇编控制伪操作、信息报告伪操作和框架描述伪操作。1.符号定义(SymbolDefinition)伪操作

符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名。常见的符号定义伪操作有如下几种:Gable

LCLx

SETxRLIST其他符号定义伪操作8.4ARM汇编语言的伪操作2.数据定义(DataDefinition)伪操作

数据定义伪操作主要包括DCx、SPACE、MAP、FIELD及LTORG。

DCxDCx伪操作用于分配一块数据单元并初始化,主要包括DCB、DCW、DCWU、DCD、DCDU、DCQ、DCQU、DCFS、DCFSU、DCFD、DCFDU、DCI和DCDO。SPACESPACE用于分配一段内存单元,并用0初始化。

MAP和FIELDMAP伪操作和FIELD伪操作配合使用,用来定义结构化内存表的结构。

LTORGLTORG伪操作用于声明一个数据缓冲池(literalpool)的开始。

8.4ARM汇编语言的伪操作3.杂项伪操作

杂项伪操作主要包括AREA、ENTRY、CODE16和CODE32、END、RN、ALIGN、EQU、EXPORT或GLOBAL、EXTERN、GET或INCLUDE、IMPORT、INCBIN、KEEP、NOFP、REQUIRE、REQUIRE8及PRESERVER8和ROUT。8.4ARM汇编语言的伪操作4.汇编控制伪操作

汇编控制伪操作主要用于条件汇编,包括IF类和WHILE类伪操作。IF、ELSE及ENDIFIF类伪操作能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。ENDIFWHILE和WENDWHILE和WEND伪操作能够根据条件重复汇编相同的或者几乎相同的一段源代码。8.4ARM汇编语言的伪操作5.信息报告伪操作

信息报告伪操作用于在汇编过程中报告汇编错误信息和诊断信息,主要包括ASSERT、INFO、OPT、TTL及SUBT。ASSERTASSERT伪操作在汇编编译器对汇编程序的第二遍扫描中,如果发现assertion中条件不成立,则报告错误信息。INFOINFO伪操作支持在汇编处理过程的第一遍扫描或第二遍扫描中报告诊断信息。OPTOPT伪操作在源程序中设置列表选项。8.5ARM汇编语言程序伪指令

ARM汇编语言提供的伪操作和伪指令都是为了方便用户编写汇编语言程序,但二者的使用方法是有区别的。上一节介绍的伪操作只供汇编编译器和连接器在汇编何连接时使用,在程序运行时不会出现任何伪操作,而本节将要介绍的伪指令则在汇编时被汇编编译器替换成能完成该伪指令功能的ARM或Thumb指令序列。ARM伪指令包括ADR、ADRL、LDR和NOP,其中NOP伪指令在汇编时被替换成ARM中的空操作,比如MOVR0,R0,其含义就是什么都不做,但占用了指令周期。本节主要介绍前3个伪指令。8.5ARM汇编语言程序伪指令1.ADR:ADR伪指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中,在编译时被替换成一条合适的指令。其语法格式为:ADR{cond} register,expr其中,cond为指令执行的条件;register为目标寄存器;expr为基于PC或基于寄存器(MAP和FIELD伪操作)的地址表达式,其取值范围为:当地址值不是字对齐时,其取值范围为-255~255。当地址值是字对齐时,其取值范围为-1020~1020(255个字)。在汇编编译器处理源程序时,ADR伪指令通常用一条ADD或SUB指令来实现ADR伪指令的功能。如果不能用一条指令实现ADR伪指令的功能,编译器将报告错误。8.5ARM汇编语言程序伪指令2.ADRL:ADRL伪指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中,ADRL伪指令比ADR伪指令可以读取范围更大的地址,在编译时被替换成2条合适的指令。其语法格式为:ADRL{cond} register,expr其中,cond为指令执行的条件;register为目标寄存器;expr为基于PC或基于寄存器的地址表达式,其取值范围为:当地址值不是字对齐时,其取值范围为-64K~64K。当地址值是字对齐时,其取值范围为-256K~256K。在汇编编译器处理源程序时,ADRL伪指令通常用两条指令来实现ADRL伪指令的功能,即使一条指令可以完成该伪指令的功能,汇编器也将用两条指令来替换该伪指令。8.5ARM汇编语言程序伪指令3.LDR:LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,LDR伪指令比ADRL伪指令可以读取范围更大的地址。其语法格式为:LDR{cond}register,=[expr|label-expr]其中,cond为指令执行的条件;register为目标寄存器;=是LDR伪指令与LDR机器指令区别的标志;expr为32位的常数,编译器将根据expr的取值情况,如下处理LDR伪指令:当expr表示的数值没有超过MOV或MVN指令中立即数的范围时,编译器用合适的MOV或MVN指令来替代LDR伪指令。MOV指令中立即数的范围是0~255或者是能通过循环右移一个8位二进制数偶数次能产生的数(参见7.2节操作数预处理的内容)。当expr表示的数值超过MOV或MVN指令中立即数的范围时,编译器将该数值放到数据缓冲区中,同时用一条基于PC的LDR指令读取该数值。8.6ARM汇编语言程序宏指令宏是汇编语言程序设计中一个非常重要的概念。从功能上来说,宏类似于C语言中的函数,因为宏能实现某种特定的功能,并且还能实现参数传递。从实现上来说,宏又像汇编程序中的伪指令,因为宏在汇编时将其名称直接替换为相应的代码段。ARM汇编语言用MACRO和MEND两条伪操作来定义一个宏,其中MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束,中间的代码称为宏定义体。为便于引用,为每个定义的宏要取个名字,称为宏指令。这样在程序中就可以通过宏指令多次调用定义的代码段。8.6ARM汇编语言程序宏指令ARM汇编语言宏指令的其语法格式为:MACRO{$label}macroname{$parameter{,$parameter}…};code…;codeMEND其中,$label在宏指令被展开时替换成相应的符号,通常是一个标号,在一个符号前使用$表示程序被汇编时将使用相应的值来替换$后的符号;macroname为所定义的宏的名称,即宏指令;$parameter为宏指令的参数,当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数,可以在宏定义时为参数指定相应的默认值;code表示宏定义体中的代码。8.7ARM汇编语言程序子程序

ARM汇编语言程序的子程序调用比较简单。首先,子程序不需要定义,任何一段代码都可以当作子程序,只要在该代码中含有返回的汇编语句即可;其次,调用子程序只需BL或BX指令即可。8.7ARM汇编语言程序子程序

ARM汇编语言程序子程序实例:1 AREA ex10,CODE,READONLY2 ENTRY3 CODE324 ADR r0,start+15 BX r06 CODE167start MOV r0,#108 MOV r1,#39 BL doadd10 stop MOV r0,#0x1811 LDR r1,=0x2002612 SWI 0xAB13 doadd ADD r0,r0,r114 MOV pc,lr15 END8.8GNUARM汇编简介GNU汇编支持多种

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论