嵌入式系统原理与开发 Ch4-ARM汇编程序设计新课件_第1页
嵌入式系统原理与开发 Ch4-ARM汇编程序设计新课件_第2页
嵌入式系统原理与开发 Ch4-ARM汇编程序设计新课件_第3页
嵌入式系统原理与开发 Ch4-ARM汇编程序设计新课件_第4页
嵌入式系统原理与开发 Ch4-ARM汇编程序设计新课件_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

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

文档简介

1、在线教务辅导网: 更多课程配套课件资源请访问在线教务辅导网1嵌入式系统原理与开发V1.0ARM汇编程序设计本课程的主要内容主要内容4.1 概述4.2 ARM伪操作、宏指令和伪指令详解4.3 ARM汇编语言程序设计4.4 GNU ARM汇编语言4.5 ARM汇编语言程序设计实例附:ARM仿真器中软/硬件断点的讲解4.1 概述1. 开发工具选择ARM开发工具(IDE)一般应该包含编译软件、汇编软件、链接软件、调试软件、嵌入式实时操作系统、函数库、评估板、JTAG仿真器、在线仿真器等。目前,世界上约有四十多家公司提供以上不同类别的产品。常用的ARM集成开发环境(IDE)主要有如下几类:ARM 公司的

2、ARM开发工具GNU的ARM工具链RealView MDK4.1 概述1. 开发工具选择ARM 公司的ARM开发工具ADSARM Developer Suite。最终版本为1.2。ADS1.2提供完整的WINDOWS界面开发环境。C编译器效率极高,支持C以及C+,使工程师可以很方便的使用C语言进行开发。提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统。配合ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握。ADS1.2需要硬件支持才能发挥强大功能。目前支持的硬件调试器有Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE等

3、。主要工具有armasm、armcc、armlink、fromelf 等。下载电缆:目前大部分JTAG仿真器均支持ARM ADS。4.1 概述1. 开发工具选择ARM 公司的ARM开发工具RVDSRealView ICE和RealView Trace:这是一种基于JTAG的调试解决方案,用于调试运行在基于ARM体系结构的处理器上的软件。 RealView Profiler:这是ARM Workbench IDE的一个插件,可在以最高250 MHz工作频率运行的目标上,对嵌入式软件进行长时间的非侵入分析。RealView Developer Kit:这是多套附带支持文档和示例的工具,可用于编写、

4、生成和调试针对基于特定ARM体系结构的处理器的应用程序。4.1 概述1. 开发工具选择GNU的ARM工具链GNU提供的编译工具包括汇编器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

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

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

7、成开发环境(CodeWarrior IDE from Metrowerks):CodeWarrior IDE包含工程管理器、代码生成接口、语法敏感编辑器、源文件和类浏览器、源代码版本控制系统接口、文本搜索引擎等,其功能与Visual Studio相似,界面风格比较独特。ADS仅在其PC机版本中集成了该IDE。4.1 概述2. ADS开发工具ADS包括了六个模块,其主要功能如下:调试器(Debuggers)包括两个应用调试器:ARM扩展调试器AXD(ARM eXtended Debugger)、ARM符号调试器armsd(ARM symbolic debugger)。AXD基于Windows风格

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

9、。AXD基于Windows风格,具有一般意义上调试器的所有功能,包括简单和复杂断点设置、栈显示、寄存器和存储区显示、命令行接口等。Armsd作为一个命令行工具辅助调试或者用在其它操作系统平台上。指令集模拟器(Instruction Set Simulators):用户使用指令集模拟器无需任何硬件即可在PC机上完成一部分调试工作。4.2 ARM伪操作、宏指令和伪指令详解概述ARM汇编语言源程序语句一般都由指令、伪操作、宏指令和伪指令组成,ARM汇编语言的设计基础是ARM指令、汇编伪指令、汇编伪操作和宏指令。伪操作是ARM汇编语言程序里的一些特殊的指令助记符,其作用是为完成汇编程序做各种准备工作,

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

11、指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则。4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作符号定义(Symbol Definition)伪操作主要实现ARM汇编程序中的变量定义、变量赋值,定义寄存器名称等。4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作GBLA、GBLL、GBLSGBLA:声明一个全局算术变量,初始化为0;A=算术。GBLL:声明一个全局逻辑变量,初始化为F;L=逻辑。GBLS:声明一个全局字符串变量,初始化为空;S=string语法格式:Variable格式说明GBLX = GBLA、GBLL

