第5-2章 ARM汇编程序设计
- 格式:pdf
- 大小:359.43 KB
- 文档页数:84
ARM汇编语言程序设计1.ARM汇编语言概述2.ARM寄存器3.ARM指令ARM指令包括数据处理指令、传输指令、分支指令和其他特殊指令。
(1)数据处理指令:包括算术运算、逻辑运算、移位和旋转、比较和测试等。
(2)传输指令:用于数据的加载和存储,包括复制、分配和堆栈操作等。
(3)分支指令:用于控制程序流,包括无条件跳转、条件跳转和中断处理等。
4.ARM程序设计(1)初始化:程序开始时需要进行系统和寄存器的初始化。
可以将堆栈指针初始化,设置另外的寄存器和内存变量等。
(2)输入输出:程序可能需要从外部设备读取数据或向外部设备写入数据。
可以使用传输指令实现数据的输入和输出。
(3)运算处理:根据程序的需求,进行各种运算处理。
可以使用数据处理指令实现数据的加减乘除、逻辑运算等。
(4)循环和条件控制:根据需要,使用分支指令控制程序的流程。
可以使用无条件跳转、条件跳转和循环指令实现程序的循环和条件控制。
(5)结束:在程序执行完毕后,可以进行清理工作,例如释放内存、关闭设备等。
5.ARM程序设计实例下面是一个简单的ARM汇编程序示例,实现从数组中找到最大值并输出:.global _start.section .dataarray: .word 1, 3, 5, 2, 4max: .word 0.section .text_start:loop:next:在上述示例中,程序首先将数组的地址和最大值的地址加载到寄存器中。
然后使用循环和条件控制指令依次比较数组元素,找到最大值并将其存储在max变量中。
最后将最大值输出,并结束程序。
ARM汇编语言编程详解作者:机器人小助手摘要:本文旨在为读者提供一份详细的ARM汇编语言编程指南。
在介绍ARM汇编语言的基础知识后,我们将深入讨论ARM指令集的不同类型、寻址方式、寄存器的使用以及常见的编程技巧。
通过本文的学习,读者将能够深入了解ARM汇编语言的编程思想,并能够编写高效的ARM汇编语言程序。
一、ARM汇编语言简介ARM汇编语言是一种低级的程序设计语言,用于编写针对ARM架构的机器码指令。
它是一种类似于其他汇编语言的文本格式,用于表达机器指令和操作数。
通过编写ARM汇编语言程序,我们可以直接控制计算机的硬件资源,实现高效的程序执行。
二、ARM指令集概述ARM指令集是一套针对ARM架构的机器指令集合,包含多条不同功能的指令。
根据指令的功能和操作对象的不同,ARM指令可以分为数据处理指令、分支跳转指令、访存指令以及其他特殊指令。
1. 数据处理指令数据处理指令用于对操作数进行算术运算、逻辑运算、移位操作等。
这些指令可以对寄存器中的数据进行操作,并将结果存储回寄存器。
常见的数据处理指令有加法、减法、乘法、比较以及逻辑运算等。
2. 分支跳转指令分支跳转指令用于控制程序的流程,可以根据条件进行无条件跳转或有条件跳转。
通过分支跳转指令,我们可以实现程序的循环、条件分支等逻辑。
3. 访存指令访存指令用于读取或写入内存中的数据。
ARM汇编语言提供了多种不同的寻址方式,可以根据操作对象的不同进行选择。
使用访存指令,我们可以实现数据的存储和加载操作。
三、ARM汇编语言编程基础在进行ARM汇编语言编程时,我们需要了解一些基本的编程知识和技巧。
1. 寄存器的使用ARM架构提供了多个通用寄存器,用于存储临时数据。
在编写ARM汇编语言程序时,我们需要灵活使用寄存器,将数据加载到寄存器中进行计算,然后将结果保存回寄存器或内存。
2. 标志位的使用ARM架构提供了一组标志位,用于记录程序执行的状态和结果。
通过检查标志位的值,我们可以进行条件分支和判断,实现程序的流程控制。
第5章ARM汇编程序设计ARM编译器,如ADS集成开发环境,一般都支持汇编语言的程序设计。
本章介绍ARM 程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等到,并在些基础上介绍一些常用的ARM汇编子程序的设计。
4.1 ARM伪指令ARM汇编程序由汇编指令、伪指令和宏指令组成,伪指令不介汇编指令那样在处理器的运行期间执行,而是在汇编器对汇编程序进行汇编时处理。
宏是一段独立的汇编程序代码,它是通过伪指令定义的,在程序中宏指令即调用宏指令。
当程序被汇编时,汇编程序对每个宏调用进行展开,用宏定义代汇编程序中的宏指令。
由于指令也发球汇编伪指令的一部分,因此本书将宏指令放在汇编伪一起介绍。
与单片机汇编程序设计一样,在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,它们没有相对应的操作友码,通常称这些特殊指令助记符为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序做各种准备工作,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。
在ARM的光荣称号程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令以及其他伪指令。
4.1.1 符号定义(Symbol Definition)伪指令符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
常见的符号定义伪指令有以下几种:●用于宝玉局变量的GBLA、GBLL和GBLS;●用于定义局部变量的LCLA、SETL、LCLS;●用于对变量赋值的SETA、SETL、SETS;●为通用寄存器列表定义名称的RLIST;●为一个协处理器的寄存器定义名称的伪指令CN;●为一个协处理器定义名称的伪指令CP;●为一个CFP寄存器定义名称的伪指令DN和SN;●为一个FPA浮点寄存器定义名称的伪指令FN。
1.GBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS) 全局变量名GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并半其初始化。
arm汇编语言程序设计步骤以ARM汇编语言程序设计步骤为标题,本文将详细介绍ARM汇编语言程序设计的步骤和相关知识。
一、ARM汇编语言简介ARM汇编语言是一种低级程序设计语言,用于编写针对ARM架构的机器码指令。
它是一种直接操作硬件的语言,具有高效性和灵活性。
二、ARM汇编语言程序设计步骤1. 确定程序目标和需求:在开始编写ARM汇编程序之前,首先要明确程序的目标和需求。
这包括确定程序的功能、输入和输出,以及所需的数据结构和算法。
2. 了解ARM架构:ARM架构具有多种版本和变体,每个版本都有不同的特性和指令集。
在编写ARM汇编程序之前,应该熟悉所用的ARM架构的特性和指令集。
3. 编写伪指令和数据段:ARM汇编语言中,伪指令用于定义常量、变量和数据段。
在编写程序之前,需要使用伪指令定义所需的数据段,并为程序分配必要的内存空间。
4. 编写指令段:指令段是ARM汇编程序的核心部分,包含实际执行的指令。
在编写指令段时,需要使用合适的指令来实现程序的功能。
指令可以包括算术运算、逻辑运算、分支跳转等。
5. 调试和测试:编写完ARM汇编程序后,需要进行调试和测试以确保程序的正确性和稳定性。
可以使用调试工具和模拟器来调试程序,并通过输入不同的测试数据进行测试。
6. 优化性能:在完成调试和测试后,可以对程序进行性能优化。
ARM汇编语言具有很高的性能优化空间,可以通过优化算法、减少指令数和利用硬件特性等方式来提升程序的执行效率。
7. 文档编写和维护:编写完ARM汇编程序后,应该撰写相应的文档来记录程序的功能、设计和使用方法。
文档应该清晰明了,方便其他人理解和使用。
三、ARM汇编语言编程技巧1. 熟悉寄存器:ARM架构包含多个通用寄存器和特殊寄存器,熟悉不同寄存器的用途和特性对于编写高效的ARM汇编程序非常重要。
2. 使用合适的指令:ARM汇编语言提供了丰富的指令集,选择合适的指令可以提高程序的效率。
需要根据程序需求和算法特点选择合适的指令。
arm汇编语言程序设计ARM汇编语言程序设计一、引言ARM汇编语言是一种低级语言,用于编写底层程序,如操作系统、嵌入式系统等。
它具有高效、灵活、可移植等特点,被广泛应用于各种嵌入式设备中。
本文将介绍ARM汇编语言程序设计的基本概念、语法规则以及常用指令,以帮助读者快速入门和理解该领域的知识。
二、基本概念1. 寄存器:ARM处理器具有16个通用寄存器,分别用R0~R15表示。
这些寄存器用于存储数据、地址和中间结果,并且在程序执行过程中可以被读取和写入。
2. 指令:ARM汇编语言的指令包括数据处理指令、分支指令、加载存储指令等。
这些指令用于执行各种操作,如算术运算、逻辑运算、条件判断等。
3. 标志位:ARM处理器的标志位用于记录执行过程中的状态信息,如进位标志、溢出标志等。
这些标志位对于程序的正确执行非常重要。
三、语法规则1. 指令格式:ARM汇编指令由操作码和操作数组成,其中操作码表示指令的类型,操作数表示指令的操作对象。
指令格式一般为“操作码操作数1, 操作数2, ...”。
2. 注释:注释以分号开头,用于对指令进行解释和说明。
注释对于程序的可读性和维护性非常重要,应当充分利用。
3. 标签:标签用于标识程序中的某个位置或标记某个指令,以便在其他地方进行引用。
标签一般以英文字母开头,后面可以跟随数字或下划线等字符。
4. 伪指令:伪指令是一种特殊指令,用于约定程序的起始地址、存储空间的分配等。
伪指令一般以句点开头,如“.data”表示数据段,“.text”表示代码段。
四、常用指令1. 数据处理指令:数据处理指令用于进行算术运算、逻辑运算等操作。
例如,“ADD”指令用于将两个操作数相加,并将结果存放在目标寄存器中。
2. 分支指令:分支指令用于实现程序的跳转和循环等控制流程。
例如,“B”指令用于无条件跳转到指定标签处执行。
3. 加载存储指令:加载存储指令用于实现数据的读取和写入。
例如,“LDR”指令用于将指定地址处的数据加载到寄存器中。
arm汇编语言程序设计步骤ARM汇编语言程序设计步骤一、概述ARM汇编语言是一种基于ARM架构的低级语言,用于编写底层程序和驱动程序。
在进行ARM汇编语言程序设计时,我们需要按照以下步骤进行。
二、确定需求在开始编写ARM汇编语言程序之前,我们需要明确程序的需求和目标。
这包括确定程序要实现的功能、输入和输出的格式、程序的性能要求等。
三、了解ARM架构在编写ARM汇编语言程序之前,我们需要了解ARM架构的特点和指令集。
ARM架构是一种精简指令集计算机(RISC)架构,具有高效的指令执行和低能耗的特点。
四、选择开发工具在进行ARM汇编语言程序设计时,我们需要选择合适的开发工具。
常用的开发工具包括ARM汇编器、调试器和模拟器。
这些工具可以帮助我们编译、调试和运行ARM汇编语言程序。
五、编写程序在编写ARM汇编语言程序时,我们需要按照以下步骤进行:1. 定义数据段:首先,我们需要定义程序的数据段。
数据段用于存储程序中使用的变量和常量。
在ARM汇编语言中,我们可以使用伪指令来定义数据段。
2. 定义代码段:然后,我们需要定义程序的代码段。
代码段包含程序的指令和算法。
在ARM汇编语言中,我们可以使用伪指令和指令来定义代码段。
3. 编写算法:在编写ARM汇编语言程序时,我们需要根据需求编写相应的算法。
算法是程序的核心部分,用于实现程序的功能和逻辑。
4. 调用系统服务:在ARM汇编语言中,我们可以通过调用系统服务来实现一些常用的功能,如输入输出、内存管理等。
调用系统服务需要使用特定的指令和参数。
5. 进行优化:在编写ARM汇编语言程序时,我们可以进行一些优化操作,以提高程序的性能和效率。
优化操作包括减少指令数量、减少内存访问次数、合并循环等。
六、编译和调试在完成ARM汇编语言程序的编写后,我们需要进行编译和调试。
编译是将汇编语言程序转换为机器码的过程,可以使用ARM汇编器进行编译。
调试是对程序进行测试和调试的过程,可以使用调试器和模拟器进行调试。
汇编语言程序设计基于arm体系结构pdf1. 引言1.1 概述汇编语言程序设计是计算机科学中重要的一环,它提供了对底层硬件的直接控制能力。
在这个数字化时代,我们生活在嵌入式系统和移动设备无处不在的时代。
ARM体系结构作为一种广泛应用于嵌入式系统和移动设备中的处理器架构,需求人员必须具备ARM汇编语言的基本开发技巧。
1.2 文章结构本文将深入探讨ARM体系结构下汇编语言程序设计的基础知识及其实践应用。
文章分为五个主要部分:- ARM体系结构概述:简要介绍ARM体系结构的发展历程、关键特点以及应用领域。
- 汇编语言基础知识:详细讲解ARM汇编语言中数据类型与运算指令、寄存器与内存访问、分支和循环指令等基本概念。
- ARM汇编语言程序设计实例解析:通过实例解析阐述ARM汇编语言程序结构与组成部分、寄存器使用示范以及内存访问案例分析等内容。
- 实践应用与未来展望:分享ARM汇编语言在嵌入式系统开发中的应用实例,并展望ARM技术的发展趋势和面临的挑战。
- 总结与建议:对文章进行总结,并给出学习ARM汇编语言程序设计的建议。
1.3 目的本文旨在帮助读者全面了解ARM体系结构下汇编语言程序设计的基本原理和操作方法。
通过学习此类知识,读者可以掌握ARM汇编语言的核心概念和技巧,提升在嵌入式系统、移动设备等领域中的开发能力。
同时,本文也将分享一些实践经验和未来发展趋势,为读者提供更多参考和启示。
无论是初学者还是有一定经验的开发人员,都可以从本文中获益并得到有益的指导。
2. ARM体系结构概述:2.1 发展历程:ARM(Advanced RISC Machine)体系结构起源于上世纪80年代末,最初由英国公司Acorn Computer开发。
早期的ARM处理器主要用于个人电脑领域。
随着技术的不断进步和市场需求的扩大,ARM逐渐应用于各种移动设备和嵌入式系统中,并取得了巨大成功。
2.2 关键特点:ARM体系结构有一些关键特点使其在市场上受到广泛认可。
汇编语言程序设计基于arm体系结构课程设计介绍汇编语言是一种底层的计算机语言,它直接与计算机硬件进行交互,可以对计算机进行更精细、更高效的控制。
在ARM体系结构中,汇编语言也起着至关重要的作用。
因此,学习ARM汇编语言编程是每个计算机科学专业学生必备的技能之一。
本课程设计旨在帮助学生掌握汇编语言在ARM体系结构中的应用,同时提高学生对计算机底层原理的理解与掌握。
在本课程设计中,我们将使用现代汇编语言,设计并实现一些实用的程序,包括算法、文件操作、输入输出等。
课程设计要求1. 基本要求本课程设计的基本要求是学生利用ARM汇编语言编写一个完整的程序,包括以下要求:•确定程序的主题和目标,设计算法并实现。
•实现程序的控制流程,包括输入输出、文件操作等。
•使用ARM汇编语言编写程序,并测试程序的正确性。
2. 提高要求为了挑战学生的编程能力,本课程设计还有一些额外的提高要求:•对程序进行性能优化,提高程序的效率。
•实现程序的图形化界面。
•尝试使用ARM汇编语言编写操作系统或驱动程序。
课程设计内容本课程设计包括以下几个部分:1. 算法设计与实现在此部分中,学生需要根据自己所选的主题,设计算法并实现。
选择一个好的算法可以帮助你更好地掌握汇编语言的编程技巧和思维方式。
2. 程序控制流程在此部分中,学生需要实现程序的控制流程,包括输入输出、文件操作、流程控制等。
这是程序实现的关键步骤之一,学生需要掌握汇编语言的底层控制逻辑。
3. 程序性能优化在此部分中,学生需要对程序进行性能优化,提高程序的效率。
学生需要了解ARM体系结构中的CPU指令集,并通过对程序的优化来提高程序的性能。
4. 程序图形化界面在此部分中,学生可以尝试使用其他语言或者库来实现程序的图形化界面。
这有助于学生了解汇编语言的局限性,以及不同编程语言之间的差异。
5. 操作系统或驱动程序实现在此部分中,学生可以尝试使用ARM汇编语言实现操作系统或驱动程序。
5.2ARM汇编程序设计ARM程序设计基础◆伪操作(derective)◆伪指令(Pseudo-instruction)◆ARM汇编语言语句格式◆ARM汇编语言的程序格式◆相关的程序示例伪操作◆符号定义伪操作◆数据定义伪操作◆汇编控制伪操作◆其他伪操作符号定义伪操作◆定义全局变量:GBLA、GBLL和GBLS ◆定义局部变量:LCLA、LCLL和LCLS ◆变量赋值:SETA、SETL、SETS ◆通用寄存器列表定义名称:RLISTGBLA、GBLL和GBLSGBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS)全局变量名GBLA objectsize ;全局的数字变量objectsize ,为0 Objectsize SETA 0xff;将该变量赋值为0xffSPACE objectsize ;引用该变量GBLL statusB;全局的逻辑变量statusB ,为{False} statusB SETL {TRUE};将该变量赋值为真全局:作用范围为包含该变量的源程序LCLA、LCLL和LCLSLCLA、LCLL和LCLS语法格式:LCLA(LCLL或LCLS)局部变量名MACRO;声明一个宏$label message $a ;宏的原型LCLS err ;声明一个局部变量err,为空串err SETS “error no: ” ;向该变量赋值$label;代码INFO 0,err:CC::STR:$a ;使用该串变量MEND;宏定义结束局部:作用范围为包含该局部变量的宏代码的一个实例SETA、SETL、SETSSETA、SETL和SETS语法格式:变量名SETA(SETL或SETS)表达式在向变量赋值前,必须先声明该变量RLISTRLIST语法格式:名称RLIST{寄存器列表}Context RLIST {r0-r6,r8,r10-r12,r15};将寄存器列表名称定义为Context ,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
排列顺序无关数据定义伪操作◆DCB◆DCW(DCWU)◆DCD(DCDU)◆DCFD(DCFDU)◆DCFS(DCFSU)◆SPACE◆MAP◆FIELDDCB语法格式:{标号}DCB表达式表达式取值范围:-128~255的数字或字符串。
DCB:“=”Nullstring DCB“Null string”,0;构造一个以0结尾的字符串DCW(或DCWU)语法格式:{标号}DCW(或DCWU)表达式DCW:半字对齐DCWU:不严格半字对齐。
表达式取值范围:-32768~65535data1DCW-128,num1+8;num1必须是已经定义过的DCD(或DCDU)语法格式:{标号}DCD(或DCDU)表达式DCD:“& ”DCD:字对齐DCDU:不严格字对齐。
data1DCD1,5,20;其值为1,5,20data2DCD memaddr+4;分配一个字单元,其值为程序中标号memaddr加4个字节语法格式:{标号}DCFD(或DCFDU)表达式每个双精度的浮点数占据两个字单元。
DCFD:字对齐DCFDU:不严格字对齐DCFD1E308,-4E-100 DCFDU100000,-.1,3.1E26语法格式:{标号} DCFS(或DCFSU)表达式每个单精度的浮点数占据一个字单元。
DCFS:字对齐DCFSU:不严格字对齐DCFS1E3,-4E-9DCFSU 1.0,-.1,3.1E6SPACE语法格式:{标号}SPACE表达式分配一片连续的存储区域并初始化为0。
其中,表达式为要分配的字节数。
SPACE:“%”Datastruc SPACE 280;分配连续280字节的存储单元并初始化为0MAP语法格式:MAP 表达式{,基址寄存器}用于定义一个结构化的内存表的首地址。
MAP:“^”通常与FIELD伪指令配合使用来定义结构化的内存表。
MAP0x80,R9;定义结构化内存表首地址的值为0x80+R9FILED语法格式:{标号} FIELD 表达式定义一个结构化内存表中的数据域。
FILED也可用“#”代替。
MAP0;定义结构化内存表首地址为0consta FIELD4;consta的长度为4字节,相对位置为0 constb FIELD4;constb的长度为4字节,相对位置为4 x FIELD8;x的长度为8字节,相对位置为0x8y FIELD8;y的长度为8字节,相对位置为0x10 string FIELD256;y的长度为256字节,相对位置为0x18MOV R9,#4096LDR R5,[R9,constb];将内存表中数据域constb读取到R5中汇编控制伪操作汇编控制(Assembly Control)伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:◆IF、ELSE、ENDIF◆WHILE、WEND◆MACRO、MEND◆MEXITIF、ELSE、ENDIF语法格式:IF逻辑表达式指令序列1ELSE指令序列2ENDIF示例:IF Version=“1.0”;指令;伪指令ELSE;指令;伪指令ENDIFWHILE、WEND语法格式:WHILE逻辑表达式指令序列WEND示例:count SETA1WHILE count<=4 count SETA count+1;codeWEND语法格式:MACRO$标号宏名$参数1,$参数2,……指令序列MEND示例:在ARM中完成测试-跳转操作需要两条指令,定义一条宏指令完成测试-跳转操作MACRO$label TestAndBranch$dest, $reg, $cc$label CMP$reg,#0B$cc$destMEND;在程序中调用该宏test TestAndBranch NonZero, r0, NE ……NonZero;程序被汇编后,宏展开的结果test CMP r0, #0BNE NonZero……NonZeroMEXIT语法格式:MEXITMEXIT用于从宏定义中跳转出去。
其他常用的伪操作◆AREA◆CODE16、CODE32◆ENTRY◆END◆EQU◆IMPORT◆GET(或INCLUDE)AREA语法格式:AREA段名属性1,属性2,……定义一个代码段或数据段。
常用的属性如下:CODE:用于定义代码段,默认为READONLY。
DATA:用于定义数据段,默认为READWRITE。
READONLY:指定本段为只读,代码段默认为READONLY。
READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。
示例:AREA Example,CODE,READONLY;codeCODE16、CODE32语法格式:CODE16(或CODE32)CODE16:其后的指令序列为16位的Thumb指令。
CODE32:其后的指令序列为32位的ARM指令。
示例:AREA ChangeState,CODE,READONLYCODE32;指示下面的指令为ARM指令LDR r0,=start+1BX r0;切换到Thumb状态,并跳转到start处执行CODE16;指示下面的指令为Thumb指令start MOV r1,#10ENTRY语法格式:ENTRYENTRY伪操作用于指定汇编程序的入口点。
在一个源文件里最多只能有一个ENTRY(可以没有)。
在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定)。
示例:AREA example,CODE,READONLYENTRY;应用程序的入口点END语法格式:ENDEND伪指令用于通知编译器已经到了源程序的结尾。
示例:AREA example,CODE,READONLY……ENDEQU语法格式:名称EQU表达式{,类型} EQU:“* ”示例:abcd EQU 2 ;定义abcd符号的值为2abcd EQU label1+16 ;定义abcd符号的值(label1+16)IMPORT语法格式:IMPORT标号{[WEAK]}用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。
示例:AREA Init,CODE,READONLYIMPORT Main;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义……ENDGET(或INCLUDE)语法格式:GET文件名用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。
可以使用INCLUDE代替GET。
使用方法与C语言中的“include”相似。
示例:AREA example,CODE,READONLYGET file1.s;包含源文件file1.s GET C:\project\file2.s ;包含源文件file2.s GET C:\Program files\file3.s ;包含源文件file3.s伪指令◆ADR◆ADRL◆LDR◆NOPADR-小范围的地址读取伪指令◆语法格式ADR{cond} register, exprcond:可选的指令执行条件register:目标寄存器expr:基于PC或寄存器的地址表达式,取值范围:●地址非字对齐,-255~255●地址字对齐,-1020~1020将基于PC或寄存器的地址值读取到寄存器中。
ADR伪指令被替换成一条合适的指令(ADD指令或SUB指令)。
如果不能用一条来实现ADR伪指令的功能,编译器将报告错误。
ADR-小范围的地址读取伪指令示例:start MOV r0,#10 ;PC值为当前指令地址值加8字节ADR r4,start;本ADR伪指令将被编译器替换成; SUB r4,pc,#0xcADRL-中等范围的地址读取伪指令◆语法格式ADRL{cond} register, exprcond:可选的指令执行条件register:目标寄存器expr:基于PC或寄存器的地址表达式,取值范围:●地址非字对齐,-64KB~64KB●地址字对齐,-256KB~256KB将基于PC或寄存器的地址值读取到寄存器中。
ADRL伪指令被替换成两条合适的指令。
如果不能用两条来实现ADRL伪指令的功能,编译器将报告错误。
ADRL-中等范围的地址读取伪指令示例:start MOV r0,#10 ;PC值为当前指令地址值加8字节ADR r4,start+60000;本ADRL伪指令将被编译器替换成下面两条指令;ADD r4,pc,#0xe800;ADD r4,r4,#0x254;60000=0xEA60LDR-大范围的地址读取伪指令◆语法格式LDR{cond} register, =[expr|label-expr]cond:可选的指令执行条件register:目标寄存器expr:32位常数●当expr没有超过MOV或MVN指令中的地址取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令●反之,编译器将该常数放在数据缓冲池中,同时用一条基于PC的LDR指令读取该常数。