嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt

上传人:牧羊曲112 文档编号:6437476 上传时间:2023-10-31 格式:PPT 页数:149 大小:3.46MB
返回 下载 相关 举报
嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt_第1页
第1页 / 共149页
嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt_第2页
第2页 / 共149页
嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt_第3页
第3页 / 共149页
嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt_第4页
第4页 / 共149页
嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt_第5页
第5页 / 共149页
点击查看更多>>
资源描述

《嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统原理与开发Ch4-ARM汇编程序设计新.ppt(149页珍藏版)》请在三一办公上搜索。

1、1,在线教务辅导网:,更多课程配套课件资源请访问在线教务辅导网,嵌入式系统原理与开发,V1.0,ARM汇编程序设计本课程的主要内容,主要内容,4.1 概述4.2 ARM伪操作、宏指令和伪指令详解4.3 ARM汇编语言程序设计4.4 GNU ARM汇编语言4.5 ARM汇编语言程序设计实例附:ARM仿真器中软/硬件断点的讲解,4.1 概述,ARM指令集和Thumb指令集是基于ARM的嵌入式系统程序设计的基础,C语言是嵌入式系统程序设计中使用最广泛的高级语言。本章主要讲述如何应用汇编语言和C语言进行嵌入式系统设计,使读者能够掌握嵌入式程序设计的基本知识、基本方法和基本流程。,4.1 概述,1.开发

2、工具选择ARM开发工具(IDE)一般应该包含编译软件、汇编软件、链接软件、调试软件、嵌入式实时操作系统、函数库、评估板、JTAG仿真器、在线仿真器等。目前,世界上约有四十多家公司提供以上不同类别的产品。常用的ARM集成开发环境(IDE)主要有如下几类:ARM 公司的ARM开发工具GNU的ARM工具链RealView MDK,4.1 概述,1.开发工具选择ARM 公司的ARM开发工具ADSARM Developer Suite。最终版本为1.2。ADS1.2提供完整的WINDOWS界面开发环境。C编译器效率极高,支持C以及C+,使工程师可以很方便的使用C语言进行开发。提供软件模拟仿真功能,使没有

3、Emulators的学习者也能够熟悉ARM的指令系统。配合ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握。ADS1.2需要硬件支持才能发挥强大功能。目前支持的硬件调试器有Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE等。主要工具有armasm、armcc、armlink、fromelf 等。下载电缆:目前大部分JTAG仿真器均支持ARM ADS。,4.1 概述,1.开发工具选择ARM公司的ARM开发工具RVDSRealView Development Suite,RVDS是ARM公司继SDT与ADS1.2之后主推的新一代开发工具,是一套附带支持

4、文档和示例的软件开发应用程序,可用于编写、生成和调试适用于ARM系列处理器的应用程序。RVDS由RealView编译器(RVCT)、RealView汇编器(armasm)、RealView链接器(armlinker),以及RealView调试器(RVDebugger)组成,目前版本为4.0。RVDS支持ARM最新架构下的编译和调试,包括支持V7指令集和NEON技术,支持Cortex A8和M3;RVDS可以直接连接到SoC Designer;支持CoreSight调试技术;Eclipse/Codewarrior集成开发环境。丰富的项目管理系统:基于Eclipse的项目管理器,能支持Linux,

5、Windows平台。,4.1 概述,1.开发工具选择ARM 公司的ARM开发工具RVDSRealView ICE和RealView Trace:这是一种基于JTAG的调试解决方案,用于调试运行在基于ARM体系结构的处理器上的软件。RealView Profiler:这是ARM Workbench IDE的一个插件,可在以最高250 MHz工作频率运行的目标上,对嵌入式软件进行长时间的非侵入分析。RealView Developer Kit:这是多套附带支持文档和示例的工具,可用于编写、生成和调试针对基于特定ARM体系结构的处理器的应用程序。,4.1 概述,1.开发工具选择GNU的ARM工具链G