12、、GBLS;Variable是全局变量名称应该是全局唯一的;对已声明过的变量,重新声明时,将被重新初始化;作用范围:为包含该变量的源程序。4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作GBLA、GBLL、GBLS实例实例5. 1GBLAArithmetic;声明一个全局算术变量ArithmeticSETA0 xFF;赋初值SPACEArithmetic;使用该变量GBLLLogical;声明一个全局逻辑变量LogicalSETLTRUE;赋初值4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作LCLA、LCLL、LCLSLCLA:声明一个局部算术变量,并初始化为0;LC

13、LL:声明一个局部逻辑变量,并初始化为FALSE;LCLS:声明一个局部字符串变量,并初始化为空串“”; 语法格式:Variable格式说明LCLX = LCLA、LCLL、LCLSVariable:局部变量名称应该是作用范围内唯一的;对已声明过的变量,重新声明时,将被重新初始化;作用范围:局部变量一般只用于宏代码中;4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作LCLA、LCLL、LCLS实例实例5. 2MACRO;声明一个宏$labelmessage$a;宏原型,宏名称:message,宏参数:aLCLSString;声明一个局部字符串变量StringStringSETS“e

14、rror”;赋初值$label;代码SPACEArithmetic;使用该变量INFO0,” String”:CC: :STR:$a;使用该字符串MEND;宏定义结束4.2 ARM伪操作、宏指令和伪指令详解1.符号定义类伪操作SETA、SETL、SETSSETA:给一个全局或局部算术变量赋值;SETL:给一个全局或局部逻辑变量赋值;SETS:给一个全局或局部字符串变量赋值;语法格式:VariableExpression格式说明SETX = SETA、SETL、SETSVariable:是用GBLA、GBLL、GBLS和LCLA、LCLL、LCLS定义的变量;Expression是赋值表达式;只

15、能对已经声明的变量赋值;4.2 ARM伪操作、宏指令和伪指令详解符号定义类伪操作RLISTRLIST:为一个通用寄存器列表定义名称;语法格式:NameRLISTlist of registers格式说明Name:寄存器列表定义名称;list of registers:寄存器列表;RLIST定义的名称可以在LDM|STM中使用;实例实例5. 4ALISTRLIST R0-R3;将R0-R3声明伪ALISTSTMDFSP!ALIST;保存寄存器列表ALIST4.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作数据定义(Data Definition)伪操作用于:数据缓冲池定义;数据表定义

16、;数据空间分配。4.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作LTORG实例实例5. 5AREAExample, CODE, READONLY;声明代码段Example,只读属性StartBLFunc1; ; Func1;子程序Func1LDRR1,=0 x8765;将0 x8000加载到R1MOVPC,LR;子程序结束LTORG;定义数据缓冲池,存放0 x8765DATASPACE40;从当前地址开始分配40B内存单元,初始化伪04.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作MAPMAP声明一个结构化的内存表(Storage Map)的首地址;MAP可用“”代

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

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

19、LD声明表中的数据域;MAP的base-register是其后的所有的FIELD的默认值,直到遇到新的MAP的base-register;MAP与FIELD仅仅定义了数据表的结构,并没有实际分配内存单元;MAP与FIELD可以定义三种数据表:基于绝对地址的内存表;基于相对地址的内存表;基于PC地址的内存表;4.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作MAP与FIELD的联合使用基于绝对地址的内存表;实例5. 7:基于绝对地址的内存表 MAP0 x2000;内存表首地址0 x2000ConstaFIELD4;consta长度为4B,相对地置为0ConstbFIELD4;cons

20、tb长度为4B,相对地置为4XFIELD8;X长度为8B,相对地置为8YFIELD8;Y长度为8B,相对地置为16StringFIELD16;String长度为16B,相对地置为244.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作MAP与FIELD的联合使用基于相对地址的内存表;实例5. 8:基于相对地址的内存表MAP0,R9;内存表首地址为R9的值ConstaFIELD4;consta长度为4B,相对地置为0ConstbFIELD4;constb长度为4B,相对地置为4XFIELD8;X长度为8B,相对地置为8YFIELD8;Y长度为8B,相对地置为16StringFIELD1

