8ARM汇编语言程序指示符与语句格式

上传人:nbwa****ajie 文档编号:56843046 上传时间:2018-10-16 格式:PPT 页数:57 大小:423.50KB
返回 下载 相关 举报
8ARM汇编语言程序指示符与语句格式_第1页
第1页 / 共57页
8ARM汇编语言程序指示符与语句格式_第2页
第2页 / 共57页
8ARM汇编语言程序指示符与语句格式_第3页
第3页 / 共57页
8ARM汇编语言程序指示符与语句格式_第4页
第4页 / 共57页
8ARM汇编语言程序指示符与语句格式_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《8ARM汇编语言程序指示符与语句格式》由会员分享,可在线阅读,更多相关《8ARM汇编语言程序指示符与语句格式(57页珍藏版)》请在金锄头文库上搜索。

1、2018/10/16,1,第5章 ARM指令集和汇编语言程序,本章主要介绍以下内容: ARM指令集的基本特点 与Thumb指令集的区别 与x86处理器的区别 ARM指令格式 ARM寻址方式 ARM指令集分类详解 ARM汇编语言的指示符 ARM汇编语言语句格式 ARM汇编语言程序格式 ARM汇编语句格式和程序格式进阶 ARM汇编语言程序举例,2018/10/16,2,本讲主要参考文献,ARM公司英文资料: ADS_AssemblerGuide_B.pdf DDI0100E_ARM_ARM.pdf 中文图书 ARM体系结构与编程,清华大学出版社 嵌入式系统基础教程,机械工业出版社,2018/10/

2、16,3,5.4 ARM汇编语言程序的指示符,ARM汇编语言源程序中语句由指令、指示符和宏指令组成。 在ARM中将directive称做指示符 ARM的指示符指令相当于x86的伪指令 在ARM中pseudo-instruction被称为伪指令 ARM指令集中只有4条伪指令 而宏指令则是通过指示符定义的。 使用MACRO和 MEND指示符,2018/10/16,4,5.4.1 符号定义指示符,符号定义(Symbol definition)指示符用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称。包括以下指示符: GBLA,GBLL及GBLS 声明全局变量; LCLA,LCLL及LC

3、LS 声明局部变量; SETA,SETL及SETS 给变量赋值; RLIST 为通用寄存器列表定义名称; CN 为协处理器的寄存器定义名称; CP 为协处理器定义名称; DN及SN 为VFP的寄存器定义名称; FN 为FPA的浮点寄存器定义名称。,2018/10/16,5,5.4.2 数据定义指示符,数据定义(Data definition)指示符包括以下的指示符: LTORG 声明一个数据缓冲池(literal pool)的开始; MAP 定义一个结构化的内存表(storage map)的首地址; FIELD 定义结构化的内存表中的一个数据域(field); SPACE 分配一块内存单元,并

4、用0初始化; DCB 分配一段字节的内存单元,并用指定的数据初始化; DCD及DCDU 分配一段字的内存单元,并用指定的数据初始化; DCDO 分配一段字的内存单元,并将单元的内容初始化成该单元相对于静态基值寄存器的偏移量。,2018/10/16,6,数据定义指示符(续),DCFD及DCFDU 分配一段双字的内存单元,并用双精度的浮点数据初始化。 DCFS及DCFSU 分配一段字的内存单元,并用单精度的浮点数据初始化。 DCI 分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码,而不是数据。 DCQ及DCQU 分配一段双字的内存单元,并用64位的整数数据初始化。 DCW及D

5、CWU 分配一段半字的内存单元,并用指定的数据初始化。 DATA 在代码段中使用数据。现已不再使用,仅用于保持向前兼容。,2018/10/16,7,5.4.3 汇编控制指示符,汇编控制(Assembly control)指示符包括下面的指示符: IF,ELSE及ENDIF 汇编或者不汇编一段源代码 WHILE及WEND 条件重复汇编相同的一段源代码 MACRO及MEND 标识宏定义开始与结束 MEXIT 用于从宏跳转出去,2018/10/16,8,5.4.4 信息报告指示符,信息报告(Reporting)指示符包括下列指示符: ASSERT 在汇编编译器对汇编程序的第二趟扫描中,如果其中的AS

6、SERTION中条件不成立,ASSERT伪操作将报告该错误信息。 INFO 支持第一二趟汇编扫描时报告诊断信息。 OPT TTL及SUBT,2018/10/16,9,5.4.5 其他指示符,这些杂类的指示符包括: ALIGN AREA CODE16及CODE32 END ENTRY EQU EXPORT或GLOBAL,2018/10/16,10,其他的指示符(续),EXTERN GET或INCLUDE IMPORT INCBIN KEEP NOFP REQUIRE REQUIRE8及PRESERVE8 RN ROUT,2018/10/16,11,5.4.5.1 AREA,AREA指示符用于定义

7、一个代码段或者数据段。 语法格式 AREA sectionname,attr,attr 其中: sectionname为所定义的代码段或者数据段的名称。如果该名称是以数字开头的,则该名称必须用“”括起来,如1_datasec。还有一些代码段具有约定的名称,如.text表示C语言编译器产生的代码段或者是与C语言库相关的代码段。 Attr是该代码段(或者程序段)的属性。 在AREA指示符中,各属性间用逗号隔开。,2018/10/16,12,AREA的属性,下面列举主要的属性: ALIGN=expression。默认的情况下,ELF的代码段和数据段是4字节对齐的。 Expression可以取031的