6、NU提供的编译工具包括汇编器as、C编译器gcc、C+编译器g+、连接器ld和二进制转换工具objcopy。基于ARM平台的工具分别为arm-linux-as、arm-linux-gcc、arm-linux-g+、arm-linux-ld 和arm-linux-objcopy。GNU的所有开发工具都可以从上下载,基于ARM的工具可以从获得。GNU的编译器功能非常强大,共有上百个操作选项,这也是这类工具让初学者头痛的原因。不过,实际开发中只需要用到有限的几个,大部分可以采用缺省选项。,4.1 概述,1.开发工具选择RV MDKRealView Microcontroller Developmen

7、t Kit。德国Keil是颇受业界欢迎的51单片机开发工具,它拥有流畅的用户界面与强大的仿真功能。ARM公司收购Keil之后,正式推出了针对ARM微控制器的开发工具。RV MDK将ARM开发工具RVDS的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。RV MDK根据微控制器调试开发的特点采用了与ADS、RVDS完全不同的调试、仿真环境Vision debugger与simulator。因此MDK与ADS在工具架构组成上有一些不同,这些区别包括:不同的工程管理器,不同版本的ARM编译器(Compiler),不同的调试器(Debugger),不

8、同的仿真器(Simulator),以及不同的硬件调试。,4.1 概述,2.ADS开发工具对初学者推荐选择ARM的ADS开发工具。ADS包括了六个模块,其主要功能如下:代码生成工具(Code Generation Tools):代码生成工具由源程序编译、汇编、链接工具集组成。ARM公司针对ARM系列每一种结构都进行了专门的优化处理,这一点除了作为ARM结构的设计者的ARM公司,其它公司都无法办到。ARM公司宣称,其代码生成工具最终生成的可执行文件最多可以比其它公司工具套件生成的文件小20%。集成开发环境(CodeWarrior IDE from Metrowerks):CodeWarrior I

9、DE包含工程管理器、代码生成接口、语法敏感编辑器、源文件和类浏览器、源代码版本控制系统接口、文本搜索引擎等,其功能与Visual Studio相似,界面风格比较独特。ADS仅在其PC机版本中集成了该IDE。,4.1 概述,2.ADS开发工具ADS包括了六个模块,其主要功能如下:调试器(Debuggers)包括两个应用调试器:ARM扩展调试器AXD(ARM eXtended Debugger)、ARM符号调试器armsd(ARM symbolic debugger)。AXD基于Windows风格,具有一般意义上调试器的所有功能,包括简单和复杂断点设置、栈显示、寄存器和存储区显示、命令行接口等。A

10、rmsd作为一个命令行工具辅助调试或者用在其它操作系统平台上。指令集模拟器(Instruction Set Simulators):用户使用指令集模拟器无需任何硬件即可在PC机上完成一部分调试工作。,4.1 概述,2.ADS开发工具对初学者推荐选择ARM的ADS开发工具。ADS包括了六个模块,其主要功能如下:调试器(Debuggers)包括两个应用调试器:ARM扩展调试器AXD(ARM eXtended Debugger)、ARM符号调试器armsd(ARM symbolic debugger)。AXD基于Windows风格,具有一般意义上调试器的所有功能,包括简单和复杂断点设置、栈显示、寄存

11、器和存储区显示、命令行接口等。Armsd作为一个命令行工具辅助调试或者用在其它操作系统平台上。指令集模拟器(Instruction Set Simulators):用户使用指令集模拟器无需任何硬件即可在PC机上完成一部分调试工作。,4.1 概述,2.ADS开发工具ADS包括了六个模块,其主要功能如下:ADS使用CodeWarrior公司的编译器,几个主要命令如下:armasm.exe:汇编文件编译器 armcc.exe:C文件编译器 armlink.exe:目标文件连接器 fromelf.exe:将axf或者elf格式转换成其它格式,如二进制。armprof.exe:对调试过程中生成的prof