21、6;String长度为16B,相对地置为244.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作MAP与FIELD的联合使用基于PC地址的内存表;实例5. 9:基于PC地址的内存表DATASSPACE100;分配100字节的内存单元,并初始化为0MAPDATAS;内存表首地址为DATAS内存单元ConstaFIELD4;consta长度为4B,相对地置为0ConstbFIELD4;constb长度为4B,相对地置为4XFIELD8;X长度为8B,相对地置为8YFIELD8;Y长度为8B,相对地置为16StringFIELD16;String长度为16B,相对地置为244.2 ARM伪

22、操作、宏指令和伪指令详解2. 数据定义类伪操作MAP与FIELD的联合使用特殊应用FIELD的操作数为0时,其标号即为当前内存单元的地址,可以用该方法判断内存的使用是否越界;访问数据范围超过4KB:由于基于相对地址的内存表、基于PC地址的内存表,其表中各域的实际内存地址都是基于寄存器的内容,因此寻址空间可以扩大到4GB;实例5. 10:越界判断StartEQU0 x1000;分配的内存首地址EndEQU0 x2000;分配的内存末地址MAPStart;内存表首地址为Start内存单元ConstaFIELD4;consta长度为4B,相对地置为0ConstbFIELD4;constb长度为4B,

23、相对地置为4XFIELD8;X长度为8B,相对地置为8YFIELD8;Y长度为8B,相对地置为16StringFIELDMaxlen;String长度为Maxlen B,相对地置为24EndalertFIELD0;Endalert用于检测内存是否越界ASSERTEndalertend,越界时,报错End4.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作SPACESPACE:用于分配一块连续的内存空间;SPACE可用“%”代替;语法格式:LabelSPACEExpression格式说明:Label可选;Expression的个数为字节数;实例5. 12:DataSPACE100;分配

24、100字节内存单元,并初始化为04.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作DCBDCB:用于分配一段字节内存单元并用Expressioni初始化;DCB可用“=”代替;语法格式:LabelDCBExpression1, Expression2, 格式说明:Label可选;Expression为一个-128256的数值或者字符串;实例5. 13StringDCB“students”;构造一个字符串,并以字节为单位分配内存4.2 ARM伪操作、宏指令和伪指令详解2. 数据定义类伪操作DCD和DCDUDCD:用于分配一段字对齐内存空间并用Expressioni初始化;DCD可用“

25、&”代替;DCDU:用于分配一段内存空间并用Expressioni初始化,但不严格要求字对齐;语法格式:LabelDCD(U) Expression1,Expression2, 格式说明:Label可选;Expression为一个数字表达式或者程序中得标号,内存分配的字节数由Expression的个数决定;实例5. 14Data1DCD1,5,10;分配一个字单元,且字对齐。其值分别为1、5、10Data2DCDUAddr+10;分配一个字单元,其值为addr+104.2 ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作汇编控制(Assembly Control)伪操作包括:条件汇编;宏

26、定义;重复汇编控制等。4.2 ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作IFELSEENDIF与C语言的IF语句很类似;语法格式:IFLogical Expression;指令或者伪指令代码段1ELSE;可选;指令或者伪指令代码段2ENDIF格式说明:Logical Expression:用于控制选择的逻辑表达式;IFELSEENDIF可嵌套使用;4.2 ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作IFELSEENDIF实例5.15实例5. 15:IFELSEENDIFIFVariable= 16;如果Variable=16成立,则编译下面代码BNCSUB1;LDRR0,

27、 =SUB0;ELSE;否则,编译下面代码BNESUB0;ENDIF;4.2 ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作WHILEWEND与C语言的WHILE语句很类似;语法格式:WHILELogical Expression;指令或者伪指令代码段WEND格式说明:Logical Expression:用于控制选择的逻辑表达式;WHILEWEND可嵌套使用;实例实例5. 16:WHILEWENDCountSETA16;设置循环计数变量Count,初值设置为1WHILECount= 4;CountSETACount + 1;设置循环计数变量Count,初值设置为1;WEND;4.2

