嵌入式系统技术与设计第3章arm汇编语言程序设计

上传人:j****9 文档编号:54523900 上传时间:2018-09-14 格式:PPT 页数:74 大小:1.15MB
返回 下载 相关 举报
嵌入式系统技术与设计第3章arm汇编语言程序设计_第1页
第1页 / 共74页
嵌入式系统技术与设计第3章arm汇编语言程序设计_第2页
第2页 / 共74页
嵌入式系统技术与设计第3章arm汇编语言程序设计_第3页
第3页 / 共74页
嵌入式系统技术与设计第3章arm汇编语言程序设计_第4页
第4页 / 共74页
嵌入式系统技术与设计第3章arm汇编语言程序设计_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《嵌入式系统技术与设计第3章arm汇编语言程序设计》由会员分享,可在线阅读,更多相关《嵌入式系统技术与设计第3章arm汇编语言程序设计(74页珍藏版)》请在金锄头文库上搜索。

1、嵌入式系统技术与设计,第3章 ARM汇编语言程序设计,在第2章中阐述的体系结构及指令集理论的基础上,本章主要介绍利用ARM汇编语言进行编程。ARM编译器可以支持汇编语言、C/C+、汇编语言与C/C+的混合编程等,本章将介绍相关的编程方法。,本章主要内容: ARM/Thumb混合编程 ARM汇编器支持的伪操作 ARM汇编器支持的伪指令 ARM汇编器的使用 汇编语言与C/C+的混合编程,3.1 ARM/Thumb混合编程,Thumb指令集把32位ARM指令集的一个子集编码为一个16位的指令集。代码密度高是Thumb指令集的一个主要优势。,3.1.1 Thumb指令的特点及实现,表3-1 Thumb

2、寄存器的使用,3.1.2 ARM/Thumb交互工作基础,Thumb以其较高的代码密度和在窄存储器上的性能,使得它在很多系统中得到广泛应用。,3.1.3 ARM/Thumb交互子程序,编写ARM/Thumb互交代码时,需要注意下面两点。(1)对于C/C+子程序而言,只要在编译时指定-apcs/interwork选项,汇编器会生成合适的返回代码,使得程序返回到和调用程序相同的状态。(2)在汇编语言子程序中,用户必须自己编写相应的返回代码,使得程序返回到和调用程序相同的状态。,对于汇编程序来说,可以有两种方法来实现程序状态的切换。第一种方法是利用连接器提供的交互子程序Veneer来实现程序状态的切

3、换,这时用户可以使用指令BL来调用子程序;第二种方法是用户自己编写状态切换的程序,本节主要介绍第二种方法。,1使用汇编语言实现互交,(1)BX指令ARM状态下的BX指令,使程序跳转到指令中指定的参数Rm所指定的地址执行程序,Rm的第0位复制到CPSR中的T位,bits311移入PC。指令的语法格式如下:BX (2)编程实例,(3)ARMv5架构下的状态切换在ARMv5体系结构的指令集中,增加了下面两条指令用于ARM代码和Thumb代码之间的互交。 BLX address BLX register,对于不同的C和C+源程序,可能有些程序中包含ARM指令,有些程序中包含Thumb指令,这些程序可以

4、相互调用,只是在编译这些程序时指定-apcs/interwork选项。当使用了-apcs/interwork选项,编译器会自动进行一些相应处理;连接器在检测到程序中存在互交工作时,会生成一些用于程序状态切换的代码。,2使用C和C+语言实现互交,(1)代码编译 (2)C语言的互交实例 (3)Thumb状态下的功能指针,3.2 ARM汇编器支持的伪操作,在ARM汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive) ,它们所完成的操作称为伪操作。伪操作在源程序中的作用是为了完成汇编程序做各种准备工作的

5、,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。,3.2.1 伪操作概述,在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作及其杂项伪操作等。,3.2.2 符号定义伪操作,符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。(1)用于定义全局变量的GBLA、GBLL和GBLS。(2)用于定义局部变量的LCLA、LCLL和LCLS。(3)用于对变量赋值的SETA、SETL和SETS。(4)为通用寄存器列表定义名称的RLIST。,(1)语法格式GBLA、GBLL和GBLS伪操作用于定义一

6、个ARM程序中的全局变量并将其初始化。语法格式如下:(2)使用说明(3)示例,1全局变量定义伪操作GBLA、GBLL和GBLS,(1)语法格式LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。语法格式如下:(2)使用说明(3)示例,2局部变量定义伪操作LCLA、LCLL和LCLS,(1)语法格式伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。语法格式如下:Variable expr(2)使用说明(3)示例,3变量赋值伪操作SETA、SETL和SETS,(1)语法格式RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义