12、iling记录文件做分析用。ADS IDE开发环境下的位操作和宏指令:符号定义(Symbol Definition)伪操作;数据定义(Data Definition)伪操作;汇编控制(Assembly Control)伪操作;框架描述(Frame Description)伪操作;信息报告(Reporting)伪操作;其它(Miscellaneous)伪操作;,4.2 ARM伪操作、宏指令和伪指令详解,概述ARM汇编语言源程序语句一般都由指令、伪操作、宏指令和伪指令组成,ARM汇编语言的设计基础是ARM指令、汇编伪指令、汇编伪操作和宏指令。伪操作是ARM汇编语言程序里的一些特殊的指令助记符,其作

13、用是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行。亦即,这些伪操作只在汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失。宏指令是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用。,4.2 ARM伪操作、宏指令和伪指令详解,概述通过直接书写宏名来使用宏,并具有宏指令的格式输入输出参数。宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中。伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指

14、令,从而实现真正的指令操作。伪操作、宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则。,4.2 ARM伪操作、宏指令和伪指令详解,概述几种微操作类型符号定义(Symbol Definition)伪操作数据定义(Data Definition)伪操作汇编控制(Assemblly Control)伪操作框架描述(Frame Description)伪操作信息报告(Reporting)伪操作其它(Miscellaneous)伪操作,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作符号定义(Symbol Definition)伪操作主要

15、实现ARM汇编程序中的变量定义、变量赋值,定义寄存器名称等。,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作GBLA、GBLL、GBLSGBLA:声明一个全局算术变量,初始化为0;A=算术。GBLL:声明一个全局逻辑变量,初始化为F;L=逻辑。GBLS:声明一个全局字符串变量,初始化为空;S=string语法格式:Variable格式说明GBLX=GBLA、GBLL、GBLS;Variable是全局变量名称应该是全局唯一的;对已声明过的变量,重新声明时,将被重新初始化;作用范围:为包含该变量的源程序。,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作GBLA、GB

16、LL、GBLS实例,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作LCLA、LCLL、LCLSLCLA:声明一个局部算术变量,并初始化为0;LCLL:声明一个局部逻辑变量,并初始化为FALSE;LCLS:声明一个局部字符串变量,并初始化为空串“”;语法格式:Variable格式说明LCLX=LCLA、LCLL、LCLSVariable:局部变量名称应该是作用范围内唯一的;对已声明过的变量,重新声明时,将被重新初始化;作用范围:局部变量一般只用于宏代码中;,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作LCLA、LCLL、LCLS实例,4.2 ARM伪操作、宏指令

17、和伪指令详解,1.符号定义类伪操作SETA、SETL、SETSSETA:给一个全局或局部算术变量赋值;SETL:给一个全局或局部逻辑变量赋值;SETS:给一个全局或局部字符串变量赋值;语法格式:VariableExpression格式说明SETX=SETA、SETL、SETSVariable:是用GBLA、GBLL、GBLS和LCLA、LCLL、LCLS定义的变量;Expression是赋值表达式;只能对已经声明的变量赋值;,4.2 ARM伪操作、宏指令和伪指令详解,1.符号定义类伪操作SETA、SETL、SETS实例,4.2 ARM伪操作、宏指令和伪指令详解,符号定义类伪操作RLISTRLI

18、ST:为一个通用寄存器列表定义名称;语法格式:NameRLISTlist of registers格式说明Name:寄存器列表定义名称;list of registers:寄存器列表;RLIST定义的名称可以在LDM|STM中使用;实例,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作数据定义(Data Definition)伪操作用于:数据缓冲池定义;数据表定义;数据空间分配。,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作LTORGLTORG:声明一个数据缓冲池的首地址;在使用LDR指令时,常需要用LTORG声明数据缓冲池。语法格式:LTORG;literal