28、ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作MACRO、MEND、MEXITMACRO:宏定义开始;MEND:宏定义结束;MEXIT:从宏中跳出。语法格式:MACRO$label macroname,$parameter,$parameter$label.labelsub;$label.labelsub为宏体内部标号; 宏体,宏代码,指令代码段MEND格式说明:Label:宏指令标号,可选;Macroname:宏名称,必须;4.2 ARM伪操作、宏指令和伪指令详解3. 汇编控制类伪操作MACRO、MEND、MEXIT格式说明:Parameter:宏指令参数,可选;在一个符号前使用$:

29、表示在被汇编时,该符号将被替换成相应的值;宏定义可嵌套使用;实例5. 17:WHILEWENDMACRO;宏定义开始$labeljump$a,$b;宏名称,宏参数;$label.loop1;宏体内部标号;BGE$label.loop1;$label.loop2;BL$a;BGT$label.loop2;宏体内部标号;$a为子程序名称ADR$b;MEND;宏定义结束4.2 ARM伪操作、宏指令和伪指令详解4. 信息报告类伪操作信息报告伪操作用于汇编报告指示。ASSERTASSERT:断言错误,在汇编第二遍中,如果ASSERT条件不满足,报告错误;可用于汇编源程序错误调试语法格式:ASSERTLo

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

31、 = 0时,汇编第二遍扫描时,显示String-Expression;Numeric-Expression 0时,汇编第一遍扫描时,显示String-Expression,并终止汇编;实例5. 19:INFOINFO0,“Version1.0”;显示Version1.0IFLabel1 = Label2INFO4,“Data Overrun”ENDIF4.2 ARM伪操作、宏指令和伪指令详解4. 信息报告类伪操作OPTOPT:设置列表选项伪操作;语法格式:OPTnn:选项编码n=2m,如n=1表示设置默认列表选项,n=2表示关闭默认列表选项;在编译过程中,使用-list选项可以生成默认列表;使

32、用OPT可以改变默认列表。TTL和SUBTTTL:在列表文件的每一页开头插入一个标题;SUBT:在列表文件的每一页开头插入一个子标题;语法格式:TTLtitleSUBTsubtitletitle和subtitle:是标题和子标题;4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作其它(Miscellaneous)伪操作包括:CODE16CODE32EQUAREAENTRY等。4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作CODE16、CODE32CODE16:告诉编译器后面的指令是16位的Thumb指令;CODE32:告诉编译器后面的指令是32位的ARM指令;语法格式:CODE

33、16,CODE32实例5. 20:AREAChangeState,CODER,READONLYCODE32;L1LDRR0,start+1;BXR0;CODE16;startMOVR1,#10;说明:程序在ARM状态下执行,然后通过BX指令切换到Thumb状态,并执行Thumb4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作EQUEQU:为数字常量、基于寄存器的值、程序标号定义一个名称;可以用“*”代替;EQU类似于C语言的#define。语法格式:NameExpression,TypeName:由EQU定义的名称;Expression:地址值、程序标号、数字常量(32位常量、32位地

34、址)Type:属性值说明CODE16表明该地址处于Thumb指令区;CODE32表明该地址处于ARM指令区;DATA表明该地址处于数据区;实例5. 21:EQUXEQU10;定义X符号的值为10YEQULabel + 10;定义Y符号的值为Label + 10ZEQU0 x10, CODE32;定义Z符号的值为0 x10,且该处为ARM指令regEQU0 xE01FC080;定义寄存器reg的地址为0 xE01FC0804.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作AREA含义AREA定义一个代码段或者数据段;通常可用AREA伪操作将程序分为多个ELF(可执行连接文件,由连接器生成)

35、段;一个程序包含多个代码段和数据段,至少包含一个代码段;ARM程序一般采用分段设计,一个程序至少有一个代码段。语法格式:AREA SectionName ,Attr ,AttrSectionName:为定义一个代码段或者数据段的名称;当名称以数字开头时,必须用|括起来,如|1_data|;|.text|表示C语言编译产生的代码,或者与C语言库相连接的代码;Attr:属性值如下4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作AREAAttr:属性值如下表5. 2:Attr属性值Attr说明ALIGN = expressionexpression=031,指定对齐方式为:(2express

36、ion)个字节。默认情况下, ELF的代码段和数据段是4字节对齐的,即expression=2。ASSOC=section指定与本段相连的ELF段。任何时候连接section段也必须包括sectionname段。CODE定义代码段。默认属性为READONLY。COMDEF 定义一个通用段。该段可包含代码段和数据段。在其它源文件中,同名的COMDEF段必须相同。COMMON 定义一个共用段。该段不包含任何代码和数据,连接器将其初始化为0。在其它源文件中,同名的COMMON段共用同样的内存单元,连接器为其分配合适的尺寸。DATA定义数据段。默认属性为READWRITE。NOINIT指定本段只保留内

