ARM汇编语言程序指示符与语句格式.ppt
《ARM汇编语言程序指示符与语句格式.ppt》由会员分享,可在线阅读,更多相关《ARM汇编语言程序指示符与语句格式.ppt(57页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5章章 ARM指令集和汇编语言程序指令集和汇编语言程序l本章主要介绍以下内容:lARM指令集的基本特点l与Thumb指令集的区别l与x86处理器的区别lARM指令格式lARM寻址方式lARM指令集分类详解lARM汇编语言的指示符lARM汇编语言语句格式lARM汇编语言程序格式lARM汇编语句格式和程序格式进阶lARM汇编语言程序举例1/16/20231本讲主要参考文献本讲主要参考文献lARM公司公司英文资料:英文资料:lADS_AssemblerGuide_B.pdflDDI0100E_ARM_ARM.pdfl中文图书中文图书lARM体系结构与编程,清华大学出版社l嵌入式系统基础教程,机械
2、工业出版社1/16/202325.4 ARM汇编语言程序的指示符汇编语言程序的指示符lARM汇编语言源程序中语句由指令、指示符和宏指令组成。l在ARM中将directive称做指示符lARM的指示符指令相当于x86的伪指令l在ARM中pseudo-instruction被称为伪指令lARM指令集中只有4条伪指令l而宏指令则是通过指示符定义的。l使用MACRO和 MEND指示符1/16/202335.4.1 符号定义指示符符号定义指示符l符号定义(Symbol definition)指示符用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称。包括以下指示符:lGBLA,GBLL及GB
3、LS 声明全局变量;lLCLA,LCLL及LCLS 声明局部变量;lSETA,SETL及SETS 给变量赋值;lRLIST 为通用寄存器列表定义名称;lCN 为协处理器的寄存器定义名称;lCP 为协处理器定义名称;lDN及SN 为VFP的寄存器定义名称;lFN 为FPA的浮点寄存器定义名称。1/16/202345.4.2 数据定义指示符数据定义指示符l数据定义(Data definition)指示符包括以下的指示符:lLTORG 声明一个数据缓冲池(literal pool)的开始;lMAP 定义一个结构化的内存表(storage map)的首地址;lFIELD 定义结构化的内存表中的一个数据
4、域(field);lSPACE 分配一块内存单元,并用0初始化;lDCB 分配一段字节的内存单元,并用指定的数据初始化;lDCD及DCDU 分配一段字的内存单元,并用指定的数据初始化;lDCDO 分配一段字的内存单元,并将单元的内容初始化成该单元相对于静态基值寄存器的偏移量。1/16/20235数据定义指示符(续)数据定义指示符(续)lDCFD及DCFDU 分配一段双字的内存单元,并用双精度的浮点数据初始化。lDCFS及DCFSU 分配一段字的内存单元,并用单精度的浮点数据初始化。lDCI 分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码,而不是数据。lDCQ及DCQU
5、分配一段双字的内存单元,并用64位的整数数据初始化。lDCW及DCWU 分配一段半字的内存单元,并用指定的数据初始化。lDATA 在代码段中使用数据。现已不再使用,仅用于保持向前兼容。1/16/202365.4.3 汇编控制指示符汇编控制指示符l汇编控制(Assembly control)指示符包括下面的指示符:lIF,ELSE及ENDIFl汇编或者不汇编一段源代码lWHILE及WENDl条件重复汇编相同的一段源代码lMACRO及MENDl标识宏定义开始与结束lMEXITl用于从宏跳转出去1/16/202375.4.4 信息报告指示符信息报告指示符l信息报告(Reporting)指示符包括下列
6、指示符:lASSERTl在汇编编译器对汇编程序的第二趟扫描中,如果其中的ASSERTION中条件不成立,ASSERT伪操作将报告该错误信息。lINFOl支持第一二趟汇编扫描时报告诊断信息。lOPTlTTL及及SUBT1/16/202385.4.5 其他指示符其他指示符l这些杂类的指示符包括:lALIGNlAREAlCODE16及CODE32lENDlENTRYlEQUlEXPORT或GLOBAL1/16/20239其他的指示符(续)其他的指示符(续)lEXTERNlGET或INCLUDElIMPORTlINCBINlKEEPlNOFPlREQUIRElREQUIRE8及PRESERVE8lRN
7、lROUT1/16/2023105.4.5.1 AREAlAREA指示符用于定义一个代码段或者数据段。l语法格式lAREA sectionname,attr,attr.l其中:lsectionname为所定义的代码段或者数据段的名称。如果该名称是以数字开头的,则该名称必须用“”括起来,如1_datasec。还有一些代码段具有约定的名称,如.text表示C语言编译器产生的代码段或者是与C语言库相关的代码段。lAttr是该代码段(或者程序段)的属性。l在AREA指示符中,各属性间用逗号隔开。1/16/202311AREA的属性的属性l下面列举主要的属性:lALIGN=expression。默认的情
8、况下,ELF的代码段和数据段是4字节对齐的。lExpression可以取031的数值,相应的对齐方式为(2expression)字节对齐。如expression=3时为8字节对齐。lASSOC=section。指定与本段相关的ELF段。任何时候连接section段也必须包括sectionname段。lCODE 定义代码段。默认属性为READONLY。lCOMDEF 定义一个通用的段。该段可以包含代码或者数据。在个源文件中,同名的COMDEF段必须相同。1/16/202312AREA的属性(续)的属性(续)lCOMMON 定义一个通用的段。该段不包含任何用户代码和数据,连接器将其初始化为0。各源
9、文件中同名的COMMON 段公用同样的内存单元,连接器为起分配合适的尺寸。lDATA 定义数据段。默认属性为READWRITE。lNOINIT 指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将个内存单元值初始化为0。lREADONLY 指定本段为只读,代码段的默认属性为READONLY。lREADWRITE 指定本段为可读可写,数据段的默认属性为READWRITE。1/16/202313AREA指示符举例指示符举例l举例举例l下面的指示符定义了一个代码段,代码段的名称为Mainpro,属性为READONLY。AREA Mainpro,CODE,READONLY;code s
10、egment1/16/2023145.4.5.2 EQUlEQU指示符为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。l*是EQU的同义词。l语法格式lname EQU expr,typel其中:lexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或者32位的常量。lname为EQU指示符为expr定义的字符名称。ltype 当expr为32位常量时,可以使用type指示expr表示的数据的类型。1/16/202315EQU(续)(续)ltype有下面3种取值:lCODE16lCODE32lDATAl使用说明lEQU指示符的作用类似于C语言中的#define
11、,用于为一个常量定义字符名称。l示例labcd EQU 2 ;定义abcd符号的值为2labcd EQU label+16;定义abcd符号的值(label+16)laddr1 EQU 0 xlC,CODE32;定义addr1符号值为;绝对地址值0 xlC,而且该处为ARM指令。1/16/2023165.4.5.3 ENTRYlENTRY指示符指定程序的入口点l语法格式lENTRYl使用说明l一个程序(可以包含多个源文件)中至少要有一个ENTRY(可以有多个ENTRY),但一个源文件中最多只能有一个ENTRY(可以没有ENTRY)。l示例AREA example,CODE,READONLYEN
12、TRY ;应用程序的入口点1/16/2023175.4.5.4 CODE16和和CODE32lCODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令。lCODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。l语法格式lCODE16lCODE32l使用说明l当汇编源程序中同时包含ARM指令和Thumb指令时,使用CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令;使用CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告诉编译器后面指令的类型,该指示符本身并不进行程序状态的切换。1/
13、16/202318CODE16/CODE32举例举例在下面的例子中,程序先在ARM状态下执行,然后通过BX指令切换到Thumb状态,并跳转到相应的Thumb指令处执行。在Thumb程序入口处用CODE16指示符标识下面的指令为Thumb指令。参看下面的指令段:.AREA ChangeState,CODE,READONLYCODE32;指示下面的指令为ARM指令LDR r0,=start+1BX r0 ;切换到Thumb,并跳转到start处执行CODE16 ;指示下面的指令为Thumb指令startMOV r1,#101/16/2023195.4.5.5 ENDlEND指示符告诉编译器已经到了
14、源程序结尾。l语法格式:lENDl使用说明:l每一个汇编源程序都包含END指示符,以告诉本源程序的结束。l示例:AREA example CODE,READONLYEND1/16/2023205.4.5.6 ALIGNlALIGN指示符通过添加补丁字节使当前位置满足一定的对齐方式。l语法格式lALIGN expr,offsetl其中,expr为数字表达式,用于指定对齐方式。可能的取值为2的次幂,如1、2、4、8等。如果指示符中没有指定expr,则当前位置对齐到下一个字边界处。offset为数字表达式。当前位置对齐到下面形式的地址处:offset+n*expr。1/16/202321ALIGN(
15、续(续1)l使用说明l下面的情况中,需要特定的地址对齐方式:lThumb的宏指令ADR要求地址是字对齐的,而Thumb代码中地址标号可能不是字对齐的。这时就要使用指示符ALIGN 4使Thumb代码中的地址标号字对齐。l由于有些ARM处理器的CACHE采用了其他对齐方式,如16字节的对齐方式,这时使用ALIGN指示符指定合适的对齐方式可以充分发挥该CACHE的性能优势。lLDRD及STRD指令要求内存单元是8字节对齐的。这样在为这两个指令分配的内存单元前要使用ALIGN 8实现8字节对齐方式。l地址标号通常自身没有对齐要求。而在ARM代码中要求地址标号是字对齐的,在Thumb代码中要求字节对齐
16、。这样需要使用合适的ALIGN指示符来调整对齐方式。1/16/2023225.4.5.7 EXPORT及及GLOBALlEXPRORT声明一个符号可以被其他文件引用。相当于声明了一个全局变量。GLOBAL是EXPORT的同义词。l语法格式lEXPORT symbol WEAKl其中,symbol为声明的符号名称,大小写敏感。lWEAK选项声明其他的同名符号优先于本符号被引用。l使用说明l使用EXPORT指示符声明一个源文件中的符号,使得该符号可以被其他源文件引用。l示例lAREA Example,CODE,READONLYlEXPORT Do_Add ;函数名称DoAdd可以被引用1/16/2
17、023235.4.5.8 IMPORTlIMPORT指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。l语法格式lIMPORT symbol WEAKl其中:lsymbol为声明的符号的名称。它是区分大小写的。lWEAK 指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。1/16/202324IMPORT(续)(续)l使用说明l使用IMPORT指示符声明一个符号
18、是在其他源文件中定义的。如果连接器在连接处理时不能解析该符号,而IMPORT指示符中没有指定WEAK选项,则连接器将会报告错误。如果连接器在连接处理时不能解析该符号,而IMPORT指示符中指定了WEAK选项,则连接器将不会报告错误,而是进行下面的操作:l如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令。l其他情况下该符号被设置为0。1/16/2023255.4.5.9 EXTERNlEXTERN指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。如果本源文件没有实际引用该符号,该符号都将不
19、会被加入到本源文件的符号表中。l语法格式lEXTERN symbol WEAKl其中,symbol为声明的符号的名称。它是区分大小写的。lWEAK 指定该选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。1/16/202326EXTERN(续(续1)l使用说明l使用EXTERN指示符声明一个符号是在其他源文件中定义的。如果连接器在连接处理时不能解析该符号,而EXTERN指示符中没有指定WEAK选项,则连接器将会报告错误。如果连接器在连接处理时不能解析该符号,而EXTERN指示符中指定了WEAK选
20、项,则连接器将不会报告错误,而是进行下面的操作:l如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令。l其他情况下该符号被设置为0。1/16/202327EXTERN(续(续2)l示例l下面的代码测试是否连接了C+库,并根据结果执行不同的代码AREA Example,CODE,READONLYEXTERN _CPP_INITIALIZEWEAK;如果连接了c+库则读取;函数_CPP_INITIALIZE地址LDR r0,_CPP_INITIALIZECMP r0,#0;Test if zero.BEQ nocplusplus;如果没有连接C+
21、库,则跳转到nocplusplus1/16/2023285.4.5.10 GET及及INCLUDElGET指示符将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。lINCLUDE是GET的同义词。l语法格式lGET filenamel其中,filename为被包含的源文件的名称。这里可以使用路径信息。l使用说明(1)l通常可以在一个源文件中定义宏,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,这样的源文件类似于C语言中的.H文件。然后用GET指示符将这个源文件包含到它们的源文件中,类似于在C源程序的“include *.h”。1/16/20232
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 汇编语言 程序 指示 语句 格式
限制150内