19、 Original格式说明用LTORG定义数据缓冲池,可以防止LDR越界;LTORG伪操作指令通常放在无条件转移指令之后,或者子程序返回指令之后,以免处理器错误地将数据缓冲器中的数据当作代码执行;大的代码段可以使用多个数据缓冲池;ARM汇编器一般把数据缓冲池放在代码段的最后面,即下一个代码段开始之前,或者END伪操作之前;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作LTORG实例,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAPMAP声明一个结构化的内存表(Storage Map)的首地址;MAP可用“”代替;内存表的位置计数器VAR(汇编器的内置变量)

20、设置成该地址;语法格式:MAPExpression,base-register格式说明Expression为数字表达式,或者程序中已经定义过的标号;base-register为一个寄存器,可选;位置计数器VAR初值:当base-register不存在时,VAR=Expression;当base-register存在时,VAR=base-register+Expression;MAP和FIELD配合使用来定义结构化内存表;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP实例,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作FIELDFIELD:声明一个结构化的

21、内存表的数据域;FIELD可用“#”代替;语法格式:LabelFIELD Expression,base-register格式说明Label的值是当前内存表位置计数器VAR的值,可选;Expression表示本数据域所占用的字节数。汇编编译到FIELD语句时,VAR+=Expression;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP与FIELD的联合使用使用方法:MAP声明一个结构化内存表的首地址;FIELD声明表中的数据域;MAP的base-register是其后的所有的FIELD的默认值,直到遇到新的MAP的base-register;MAP与FIELD仅仅定义

22、了数据表的结构,并没有实际分配内存单元;MAP与FIELD可以定义三种数据表:基于绝对地址的内存表;基于相对地址的内存表;基于PC地址的内存表;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP与FIELD的联合使用基于绝对地址的内存表;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP与FIELD的联合使用基于相对地址的内存表;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP与FIELD的联合使用基于PC地址的内存表;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作MAP与FIELD的联合使用特殊应用FIELD的操

23、作数为0时,其标号即为当前内存单元的地址,可以用该方法判断内存的使用是否越界;访问数据范围超过4KB:由于基于相对地址的内存表、基于PC地址的内存表,其表中各域的实际内存地址都是基于寄存器的内容,因此寻址空间可以扩大到4GB;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作SPACESPACE:用于分配一块连续的内存空间;SPACE可用“%”代替;语法格式:LabelSPACEExpression格式说明:Label可选;Expression的个数为字节数;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作DCBDCB:用于分配一段字节内存单元并用Expressi

24、oni初始化;DCB可用“=”代替;语法格式:LabelDCBExpression1,Expression2,格式说明:Label可选;Expression为一个-128256的数值或者字符串;,4.2 ARM伪操作、宏指令和伪指令详解,2.数据定义类伪操作DCD和DCDUDCD:用于分配一段字对齐内存空间并用Expressioni初始化;DCD可用“&”代替;DCDU:用于分配一段内存空间并用Expressioni初始化,但不严格要求字对齐;语法格式:LabelDCD(U)Expression1,Expression2,格式说明:Label可选;Expression为一个数字表达式或者程序中

25、得标号,内存分配的字节数由Expression的个数决定;,4.2 ARM伪操作、宏指令和伪指令详解,3.汇编控制类伪操作汇编控制(Assembly Control)伪操作包括:条件汇编;宏定义;重复汇编控制等。,4.2 ARM伪操作、宏指令和伪指令详解,3.汇编控制类伪操作IFELSEENDIF与C语言的IF语句很类似;语法格式:IFLogical Expression;指令或者伪指令代码段1ELSE;可选;指令或者伪指令代码段2ENDIF格式说明:Logical Expression:用于控制选择的逻辑表达式;IFELSEENDIF可嵌套使用;,4.2 ARM伪操作、宏指令和伪指令详解,3

26、.汇编控制类伪操作IFELSEENDIF实例5.15,4.2 ARM伪操作、宏指令和伪指令详解,3.汇编控制类伪操作WHILEWEND与C语言的WHILE语句很类似;语法格式:WHILELogical Expression;指令或者伪指令代码段WEND格式说明:Logical Expression:用于控制选择的逻辑表达式;WHILEWEND可嵌套使用;实例,4.2 ARM伪操作、宏指令和伪指令详解,3.汇编控制类伪操作MACRO、MEND、MEXITMACRO:宏定义开始;MEND:宏定义结束;MEXIT:从宏中跳出。语法格式:MACRO$label macroname,$parameter

