4.ARM汇编语言程序设计 - part2

合集下载

02实验二 ARM汇编语言程序设计

02实验二 ARM汇编语言程序设计

实验二 ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编指令二、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。

2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。

三、汇编语言简介1.ARM汇编的一些简要的书写规范ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。

ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。

在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。

注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。

详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。

2. ARM汇编语言程序的基本结构在ARM汇编语言程序中,是以程序段为单位来组织代码。

段是相对独立的指令或数据序列,具有特定的名称。

段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。

一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。

可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。

◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。

◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。

链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。

源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。

3. 简单的小例子下面是一个代码段的小例子AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]……END在汇编程序中,用AREA指令定义一个段,并说明定义段的相关属性,本例中定义了一个名为Init的代码段,属性为只读。

实验二_ARM汇编语言程序设计

实验二_ARM汇编语言程序设计

实验二ARM汇编语言程序设计实验目的1、了解ARM汇编语言程序的结构特点2、了解ARM汇编语言程序的编写方法3、掌握用ARM汇编语言设计简单程序实验仪器设备及软件ARM实验箱,计算机,ADS程序开发软件实验原理1、存储空间的格式ARM920将存储空间视为从0开始由字节组成的线性集合,字节0-3中保存了第一个字,字节4-7中保存了第二个字,依此类推。

字节还可以按小端格式或大端格式排列。

ARM实验箱中存储器的配置见附录C。

2、ARM的寄存器ARM状态下任何时刻都可以看到16个通过寄存器(r0-r15),1或2个状态寄存器(CPSR,SPSR),在特权模式下会切换到具体模下的寄存器组。

每个寄存器都是32位的,并且每个通用寄存器都可以作为数据处理的源数据或目标数据寄存器。

因此可以编写出更精简的程序。

3、ARM指令的条件执行状态寄存器中的N,Z,C,V是数据处理指令影响的标志。

几乎每条ARM指令可以根据状态位或状态位的逻辑运算有条件执行。

条件执行的指令后缀参考教材。

4、桶形移器ARM的桶形移位器,使ARM指令的中第二个操作数非常录活。

利用移位器,一条ARM 指令可以完成更多功能。

移位操作有:LSL 逻辑左移LSR 逻辑右移ASL 算术左移ASR 算术右移ROR 循环右移RRX 带扩展循环右称实验内容1、把内存中ramaddr开始的ramword个字清零(1)用后变址法ramaddr equ 0x31000000ramword equ 64clrrammov r0,#0mov r1,#ramwordldr r2,=ramaddrclrram1str r0,[r2],#4subs r1,r1,#1bne clrram1mov pc,lrLTORG(2)用前变址法clrrambakmov r0,#0mov r1,#ramwordldr r2,=ramaddr-4clrram2str r0,[r2,#4]!subs r1,r1,#1bne clrram2mov pc,lrLTORG2、把寄存器中,r0-r12的32位无符号32位数进行求和,和的低32位保存在r1中,高32位保存在r0中。

ARM汇编语言程序设计

ARM汇编语言程序设计

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变量中。

最后将最大值输出,并结束程序。

4.ARM汇编语言程序设计

4.ARM汇编语言程序设计
A Free sample background from
Slide 9
例 2: .equ x, 45 /* 定义变量x,并赋值为45*/ .equ y, 64 /* 定义变量y,并赋值为64*/ .equ stack_top, 0x1000 /* 定义栈顶0x1000*/ .global _start .text
Slide 6
汇编源程序示例
A Free sample background from
Slide 7
ARM的汇编语言程序一般由几个段组成,每个段均由 AREA伪操作定义。 段可以分为多种,如代码段、数据段、通用段,每 个段又有不同的属性,象代码段的默认属性为 READONLY,数据段的默认属性为READWRITE。 本程序定义了两个段,第一个段为代码段codesec, 它在存储器中存放用于程序执行的代码以及main函 数的本地字符串;第二个段为数据段constdatasec ,存放了全局的字符串,由于本程序没有对数据进 行写操作,该数据段定义属性为READONLY。
Slide 1
嵌入式系统原理与接口技术
第四章 汇编语言程序设计
A Free sample background from
Slide 2
ARM源程序文件 ARM源程序文件
文件类型 汇编语言源文件 C语言源文件 C++源文件 引入文件 头文件 扩展名 .s .c .cpp .INC .h
A Free sample background from
Slide 17
5.ARM汇编语言语句中的表达式 5.ARM汇编语言语句中的表达式 ARM汇编语言语句中,表达式一般由符号、数 值、单目或多目操作符以及括号组成的,可分 为: 字符串表达式 数字表达式 基于寄存器和基于PC的表达式 逻辑表达式