37、存单元,而没有将各初值写入内存单元,或初始化位0。READONLY指定本段为只读属性。代码段默认为READONLY。READWRITE指定本段为读写属性。数据段默认为READWRITE。实例5. 22:AERAAERAExample,CODE,READONLY说明:定义一个代码段Example,属性为READONLY4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作ENTRYENTRY:定义一个程序入口点。语法格式:ENTRY一个程序可以有多个汇编源程序,而一个汇编源程序最多只能有一个ENTRY(可以没有);一个程序可以有多个ENTRY,但至少要有一个ENTRY;实例5. 23:ENTR

38、YAERAExample,CODE,READONLYENTRYCODE32StartMOVR1,#0 x53END4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作ENDEND:定义一个程序结束点;告诉编译器源程序已经到了结尾。语法格式:END一个汇编源程序包含END;实例5. 24:ENDAERAExample,CODE,READONLYENTRYCODE32StartMOVR1,#0 x53END4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作ALIGNALIGN:定义补丁字节,使当前位置满足一定的对齐方式。语法格式:ALIGNExpression,offsetExpress

39、ion:对齐方式,取值为2的幂次1、2、;默认为字对齐。offset:对齐偏移; 默认为offset=0,将当前位置对齐到以Expression为单位的边界;如“ALIGN8”,将当前位置以2个字的方式对齐;如果指定offset,将当前位置对齐到以Expression为单位的边界,再加上offset个字节的位置;如果当前位置为0 x0001,则执行“ALIGN4,3”后当前位置转到0 x0007;特定对齐Thumb的伪指令ADR要求地址是字对齐的,而Thumb代码中的地址标号可能不是字对齐的,这时就要求ALIGN4;ARM中的Cache采用其它对齐方式,如16字节对齐,这时使用ALIGN,可以

40、提高Cache的性能优势;4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作ALIGN语法格式:ALIGNExpression,offset特定对齐LDRD/STRD指令要求内存单元是8字节对齐,这样在为LDRD/STRD指令分配内存单元前,要求使用使用ALIGN8,实现8字节对齐。地址标号通常没有对齐方式,而在ARM代码中要求字对齐,Thumb代码中要求半字对齐,这样就要求使用ALIGN调整对齐方式;在AREA中使用ALIGN属性时的Expression与单独使用ALIGN为操作时的Expression,其含义是不同的;实例5. 25:ALIGNALIGN4,3当前位置为0 x0001

41、,执行“ALIGN 4, 3”后,当前位置转到0 x0007ALIGN8将当前位置以2个字的方式对齐AREACache,CODE,ALIGN = 3;指定该代码段是8字节对齐ALIGN8;指定以下指令是8字节对齐4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作EXPORT、GLOBALEXPORT、GLOBAL:声明一个符号可以被其它文件引用,相当于声明一个全局变量。语法格式:EXPORTsymbolWEAKGLOBALsymbolWEAKSymbol未声明的符号名称,区分大小写。WEAK选项表示其它同名符号名称优先于本符号。4.2 ARM伪操作、宏指令和伪指令详解5. 其它伪操作IM

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

43、含到当前源文件中,并将被包含的文件在当前位置汇编,二者同义。语法格式:GET/INCLUDEfilenameFilename为被包含源文件,可以使用路径信息。路径中可以有空格。通常可以在一个源文件中定义宏,用EQU定义常量,用MAP和FIELD定义数据结构等,然后用GET包含次文件。GET可以嵌套。编译器查找目录为当前目录,用编译器的-I选项添加查找目录。如果源文件A包含源文件B,源文件B包含源文件C,那么编译器查找源文件C时,会把源文件B所在的目录作为当前目录。实例5. 26:ALIGNAREAExampleCODRREADONLYGETFile.s;包含源文件GETC:projectfil

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

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

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