27、,$parameter$label.labelsub;$label.labelsub为宏体内部标号;宏体,宏代码,指令代码段MEND格式说明:Label:宏指令标号,可选;Macroname:宏名称,必须;,4.2 ARM伪操作、宏指令和伪指令详解,3.汇编控制类伪操作MACRO、MEND、MEXIT格式说明:Parameter:宏指令参数,可选;在一个符号前使用$:表示在被汇编时,该符号将被替换成相应的值;宏定义可嵌套使用;,4.2 ARM伪操作、宏指令和伪指令详解,4.信息报告类伪操作信息报告伪操作用于汇编报告指示。ASSERTASSERT:断言错误,在汇编第二遍中,如果ASSERT条件不

28、满足,报告错误;可用于汇编源程序错误调试语法格式:ASSERTLogical ExpressionLogical Expression:用于控制选择的逻辑表达式;实例5.18:ASSERT ASSERTTOPTemp;断言top不等于Temp,4.2 ARM伪操作、宏指令和伪指令详解,4.信息报告类伪操作INFOINFO:汇编诊断信息显示,在汇编中INFO报告诊断信息;可用于汇编源程序错误调试;语法格式:INFONumeric-Expression,String-ExpressionNumeric-Expression:数字表达式;String-Expression:INFO显示字符串Stri

29、ng-Expression;Numeric-Expression=0时,汇编第二遍扫描时,显示String-Expression;Numeric-Expression 0时,汇编第一遍扫描时,显示String-Expression,并终止汇编;,4.2 ARM伪操作、宏指令和伪指令详解,4.信息报告类伪操作OPTOPT:设置列表选项伪操作;语法格式:OPTnn:选项编码n=2m,如n=1表示设置默认列表选项,n=2表示关闭默认列表选项;在编译过程中,使用-list选项可以生成默认列表;使用OPT可以改变默认列表。TTL和SUBTTTL:在列表文件的每一页开头插入一个标题;SUBT:在列表文件的

30、每一页开头插入一个子标题;语法格式:TTLtitleSUBTsubtitletitle和subtitle:是标题和子标题;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作其它(Miscellaneous)伪操作包括:CODE16CODE32EQUAREAENTRY等。,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作CODE16、CODE32CODE16:告诉编译器后面的指令是16位的Thumb指令;CODE32:告诉编译器后面的指令是32位的ARM指令;语法格式:CODE16,CODE32,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作EQUEQU:为数字常量、基

31、于寄存器的值、程序标号定义一个名称;可以用“*”代替;EQU类似于C语言的#define。语法格式:NameExpression,TypeName:由EQU定义的名称;Expression:地址值、程序标号、数字常量(32位常量、32位地址)Type:属性值说明CODE16表明该地址处于Thumb指令区;CODE32表明该地址处于ARM指令区;DATA表明该地址处于数据区;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作AREA含义AREA定义一个代码段或者数据段;通常可用AREA伪操作将程序分为多个ELF(可执行连接文件,由连接器生成)段;一个程序包含多个代码段和数据段,至少包含一

32、个代码段;ARM程序一般采用分段设计,一个程序至少有一个代码段。语法格式:AREA SectionName,Attr,AttrSectionName:为定义一个代码段或者数据段的名称;当名称以数字开头时,必须用|括起来,如|1_data|;|.text|表示C语言编译产生的代码,或者与C语言库相连接的代码;Attr:属性值如下,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作AREAAttr:属性值如下,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作ENTRYENTRY:定义一个程序入口点。语法格式:ENTRY一个程序可以有多个汇编源程序,而一个汇编源程序最多只能有一个ENT