ARM汇编语言程序设计

ARM汇编语言程序设计

① 使用伪操作声明全局变量。 GBLA GBLL GBLS Test1 Test2 {TRUE} Test3 ;定义一个全局的1 SETA 0xaa
Test2 SETL
;将该变量赋值为0xaa
;定义一个全局的逻辑变量,变量名为Test2 ;将该变量赋值为真 ;定义一个全局的字符串变量,变量名为Test3
(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化
(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化 (4)DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化 (5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化 (6)DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的 数据初始化 (7)SPACE用于分配一片连续的存储单元 (8)MAP用于定义一个结构化的内存表首地址 (9)FIELD用于定义一个结构化的内存表的数据域

13
4.1 ARM汇编器支持的伪操作

4.1.3 数据定义(Data Definition)伪操作

数据定义伪操作一般用于为特定的数据分配存储单元, 同时可完成已分配存储单元的初始化。常见的数据定义 伪操作有如下几种。

(1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化
15
4.1 ARM汇编器支持的伪操作

4.1.3 数据定义(Data Definition)伪操作


2.DCW(DCWU) (1)语法格式
DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表 达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单 元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。

第二讲_ARM汇编语言程序设计

第二讲_ARM汇编语言程序设计

•在ARM汇编语言中,子程序调用是通过BL指令来完成的。 BL指令的语法格式如下: •BL subname •其中,subname是被调用的子程序的名称。
子程序的返回
在返回调用子程序时,转移链接指令保存到LR寄存器 (r14)中的值需要拷贝回程序寄存器PC(r15)。
跳转表思想
•在程序设计中,有时为使程序完成一定的 功能,需要调用一系列子程序中的一个,而 决定究竟调用哪一个由程序的计算值确定。 跳转表是解决该问题的有效方案。跳转表是 利用程序计数器PC在通用寄存器文件中的可 见性来实现的,如下例所示:
第二讲
ARM汇编语言程序设计
ARM汇编语言程序设计
ARM汇编中的文件格式 ARM汇编语言语句格式 ARM汇编语言程序格式 ARM汇编语言编程的重点 ARM汇编程序实例
一、ARM汇编中的文件格式
ARM 源程序文件(可简称为源文件)可以由任意一 种文本编辑器来编写程序代码,它一般为文本格式。在 ARM程序设计中,常用的源文件可简单分为以下几种:
• 这是ARM中典型的数据理指令,格式 如下所示:
ADD r0, r1, r2 ;r0 <= r1 + r2
立即数操作
• 在数据处理指令中,第二操作数除了 可以是寄存器,还可以是一个立即数,如 下所示: • ADD R3, r3,#1 ;r3 <= r3 + 1 • AND R8, r7,#0xff ;r8 <= r7[7:0] •需要特别注意的是:在32位指令编码中, 有效立即数是由一个8位的立即数循环右移 2n位得到。
• CODE32 • INTO_ARM • ADR R0,INTO_THUMB+1 • BX R0 • ….. • CODE16 • INTO_THUMB ……. • ADR R5,INTO_ARM • BX R5

第二部分习题答案

第六章1、ARM处理器的特点是什么?答:ARM处理器立足于嵌入式市场,其设计思想并不单纯地追求处理器速度,而是着眼于系统的整体性能。

具体来讲,主要包括以下几个方面。

首先,低功耗是一个主要的考虑方面。

其次,高代码密度是嵌入式系统的又一个重要需求。

另外,嵌入式系统通常都是价格敏感的。

还有一个影响嵌入式系统性能的因素就是处理器内核管芯(die)的面积,对于一个单片方案,处理器内核所占的面积越小,留给外设电路的空间就越大,这可以减少最终产品的外围芯片数目,从而降低设计和制造成本。

在体系结构方面,ARM处理器采用精简指令系统计算机(RISC)结构,但ARM处理器又不是纯粹的RISC。

为了能够更好地满足嵌入式应用的需求,ARM处理器还增加了以下特点:●一些特定指令的周期数可变,即并不是所有的ARM指令都是单周期的。

●内嵌桶形移位器产生了更为复杂的指令。

●Thumb 16位指令集。

●条件执行。

这个特性可以减少分支指令的数目,从而改善性能,提高代码密度。

2、ARM处理器系列主要包括几大类?各自的特性是什么?3、ARM处理器有哪些处理器模式?各自如何切换?答:ARM处理器有7种处理器模式,它们分别是:用户模式,快速中断模式,外部中断模式,管理模式,中止模式,未定义模式和系统模式。

各模式之间的切换,可以通过软件控制来实现,也可以由外部中断或异常而引起。

处理器复位之后,首先进入管理模式,操作系统内核通常处于这种模式。

当运行用户程序时,进入用户模式。

在用户模式下,应用程序不能访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式的切换,只允许对CPSR(当前程序状态寄存器)的控制域进行读操作,但允许对CPSR条件标志的读/写访问,用户模式下执行软中断指令(SWI)时也进入管理模式。

系统模式是一种特殊的用户模式,它使用和用户模式完全相同的寄存器,但允许对CPSR的完全访问,当操作系统任务需要访问系统资源但又想避免访问与异常模式相关的寄存器时进入该模式。

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汇编语言程序设计


DCB
语法格式: {标号} DCB 体现式
体现式取值范围:-128~255旳数字或字符串。 DCB:“=”
Nullstring DCB “Null string”,0 ;构造一种以0结尾旳字符串
DCW(或DCWU)
语法格式: {标号} DCW(或DCWU) 体现式
DCW:半字对齐 DCWU:不严格半字对齐。 体现式取值范围:-32768~65535
SPACE objectsize
;全局旳数字变量objectsize ,为0 ;将该变量赋值为0xff ;引用该变量
statusB
GBLL statusB ;全局旳逻辑变量statusB ,为{False} SETL {TRUE} ;将该变量赋值为真
全局:作用范围为包括该变量旳源程序
LCLA、LCLL和LCLS
;包括源文件file1.s ;包括源文件file2.s ;包括源文件file3.s
伪指令
ADR ADRL LDR NOP
ADR-小范围旳地址读取伪指令
语法格式 ADR{cond} register, expr cond:可选旳指令执行条件 register:目旳寄存器 expr:基于PC或寄存器旳地址体现式,取值范围: 地址非字对齐,-255~255 地址字对齐,-1020~1020
{寄存器列表}
Context RLIST {r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context ,可在ARM指令 LDM/STM中经过该名称访问寄存器列表。排列顺序无 关
数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD

第4章ARM汇编语言程序设计


(4)定义结构化内存表首地址/数据域




格式 MAP expr{,base_register} {label} FIELD expr 示例 定义一个内存表,其首地址为0x100。该表包含3个 域:A的长度为16个字节,位置为0x100;B的长度为 32个字节,位置为0x110;S的长度为256个字节,位 置为0x130。 MAP 0x100 A FIELD 16 B FIELD 32 S FIELD 256 一个寄存器相关的首地址定义结构化内存表。 MAP 0,R9;将结构化内存表的首地址设为R9的值 FIELD 4 LAB FIELD 4 LDR r0,LAB;相当于LDR R0,[R9,#4] 23
第4章 ARM汇编语言程序设计
(3)分配存储空间SPACE
• • • •
格式 {label} SPACE expr 说明 Label-可选的程序标号; Expr-分配的字节数。 示例 分配连续100字节的存储单元并初始化为0。 DataSpace SPACE 100
22
第4章 ARM汇编语言程序设计
14
第4章 ARM汇编语言程序设计
1)符号定义伪操作
(1)全局变量定义GBLA、GBLL及GBLS (2)局部变量定义LCLA、LCLL及LCLS 格式:GBLA/ GBLL/ GBLS variable 格式:LCLA/ GCLL/ GCLS variable 说明 • variable -全局/局部变量名称 • A-算术变量(初始化为0) • L-逻辑变量(初始化为假F) • S-字符串变量(初始化为空)
两种常用的ARM编译开发环境

ADS/SDT、RealView MDK等ARM公司推出的 开发工具 GNU ARM开发工具 ARM汇编语言的伪操作、宏指令在不同 的编译环境下有不同的编写形式和规则
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

格式
模式
说明
[Rn], ±<Rm>,<shift>#<offset_12> 带移位的寄存 先从[Rn]中取出操作数,
9
器后变址寻址 然后对Rm进行移位操作, 得到偏移R’m,最后将Rn
值更新为Rn±R’m。
【例子】 LDR R8,[R10] LDRNE R2,[R5,#960]! STRB R0,[R3,-R8,ASR #2] STR R5,[R7],#-8
Rm先进行移位操作,得到 偏移R’m,从[Rn+R’m]中 取出操作数之后,Rn的值 自动更新为Rn+R’m。
先从[Rn]中取出操作数, 然后将Rn值更新为Rn±立 即数。
先从[Rn]中取出操作数, 然后将Rn值更新为Rn±Rm。
注:立即数<offset_12>的范围是-212-1~212-1,即-4095~4095。
例: LDMFD SP!,{R4-R12,PC}^
(3)堆栈操作的寻址方式addressing_mode与数据块操作不同。
根据堆栈的种类不同,堆栈操作的寻址方式分为以下4种。
格式 1 FD(Full Descending) 2 ED(Empty Descending) 3 FA(Full Ascending) 4 EA(Empty Ascending)
个寄存器的任何子集(R0~R15),寄存器由小到大排列, 使用“,”隔开,例如{R1, R2, R6-R9}。 • addressing_mode:寻址方式。 该类指令的寻址方式共有4种,如下所述。
格式
模式
1 IA(Increment After) 后递增方式
2 IB(Increment Before) 先递增方式
后变址寻址
LDR/STR LDM/STM SWP
返回
2. ARM数据处理指令
数据处理指令包括以下几种: 数据传送指令。
▪ 包括MOV,MVN。 算术逻辑运算指令。
▪ 包括算术指令ADD,ADC,SUB,SBC,RSB,RSC。 ▪ 包括逻辑指令AND,ORR,EOR,BIC。 比较与测试指令。 ▪ 包括CMP,CMN,TST,TEQ。 *乘法指令。 ▪ 包括MUL,MLA,SMULL,SMLAL,UMULL,UMLAL。
Rn:基址寄存器。Rn必须与Rd和Rm不同。
例:
SWP R1,R1,[R0]
;[R0] R1
SWP R1,R2,[R0]
;[R0]→R1,R2→[R0]
★ 存储器访问指令小结 ① Load/Store寻址基本方式
寄存器间接寻址
LDR R1,[Rn]
变址寻址
LDR R1,[R0,#4] LDR R1,[R0,R3] LDR R1,[R0,R3,LSR #2]
2 [Rn,±Rm]
寄存器偏移寻址 Rn为基址寄存器,Rm为偏移寄存器。
格式
[Rn,Rm,<shift>#<offset_12>]
3
[Rn,#±<offset_12>]!
4
[Rn,±Rm]!
5
[Rn,Rm,<shift>#<offset_12>]!
6
[Rn],#±<offset_12>
7
8 [Rn],±<Rm>
LDR R1,[R0,#4]! LDR R1,[R0,R3]! LDR R1,[R0,R3,LSR #2]!
基本变址寻址 前变址寻址
LDR R1,[R0],#4 LDR R1,[R0],R3 LDR R1,[R0],R3,LSR #2
② Load/Store分类 Load/Store单寄存器 Load/Store多寄存器 寄存器和存储器数据互换
(2)LDM和STM ① 存储器中的数据块传送操作
用途:将一块连续存储空间的数据加载到通用寄存器组(LDM) 和将一组通用寄存器组的数据存储到一块连续的存储空间中(STM)。
指令的格式如下:
LDM|STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
• Rn:存放这块连续存储空间的基地址。 • !:表示最后的地址会写回到基址寄存器Rn中。Rn不能用R15(PC)。 • registers:加载或存储的寄存器列表,用{}括起来。允许包含16
3 DA(Decrement After) 后递减方式
4 DB(Decrement Before) 先递减方式
说明 每次传送后地址加4 每次传送前地址加4 每次传送后地址减4 每次传送前地址减4
② 堆栈操作(压栈STM和出栈LDM) 指令的格式如下:
LDM|STM{<cond>}<addressing_mode> R13!,<registers>{^}
例:
ADDEQS R9,R5,R5,LSL #3 SUB R3,R2,R1,ROR R7
(1) 数据传送指令
① MOV指令
功能:用于传送数据。将Operand2的值传送到目标寄存器Rd中。
指令格式:MOV{<cond>}{S} <Rd>,<operand2>
例:
MOV R1,#0x10 MOV R0,R1 MOVS R3,R1,LSL #2
(LDM和STM指令)
堆栈操作
• 寄存器与存储器之间的数据互换
(SWP指令)
(1)LDR和STR
① 字和无符号字节的加载/存储操作
指令的格式如下:
LDR|STR{<cond>}{B} <Rd>, <addressing_mode>
• B:字节操作后缀。若有B,则传送一个字节,否则传送一个字。
注:指令LDRB <Rd>,<addressing_mode>是将存储器中的一个字 节加载到Rd寄存器的最低字节,且Rd寄存器的其它字节清零。
数据处理指令的格式:
<opcode>{<cond>}{S} {Rd},{Rn},<operand2>
其中: • opcode:指令助记符,如ADD、SUB、MOV等; • cond:条件码; • S:本指令的运行结果是否影响CPSR中的条件标志位; • Rd:目标寄存器,存放运行结果; • Rn:第一操作数,存放在Rn寄存器中; • operand2:第二操作数,第二操作数的形式可以有多种,比较
特殊用法:
;R1←0x10 ;R0←R1 ;R3←R1<<2,并影响标志位
a. 如果目标寄存器Rd是R15 (PC) 时,将修改程序计数器,实现程 序跳转,可用于子程序返回。
例:MOV PC,R14
;PC←LR,子程序返回
b. 如果目标寄存器Rd是R15 (PC) 且指令带S位时,指令在执行程 序跳转的同时,将当前处理器模式的SPSR寄存器的内容复制到 CPSR中。该方式常用于异常模式的返回。
;R1←0xFFFFFF00 ;R1←11111011 ;将R2取反,结果存到R1
(2) 算术逻辑运算指令 ① 算术运算指令ADD、SUB、RSB、ADC、SBC、RSC
指令格式:opcode{<cond>}{S} Rd,Rn,Operand2 • opcode:操作码ADD、SUB、RSB、ADC、SBC、RSC其中之一。
模式 带移位的寄存 器偏移寻址
立即数前变址 寻址
寄存器前变址 寻址
带移位的寄存 器前变址寻址
立即数后变址 寻址
寄存器后变址 寻址
说明
Rn为基址寄存器,Rm先 进行移位操作,再和Rn结 合。
从[Rn±立即数]中取出操 作数之后,Rn的值自动更 新为Rn±立即数。
从[Rn±Rm]中取出操作数 之后,Rn的值自动更新为 Rn±Rm。
模式 满递减堆栈 空递减堆栈 满递增堆栈 空递增堆栈
例:
LDMIA R8,{R0,R2,R9}
STMDB R1!,{R3-R6,R11,R12}
STMFD R13!,{R0,R4-R7,LR}
LDMFD R13!,{R0,R4-R7,PC}
(3)SWP——寄存器和存储器之间进行数据互换。SWP指令是 一个原子操作,可实现信号量操作。
操作。 ⑤ *协处理器指令:专用于控制外部协处理器。 ⑥ *异常产生指令:SWI。
1. ARM存储器访问指令
存储器访问指令可以分为以下几种:
• Load/Store单寄存器操作 字和无符号字节操作
(LDR和STR指令)
半字和带符号字节操作
双字操作
• Load/Store多寄存器操作 存储器中的数据块传送操作
或 LDM|STM{<cond>}<addressing_mode> SP!,<registers>{^}
堆栈操作与数据块操作的区别在于:
(1)在堆栈操作中,存储器(内存)基址寄存器Rn必须用R13(SP)堆栈指 针,指向堆栈区域。且“!”必须要加,栈指针自动更新。
(2)堆栈操作的^后缀的作用是:在异常模式下,LDM指令的寄存器列表 <registers>中包含PC(R15),则在数据传送完毕之后,会自动将SPSR拷 贝到CPSR中。主要用于异常返回时恢复现场。
• addressing_mode:寻址方式。
该类指令中存储器操作数的寻址方式共有6种,如下所述。
格式
模式
1 [Rn,#±<offset_8>] 立即数偏移寻址
2 [Rn,±Rm]
寄存器偏移寻址
3
[Rn,#±<offset_8>]!
相关文档
最新文档