欢迎来到天天文库
浏览记录
ID:44954473
大小:1.14 MB
页数:74页
时间:2019-11-06
《第3章 ARM汇编语言程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式系统技术与设计第3章ARM汇编语言程序设计ARM/Thumb混合编程3.1ARM汇编器支持的伪操作3.2ARM汇编器支持的伪指令3.3汇编语言与C/C++的混合编程3.4在第2章中阐述的体系结构及指令集理论的基础上,本章主要介绍利用ARM汇编语言进行编程。ARM编译器可以支持汇编语言、C/C++、汇编语言与C/C++的混合编程等,本章将介绍相关的编程方法。本章主要内容:●ARM/Thumb混合编程●ARM汇编器支持的伪操作●ARM汇编器支持的伪指令●ARM汇编器的使用●汇编语言与C/C++的混合编程3.1 ARM/Thumb混合编程Thumb指令集把32位ARM指令集的
2、一个子集编码为一个16位的指令集。代码密度高是Thumb指令集的一个主要优势。3.1.1Thumb指令的特点及实现表3-1Thumb寄存器的使用寄存器访问R0~R7完全访问R8~R12只能通过MOV、ADD及CMP访问R13限制访问R14限制访问R15限制访问CPSR间接访问SPSR不能访问3.1.2ARM/Thumb交互工作基础Thumb以其较高的代码密度和在窄存储器上的性能,使得它在很多系统中得到广泛应用。3.1.3ARM/Thumb交互子程序编写ARM/Thumb互交代码时,需要注意下面两点。(1)对于C/C++子程序而言,只要在编译时指定--apcs/interwor
3、k选项,汇编器会生成合适的返回代码,使得程序返回到和调用程序相同的状态。(2)在汇编语言子程序中,用户必须自己编写相应的返回代码,使得程序返回到和调用程序相同的状态。对于汇编程序来说,可以有两种方法来实现程序状态的切换。第一种方法是利用连接器提供的交互子程序Veneer来实现程序状态的切换,这时用户可以使用指令BL来调用子程序;第二种方法是用户自己编写状态切换的程序,本节主要介绍第二种方法。1.使用汇编语言实现互交(1)BX指令ARM状态下的BX指令,使程序跳转到指令中指定的参数Rm所指定的地址执行程序,Rm的第0位复制到CPSR中的T位,bits[31∶1]移入PC。指令的
4、语法格式如下:BX{}(2)编程实例(3)ARMv5架构下的状态切换在ARMv5体系结构的指令集中,增加了下面两条指令用于ARM代码和Thumb代码之间的互交。①BLXaddress②BLXregister对于不同的C和C++源程序,可能有些程序中包含ARM指令,有些程序中包含Thumb指令,这些程序可以相互调用,只是在编译这些程序时指定--apcs/interwork选项。当使用了--apcs/interwork选项,编译器会自动进行一些相应处理;连接器在检测到程序中存在互交工作时,会生成一些用于程序状态切换的代码。2.使用C和C++语言实现互交(1)代
5、码编译(2)C语言的互交实例(3)Thumb状态下的功能指针3.2ARM汇编器支持的伪操作在ARM汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive),它们所完成的操作称为伪操作。伪操作在源程序中的作用是为了完成汇编程序做各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。3.2.1伪操作概述在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作及其杂项伪操作等。3.2.2符号定义伪操作符号定义伪操作用于定义ARM汇编程序
6、中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。(1)用于定义全局变量的GBLA、GBLL和GBLS。(2)用于定义局部变量的LCLA、LCLL和LCLS。(3)用于对变量赋值的SETA、SETL和SETS。(4)为通用寄存器列表定义名称的RLIST。(1)语法格式GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。语法格式如下:(2)使用说明(3)示例1.全局变量定义伪操作GBLA、GBLL和GBLS(1)语法格式LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并
7、将其初始化。语法格式如下:(2)使用说明(3)示例2.局部变量定义伪操作LCLA、LCLL和LCLS(1)语法格式伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。语法格式如下:Variableexpr(2)使用说明(3)示例3.变量赋值伪操作SETA、SETL和SETS(1)语法格式RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。语法格式如下:NameRLIST{lis
此文档下载收益归作者所有