33、RY(可以没有);一个程序可以有多个ENTRY,但至少要有一个ENTRY;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作ENDEND:定义一个程序结束点;告诉编译器源程序已经到了结尾。语法格式:END一个汇编源程序包含END;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作ALIGNALIGN:定义补丁字节,使当前位置满足一定的对齐方式。语法格式:ALIGNExpression,offsetExpression:对齐方式,取值为2的幂次1、2、;默认为字对齐。offset:对齐偏移;默认为offset=0,将当前位置对齐到以Expression为单位的边界;如“ALIGN

34、8”,将当前位置以2个字的方式对齐;如果指定offset,将当前位置对齐到以Expression为单位的边界,再加上offset个字节的位置;如果当前位置为0 x0001,则执行“ALIGN4,3”后当前位置转到0 x0007;特定对齐Thumb的伪指令ADR要求地址是字对齐的,而Thumb代码中的地址标号可能不是字对齐的,这时就要求ALIGN4;ARM中的Cache采用其它对齐方式,如16字节对齐,这时使用ALIGN,可以提高Cache的性能优势;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作ALIGN语法格式:ALIGNExpression,offset特定对齐LDRD/STR

35、D指令要求内存单元是8字节对齐,这样在为LDRD/STRD指令分配内存单元前,要求使用使用ALIGN8,实现8字节对齐。地址标号通常没有对齐方式,而在ARM代码中要求字对齐,Thumb代码中要求半字对齐,这样就要求使用ALIGN调整对齐方式;在AREA中使用ALIGN属性时的Expression与单独使用ALIGN为操作时的Expression,其含义是不同的;,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作EXPORT、GLOBALEXPORT、GLOBAL:声明一个符号可以被其它文件引用,相当于声明一个全局变量。语法格式:EXPORTsymbolWEAKGLOBALsymbolW

36、EAKSymbol未声明的符号名称,区分大小写。WEAK选项表示其它同名符号名称优先于本符号。,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作IMPORT、EXTERNIMPORT:声明当前符号不是在本源文件中定义的,本源文件可能引用该符号。语法格式:IMPORTsymbolWEAKEXTERNsymbolWEAKSymbol未声明的符号名称,区分大小写。WEAK选项表示如果Symbol在所有源文件中都没有定义,编译器不报错,亦不会到没有被INCLUDE包含进来的文件中去查找。在B或BL指令中,如Bsign指令,如果sign不能被解析,则该指令相当于NOP,即sign被解析为下一条指

37、令的地址。其它情况下该符号被解析为0。,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作GET、INCLUDEGET、INCLUDE:将另一个源文件包含到当前源文件中,并将被包含的文件在当前位置汇编,二者同义。语法格式:GET/INCLUDEfilenameFilename为被包含源文件,可以使用路径信息。路径中可以有空格。通常可以在一个源文件中定义宏,用EQU定义常量,用MAP和FIELD定义数据结构等,然后用GET包含次文件。GET可以嵌套。编译器查找目录为当前目录,用编译器的-I选项添加查找目录。如果源文件A包含源文件B,源文件B包含源文件C,那么编译器查找源文件C时,会把源文件

38、B所在的目录作为当前目录。,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作INCBININCBIN:将另一个源文件包含到当前源文件中,被包含的文件不进行汇编。语法格式:INCBINfilenameFilename为被包含源文件,可使用路径信息。但路径中不能有空格。通常使用INCBIN将一个可执行文件或数据文件包含到当前文件。KEEPKEEP:将局部符号包含在目标文件的符号表中。语法格式:KEEPsymbolSymbol:为所要包含的局部标号。如果没有指定symbol,则除了基于寄存器的所有的符号将被包含在目标文件的符号表中。默认:被输出的符号;被重定位的符号。,4.2 ARM伪操作、