7、的名称可在ARM指令LDM/STM中使用。语法格式如下:Name RLIST list-of-registers(2)使用说明(3)示例,4通用寄存器列表定义伪操作RLIST,3.2.3 数据定义(Data Definition)伪操作,数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种。,(1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化。(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。(4)DCFD(DCFDU)用于

8、为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。,(5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。(6)DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。(7)SPACE用于分配一片连续的存储单元。,(8)MAP用于定义一个结构化的内存表首地址。(9)FIELD用于定义一个结构化的内存表的数据域。,(1)语法格式DCB伪操作用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为数字或字符串。DCB也可用“=”代替。语法格式如下。label DCB expr,expr(2)使用说

9、明(3)示例,1DCB,(1)语法格式DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。语法格式如下。label DCW expr,expr(2)使用说明(3)示例,2DCW(DCWU),(1)语法格式DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。语法格式如下。 label DCDU expr,expr(2)使用说明(3)示例,3DCD(DCWU),(1)语法格式DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。语法格式如下。 label DCFSU fplit

10、eral,fpliteral(2)使用说明(3)示例,4DCFS(或DCFSU),(1)语法格式DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。语法格式如下。 label DCFDU fpliteral,fpliteral(2)使用说明(3)示例,5DCFD(或DCFDU),(1)语法格式DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。语法格式如下。label DCQU -literal,-literal(2)使用说明(3)示例,6DCQ(或DCQU),(1)语法格式SPACE伪指令用

11、于分配一片连续的存储区域并初始化为0。(2)使用说明(3)示例,7SPACE,(1)语法格式MAP伪操作用于定义一个结构化的内存表的首地址。语法格式如下。MAP expr,base-register(2)使用说明(3)示例,8MAP,(1)语法格式FIELD伪操作用于定义一个结构化内存表中的数据域。语法格式如下。label FIELD expr(2)使用说明(3)示例,9FILED,3.2.4 汇编控制伪操作,汇编控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条。(1)IF、ELSE、ENDIF。(2)WHILE、WEND。(3)MACRO、MEND。(4)MEXIT。,

12、(1)语法格式IF、ELSE、ENDIF伪操作能根据条件的成立与否决定是否执行某个指令序列。语法格式如下: IF logical-expressing ELSE ENDIF,1IF、ELSE、ENDIF,(1)语法格式WHILE、WEND伪操作能根据条件的成立与否决定是否循环执行某个指令序列。语法格式如下: WHILE logical-expression code WENDlogical-expression:用于决定指令执行流程的逻辑表达式。(2)使用说明(3)示例,2WHILE、WEND,(1)语法格式MACRO、MEND伪操作可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中

13、通过宏指令多次调用该段代码。语法格式如下:MACRO $label macroname $parameter,$parameter;codeMEND(2)使用说明(3)示例,3MACRO、MEND,(1)语法格式MEXIT用于从宏定义中跳转出去。语法格式如下:MEXIT (2)示例,4MEXIT,下面的伪操作在使用时可以嵌套,嵌套的深度不能超过256。(1)MACRO宏定义。(2)WHILEEND循环。(3)IFELSEENDIF条件语句。(4)INCLUDE指定头文件。,5关于伪操作的嵌套,3.2.5 杂项伪操作,ARM汇编中还有一些其他的伪操作,在汇编程序中经常会被使用,包括以下几条。(1

14、)AREA用于定义一个代码段或数据段。(2)ALIGN用于使程序当前位置满足一定的对齐方式。(3)ENTRY用于指定程序入口点。(4)END用于指示源程序结束。(5)EQU用于定义字符名称。,(6)EXPORT(或GLOBAL)用于声明符号可以被其他文件引用。(7)EXPORTAS用于向目标文件引入符号。(8)IMPORT用于通知编译器当前符号不在本文件中。,(9)EXTERN用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。(10)GET(或INCLUDE)用于将一个文件包含到当前源文件。(11)INCBIN用于将一个文件包含到当前源文件。,(1)语法格式ALIGN伪操

15、作可通过添加填充字节的方式,使当前位置满足一定的对齐方式。语法格式如下。ALIGNexpr,offset,pad(2)使用说明(3)示例,1ALIGN,(1)语法格式AREA伪指令用于定义一个代码段或数据段。ARM程序采用分段式设计,一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。关于“段”更详细的描述,可以参考相关文档。语法格式如下。AREA sectionname,attr,attr(2)使用说明(3)示例,2AREA,(1)语法格式END伪操作用于通知编译器已经到了源程序的结尾。语法格式如下。END(2)使用说明(3)示例,3END,(1)语法格式ENTRY伪操作

16、用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。语法格式如下。ENTRY(2)使用说明(3)示例,4ENTRY,(1)语法格式EQU伪操作用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的define。其中EQU可用“*”代替。语法格式如下。name EQU expr,type(2)使用说明(3)示例,5EQU,(1)语法格式EXPORT伪操作用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写。语法格式如下。EXPORTsymbolWEAK,attr(2)使用说明(3)示例,

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

当前位置:首页 > 中学教育 > 初中教育

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