47、TName:为所定义的作用范围的名称;当不使用ROUT时,局部变量的作用范围是所在的段;ROUT的作用范围是同一个段中两个ROUT之间的有效范围;4.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解ARM伪指令不是真正的ARM指令,在编译器进行汇编时,被替换成相应的ARM指令。ARM汇编语言伪指令:ADRADRLLDRNOP4.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解ADR:小范围地址读取伪指令ADR:将基于PC或寄存器的地址值读取到寄存器中。语法格式:ADRcondregister,expressionCond:可执行条件;Register:目标寄存器;E

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

49、指令和伪指令详解6. ARM汇编伪指令详解ADR:小范围地址读取伪指令实例5. 28:ADRStartMOVR0,#10;此指令执行完后,PC值为start+8ADRR1,start;因为PC值为当前指令地址值+8,ADR被替换成SUB R1, PC, ox0C4.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解ADRL:中等范围地址读取伪指令ADRL:将基于PC或寄存器的地址值读取到寄存器中;语法格式:ADRLcondregister,expressionCond:可执行条件;Register:目标寄存器;Expression:基于PC或寄存器的地址值表达式,其取值范围:当地址

50、值是字对齐时,其值范围为:-256K+256K字节;当地址值不是字对齐时,其值范围为:-64K +64K字节;当地址值是16字节对齐时,其值范围更大;编译器通常将ADRL伪指令替换成二条合适的数据处理指令来实现ADRL伪指令的功能,即使能用一条指令实现,也必须用二条;否则报错。ADRL伪指令中的地址是基于PC或寄存器的相对偏移量,所以ADR实际读取的地址是与位置无关的地址。当ADR伪指令中的Expression是基于PC的相对偏移量时,该地址必须与ADR在同一代码段中,否则连接可能越界。4.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解ADRL:中等范围地址读取伪指令实例5.

51、29:ADRLStartMOVR0,#10;此指令执行完后,PC值为start+8ADRLR4,start+6000;ADRL被替换成:ADD R4, #84和ADD R4, R4, #599044.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解LDR:大范围地址读取伪指令LDR:将一个32位的立即数或者一个地址读取到寄存器中。语法格式:LDRcond register, =expression|label_ expressionCond:可执行条件;Register:目标寄存器;Expression:为32位常量;编译器的处理:当Expression表示的地址在MOV和MVN

52、指令中地址的取值范围内时,编译器将用MOV或MVN代替LDR;当Expression表示的地址超过MOV和MVN指令中地址的取值范围时,编译器将该数据存到数据缓冲区,然后用一条基于PC的LDR读取该值;label_expression为基于PC的地址表达式时,编译器一般将该数据存放到数据缓冲区,然后用一条LDR读取该值;label_expression为外部地址表达式或者非当前段的表达式时,编译器将在目标文件中插入连接重定位伪操作;4.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解LDR:大范围地址读取伪指令两种用途:当需要读取到寄存器的数据超过MOV或MVN指令可操作的范围时

53、,使用LDR;将一个基于基于PC地址值或者外部地址值读取到寄存器中时;实例5. 30:LDRLDRR1,=xFFFLDRR1,Addr14.2 ARM伪操作、宏指令和伪指令详解6. ARM汇编伪指令详解NOP:空操作伪指令NOP:NOP伪指令被替换成ARM空操作,如MOV R0, R0;语法格式:NOP4.2 ARM伪操作、宏指令和伪指令详解7. Thumb汇编伪指令详解Thumb伪指令不是真正的Thumb指令,在编译器进行汇编时,被替换成相应的Thumb指令。Thumb汇编语言伪指令:ADR、LDR、NOP。4.3 ARM汇编语言程序设计1. ARM汇编语言程序设计概述ARM程序设计分类AR

54、M程序设计主要包括三种方法:ARM汇编语言程序设计;嵌入式C语言程序设计;嵌入式C语言与ARM汇编语言混合程序设计。ARM汇编中的文件格式ARM源程序文件类型如表5. 3所示。ARM工程:在ARM程序设计中,用工程组织文件的。ARM工程主要包括多个ARM汇编语言源程序、C源程序、头文件等。表5. 3:ARM源程序文件后缀名源程序文件后缀名说明汇编源程序文件*.S用ARM汇编语言编写的ARM程序或者Thumb程序C源程序文件*.C用C语言编写的程序头文件*.H把程序中常用的常量名、全局变量名、宏定义、数据结构等定义成头文件4.3 ARM汇编语言程序设计2. ARM汇编语言语句格式(1)语句格式基