39、宏指令和伪指令详解,5.其它伪操作NOFPNOFP:禁止程序中包含浮点运算指令。语法格式:NOFP当系统中没有硬件或软件方针代码支持浮点运算,则使用NOFP。REQUIREREQUIRE:制定段之间的相互依赖关系。语法格式:REQUIR labelLabel:为所需的标号名称;当进行链接处理包含有REQUIR label的源文件时,则定义label的源文件也将被包含。,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作REQUIRE8、PRESERVE8REQUIRE8:指示当前代码中要求数据段8字节对齐。PRESERVE8:表示当前代码中数据段是8字节对齐的。语法格式:REQUIRE8

40、/PRESERVE8例如在使用LDRD和SDRD指令时,要求内存单元是8字节对齐的。当程序中使用这些指令时,就需要使用REQUIRE8。链接器要保证要求8字节对齐的数据栈代码只能被数据栈是8字节对齐的代码调用。RNRN:为一个特定的寄存器定义名称;语法格式:NameRNExperssionName:定义的寄存器名称;Experssion:某个寄存器的编号;COUNTRN6;定义寄存器R6为COUNT,4.2 ARM伪操作、宏指令和伪指令详解,5.其它伪操作ROUTROUT:定义局部变量的有效范围;语法格式:NameROUTName:为所定义的作用范围的名称;当不使用ROUT时,局部变量的作用范

41、围是所在的段;ROUT的作用范围是同一个段中两个ROUT之间的有效范围;,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解ARM伪指令不是真正的ARM指令,在编译器进行汇编时,被替换成相应的ARM指令。ARM汇编语言伪指令:ADRADRLLDRNOP,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解ADR:小范围地址读取伪指令ADR:将基于PC或寄存器的地址值读取到寄存器中。语法格式:ADRcondregister,expressionCond:可执行条件;Register:目标寄存器;Expression:基于PC或寄存器的地址值表达式,其取值范围:当地址

42、值是字节对齐时,其值范围为:-256+256字节;当地址值是字对齐时,其值范围为:-1020+1020字节;当地址值是16字节对齐时,其值范围更大((-256+256)*16);编译器通常将ADR伪指令替换成一条ADD指令或SUB指令来实现ADR伪指令的功能;如果不能用一条指令来替换,则报错。ADR伪指令中的地址是基于PC或寄存器的相对偏移量,所以ADR实际读取的地址是与位置无关的地址。当ADR伪指令中的Expression是基于PC的相对偏移量时,该地址必须与ADR在同一代码段中,否则连接可能越界。,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解ADR:小范围地址读取伪指

43、令,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解ADRL:中等范围地址读取伪指令ADRL:将基于PC或寄存器的地址值读取到寄存器中;语法格式:ADRLcondregister,expressionCond:可执行条件;Register:目标寄存器;Expression:基于PC或寄存器的地址值表达式,其取值范围:当地址值是字对齐时,其值范围为:-256K+256K字节;当地址值不是字对齐时,其值范围为:-64K+64K字节;当地址值是16字节对齐时,其值范围更大;编译器通常将ADRL伪指令替换成二条合适的数据处理指令来实现ADRL伪指令的功能,即使能用一条指令实现,也必须

44、用二条;否则报错。ADRL伪指令中的地址是基于PC或寄存器的相对偏移量,所以ADR实际读取的地址是与位置无关的地址。当ADR伪指令中的Expression是基于PC的相对偏移量时,该地址必须与ADR在同一代码段中,否则连接可能越界。,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解ADRL:中等范围地址读取伪指令,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解LDR:大范围地址读取伪指令LDR:将一个32位的立即数或者一个地址读取到寄存器中。语法格式:LDRcond register,=expression|label_ expressionCond:可执

45、行条件;Register:目标寄存器;Expression:为32位常量;编译器的处理:当Expression表示的地址在MOV和MVN指令中地址的取值范围内时,编译器将用MOV或MVN代替LDR;当Expression表示的地址超过MOV和MVN指令中地址的取值范围时,编译器将该数据存到数据缓冲区,然后用一条基于PC的LDR读取该值;label_expression为基于PC的地址表达式时,编译器一般将该数据存放到数据缓冲区,然后用一条LDR读取该值;label_expression为外部地址表达式或者非当前段的表达式时,编译器将在目标文件中插入连接重定位伪操作;,4.2 ARM伪操作、宏指