8、数值,相应的对齐方式为(2expression)字节对齐。如expression=3时为8字节对齐。 ASSOC=section。指定与本段相关的ELF段。任何时候连接section段也必须包括sectionname段。 CODE 定义代码段。默认属性为READONLY。 COMDEF 定义一个通用的段。该段可以包含代码或者数据。在个源文件中,同名的COMDEF段必须相同。,2018/10/16,13,AREA的属性(续),COMMON 定义一个通用的段。该段不包含任何用户代码和数据,连接器将其初始化为0。各源文件中同名的COMMON 段公用同样的内存单元,连接器为起分配合适的尺寸。 DATA

9、 定义数据段。默认属性为READWRITE。 NOINIT 指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将个内存单元值初始化为0。 READONLY 指定本段为只读,代码段的默认属性为READONLY。 READWRITE 指定本段为可读可写,数据段的默认属性为READWRITE。,2018/10/16,14,AREA指示符举例,举例 下面的指示符定义了一个代码段,代码段的名称为Mainpro ,属性为READONLY。 AREA Mainpro, CODE, READONLY ;code segment,2018/10/16,15,5.4.5.2 EQU,EQU指示符为

10、数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。 *是EQU的同义词。 语法格式 name EQU expr, type 其中: expr为基于寄存器的地址值、程序中的标号、32位的地址常量或者32位的常量。 name为EQU指示符为expr定义的字符名称。 type 当expr为32位常量时,可以使用type指示expr表示的数据的类型。,2018/10/16,16,EQU(续),type有下面3种取值: CODE16 CODE32 DATA 使用说明 EQU指示符的作用类似于C语言中的#define,用于为一个常量定义字符名称。 示例 abcd EQU 2 ;定义a

11、bcd符号的值为2 abcd EQU label+16 ;定义abcd符号的值(label+16) addr1 EQU 0xlC, CODE32 ;定义addr1符号值为;绝对地址值0xlC,而且该处为ARM指令。,2018/10/16,17,5.4.5.3 ENTRY,ENTRY指示符指定程序的入口点 语法格式 ENTRY 使用说明 一个程序(可以包含多个源文件)中至少要有一个ENTRY(可以有多个ENTRY),但一个源文件中最多只能有一个ENTRY(可以没有ENTRY)。 示例 AREA example, CODE, READONLY ENTRY ;应用程序的入口点,2018/10/16,

12、18,5.4.5.4 CODE16和CODE32,CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令。 CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。 语法格式 CODE16 CODE32 使用说明 当汇编源程序中同时包含ARM指令和Thumb指令时,使用CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令;使用CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告诉编译器后面指令的类型,该指示符本身并不进行程序状态的切换。,2018/10/16,19,CODE16/CO

13、DE32举例,在下面的例子中,程序先在ARM状态下执行,然后通过BX指令切换到Thumb状态,并跳转到相应的Thumb指令处执行。在Thumb程序入口处用CODE16指示符标识下面的指令为Thumb指令。参看下面的指令段:.AREA ChangeState, CODE, READONLYCODE32 ;指示下面的指令为ARM指令LDR r0, =start+1BX r0 ;切换到Thumb,并跳转到start处执行CODE16 ;指示下面的指令为Thumb指令 start MOV r1, #10,2018/10/16,20,5.4.5.5 END,END指示符告诉编译器已经到了源程序结尾。 语

14、法格式: END 使用说明: 每一个汇编源程序都包含END指示符,以告诉本源程序的结束。 示例:AREA example CODE,READONLY END ,2018/10/16,21,5.4.5.6 ALIGN,ALIGN指示符通过添加补丁字节使当前位置满足一定的对齐方式。 语法格式 ALIGN expr,offset 其中,expr为数字表达式,用于指定对齐方式。可能的取值为2的次幂,如1、2、4、8等。如果指示符中没有指定expr,则当前位置对齐到下一个字边界处。offset为数字表达式。当前位置对齐到下面形式的地址处:offset+n*expr。,2018/10/16,22,ALIG

15、N(续1),使用说明 下面的情况中,需要特定的地址对齐方式: Thumb的宏指令ADR要求地址是字对齐的,而Thumb代码中地址标号可能不是字对齐的。这时就要使用指示符ALIGN 4使Thumb代码中的地址标号字对齐。 由于有些ARM处理器的CACHE采用了其他对齐方式,如16字节的对齐方式,这时使用ALIGN指示符指定合适的对齐方式可以充分发挥该CACHE的性能优势。 LDRD及STRD指令要求内存单元是8字节对齐的。这样在为这两个指令分配的内存单元前要使用ALIGN 8实现8字节对齐方式。 地址标号通常自身没有对齐要求。而在ARM代码中要求地址标号是字对齐的,在Thumb代码中要求字节对齐

16、。这样需要使用合适的ALIGN指示符来调整对齐方式。,2018/10/16,23,5.4.5.7 EXPORT及GLOBAL,EXPRORT声明一个符号可以被其他文件引用。相当于声明了一个全局变量。GLOBAL是EXPORT的同义词。 语法格式 EXPORT symbol WEAK 其中,symbol为声明的符号名称,大小写敏感。 WEAK选项声明其他的同名符号优先于本符号被引用。 使用说明 使用EXPORT指示符声明一个源文件中的符号,使得该符号可以被其他源文件引用。 示例 AREA Example,CODE,READONLY EXPORT Do_Add ; 函数名称DoAdd可以被引用,2018/10/16,24,5.4.5.8 IMPORT,IMPORT指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。 语法格式 IMPORT symbol WEAK 其中: symbol为声明的符号的名称。它是区分大小写的。 WEAK 指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。,

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

当前位置:首页 > 办公文档 > 其它办公文档

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