55、本格式: symbolinstruction|directive|pseudo-instruction; 格式说明symbol:符号,ARM中符号必须从一行的开头开始;在指令和伪指令中,符号用作地址标号;在伪操作中,符号用作变量或者常量;instruction:汇编指令ARM中指令不能从一行的开头开始;directive:伪指令,不能从一行的开头开始;pseudo-instruction:伪操作,不能从一行的开头开始;;comment:注释以“;”开头,不能从一行的开头开始;在指令、伪指令和伪操作中,助记符可以全部是大写或小写(不区分),但是在一个助记符中不能大小写字符混合使用;可以用“”把一

56、行语句分成若干行来写,但是要求“”后紧跟指令中的字符,也不能有空格制表符等。4.3 ARM汇编语言程序设计2. ARM汇编语言语句格式(2)符号定义符号可以代表地址、变量、数字常量;当符号代表地址时又称为地址常量;符号包括变量、数字常量、标号和局部标号。符号说明符号可以是标号、变量、数字常量等;符号可以由字母大小写、数字、下划线组成,但符号区分大小写;符号在起作用范围内是唯一的,符号不能和系统预定义符号的相同;变量三种类型变量:数字变量、逻辑变量、字符串变量;数字变量:取值范围是数字常量和数字表达式所能表示的数值范围;逻辑变量:其取值范围是TRUE和FALSE;字符串变量:其取值范围是串表达式

57、所能表示的数值范围;4.3 ARM汇编语言程序设计2. ARM汇编语言语句格式(2)符号定义变量变量定义由GBLA、GBLL、GBLS声明全局变量;由LCLA、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

58、)符号定义全局标号全局标号定义:在一行中,顶头书写就定义了一个全局标号;全局标号不能以数字开头;标号表示指令或数据地址,一般有三种标号;基于PC的标号:表示跳转指令的目标地址;被处理成PC数字常量;基于寄存器的标号:通常是用MAP或FIELD伪操作定义的标号,亦可以由EQU伪操作定义;被处理成寄存器数字常量;绝对地址标号:是一个32位数字量;4.3 ARM汇编语言程序设计2. ARM汇编语言语句格式(2)符号定义局部标号局部标号定义:在一行中,顶头书写就定义了一个局部标号;定义格式:N_NameroutnameN:099;局部标号只能以数字开头;Routname:为该标号的作用范围,由ROUT

59、定义的符号;可重复定义;引用格式:%F|BA|TNroutname%:表示引用操作;B:向后搜索;默认。F:向前搜索;T:搜索宏的当前层;默认。A:搜索宏的所有嵌套层;Routname:指定routname时,向前搜索最近的ROUT,若名称不匹配,则报错。4.3 ARM汇编语言程序设计2. ARM汇编语言语句格式(3)ARM汇编语言中的表达式表达式是由符号、数值、单目或多目操作符、括弧等组成。各元素的优先级括号内的优先级最高;各种操作符有一定的优先级;单目操作符的优先级高于其它操作符;相邻的单目操作符的执行顺序为由右到左;优先级相同的双目操作符,执行顺序为由左到右;4.3 ARM汇编语言程序设

60、计2. ARM汇编语言语句格式(3)ARM汇编语言中的表达式字符串表达式定义:由字符串、字符串变量、操作符、括号组成;由双引号定义一个字符串:如”Qingdao University”;引用字符$的方法:$;引用字符”的方法:”;字符串操作符引用方法:用“:”引用字符串操作符,如:“: LEN :”;LEN:返回字符串的长度;CHR:将一个0255之间的整数转换成一个字符串返回;STR:将一个数字或逻辑表达式转换为一个字符串返回,如:STR: 15返回“0000000F”;LEFT: A :LEFT: X;从字符串A中返回A左侧的X个字符的子串;RIGHT:A :RIGHT: X;从字符串A中

温馨提示

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

评论

0/150

提交评论