46、令和伪指令详解,6.ARM汇编伪指令详解LDR:大范围地址读取伪指令两种用途:当需要读取到寄存器的数据超过MOV或MVN指令可操作的范围时,使用LDR;将一个基于基于PC地址值或者外部地址值读取到寄存器中时;,4.2 ARM伪操作、宏指令和伪指令详解,6.ARM汇编伪指令详解NOP:空操作伪指令NOP:NOP伪指令被替换成ARM空操作,如MOV R0,R0;语法格式:NOP,4.2 ARM伪操作、宏指令和伪指令详解,7.Thumb汇编伪指令详解Thumb伪指令不是真正的Thumb指令,在编译器进行汇编时,被替换成相应的Thumb指令。Thumb汇编语言伪指令:ADR、LDR、NOP。,4.3

47、ARM汇编语言程序设计,1.ARM汇编语言程序设计概述ARM程序设计分类ARM程序设计主要包括三种方法:ARM汇编语言程序设计;嵌入式C语言程序设计;嵌入式C语言与ARM汇编语言混合程序设计。ARM汇编中的文件格式ARM源程序文件类型如表5.3所示。ARM工程:在ARM程序设计中,用工程组织文件的。ARM工程主要包括多个ARM汇编语言源程序、C源程序、头文件等。,4.3 ARM汇编语言程序设计,2.ARM汇编语言语句格式(1)语句格式基本格式:symbolinstruction|directive|pseudo-instruction;格式说明symbol:符号,ARM中符号必须从一行的开头开

48、始;在指令和伪指令中,符号用作地址标号;在伪操作中,符号用作变量或者常量;instruction:汇编指令ARM中指令不能从一行的开头开始;directive:伪指令,不能从一行的开头开始;pseudo-instruction:伪操作,不能从一行的开头开始;;comment:注释以“;”开头,不能从一行的开头开始;在指令、伪指令和伪操作中,助记符可以全部是大写或小写(不区分),但是在一个助记符中不能大小写字符混合使用;可以用“”把一行语句分成若干行来写,但是要求“”后紧跟指令中的字符,也不能有空格制表符等。,4.3 ARM汇编语言程序设计,2.ARM汇编语言语句格式(2)符号定义符号可以代表地

49、址、变量、数字常量;当符号代表地址时又称为地址常量;符号包括变量、数字常量、标号和局部标号。符号说明符号可以是标号、变量、数字常量等;符号可以由字母大小写、数字、下划线组成,但符号区分大小写;符号在起作用范围内是唯一的,符号不能和系统预定义符号的相同;变量三种类型变量:数字变量、逻辑变量、字符串变量;数字变量:取值范围是数字常量和数字表达式所能表示的数值范围;逻辑变量:其取值范围是TRUE和FALSE;字符串变量:其取值范围是串表达式所能表示的数值范围;,4.3 ARM汇编语言程序设计,2.ARM汇编语言语句格式(2)符号定义变量变量定义由GBLA、GBLL、GBLS声明全局变量;由LCLA、

50、LCLL、LCLS声明局部变量;使用SETA、SETL、SETS为变量赋初值;变量的类型在程序中是不能改变的;数字常量三种数字常量:十进制、十六进制、n进制;十进制:如43、6、112等;十六进制:如0 x321、0 xFF等;n进制:n_XXX,n取值29,X取值0n-1;如2_01011、8_34572;数字常量定义:使用EQU定义数字常量;数字常量定义后,就不能再改变;,4.3 ARM汇编语言程序设计,2.ARM汇编语言语句格式(2)符号定义全局标号全局标号定义:在一行中,顶头书写就定义了一个全局标号;全局标号不能以数字开头;标号表示指令或数据地址,一般有三种标号;基于PC的标号:表示跳

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号