ARM寄存器详解
ARM中各个寄存器的用途

1.寄存器使用说明
ARM处理器中R0-R15共16个寄存器,它们的用途是一些约定的习惯!
并依据这些用途定义了别名。
如图:
寄存器的使用情况如下:
1)子程序间通过寄存器R0-R3来传递参数,这时可以使用它们的别名A0-A3,被调用的子程序返回前无须重复R0-R3的内容。
2)在子程序中,使用R4-R11来保存局部变量,这时可以使用它们的别名V1-V8,如果在子程序中使用了它们的某些寄存器,子程序进入时要保存这些寄存器的值,返回时再次恢复它们;
对于子程序中没有使用到的寄存器,则不必进行这些操作,在Thumb指令中,通常只能使用寄存器R4-R7来保存局部变量。
3)寄存器R12用作子程序间scratch寄存器,别名为IP。
4)寄存器R13用作数据栈指针,别名SP,在子程序中寄存器R13不能用作它用,它的值在进入、退出子程序时必须相等。
5)寄存器R14称为链接寄存器,别名LR,它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,R14可用作它用。
6)寄存器R15是程序计数器,别名PC,没用别的用途。
ARM关键几个寄存器

ARM关键几个寄存器图中缩写如下:R:Register;寄存器PC:Program Counter;程序计数器CPSR:Current Program Status Register;当前程序状态寄存器SPSR:Saved Program Status Register;保存的程序状态寄存器SP:Stack Pointer;数据栈指针LR:Link Register;连接寄存器SB:静态基址寄存器SL:数据栈限制指针FP:帧指针IP:Intra-Procedure-call Scratch Register;内部程序调用暂存寄存器ARM共有37个寄存器,可以工作在7种不同的模式。
以下根据上图进行分类的说明:未分组寄存器r0-r7为所有模式共用,共8个。
分组寄存器中r8-r12,快速中断模式有自己的一组寄存器,其他模式共用,所以有10个。
分组寄存器中r13,r14,除了用户模式和系统模式共用外,其他模式各一组,所以共有2*7 - 2 = 12个。
r15和CPSR共用,共2个;SPSR除了用户模式和系统模式没有外,其他模式各一个,共5个。
所以总数为8+10+12+2+5 = 37个。
与此对应的汇编名称表明了它们通常的约定用法。
1. PC(程序计数器) = windows 中 EIP解析:处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。
为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取指指令的地址.程序计数器(PC)正是起到这种作用,所以通常又称之为‘指令计数器’。
CPU总是按照PC的指向对指令序列进行取指、译码和执行,也就是说,最终是PC 决定了程序运行流向。
故而,程序计数器(PC )属于特别功能寄存器范畴,不能自由地用于存储其他运算数据.在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU 按照 PC的指示从内存读取第一条指令(取指)。
ARM寄存器及功能介绍R0-R15寄存器

ARM寄存器及功能介绍R0-R15寄存器1、ARM 寄存器组介绍ARM 处理器⼀般共有 37 个寄存器,其中包括:(1) 31 个通⽤寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。
(2) 6 个状态寄存器,都是 32 位的寄存器。
ARM 处理器共有 7 种不同的处理器模式:⽤户模式(User),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(Svc),数据访问中⽌模式(Abort),未定义指令中⽌模式(Und),系统模式(Sys),在每⼀种处理器模式中有⼀组相应的寄存器。
在任意⼀种处理器模式下,可见的寄存器包括 15 个通⽤寄存器(R0~R14)、⼀个或者⼆个状态寄存器以及程序计数器(PC)。
在所有的寄存器中,有些是各模式共⽤同⼀个物理寄存器,有些寄存器是各个模式⾃⼰拥有独⽴的物理寄存器其中 r0~r3 主要⽤于⼦程序间传递参数, r4~r11 主要⽤于保存局部变量,但在 Thumb 程序中,通常只能使⽤ r4~r7 来保存局部变量;r12 ⽤作⼦程序间scratch 寄存器,即 ip 寄存器; r13 通常⽤做栈指针,即 sp; r14 寄存器⼜被称为连接寄存器(lr),⽤于保存⼦程序以及中断的返回地址; r15 ⽤作程序计数器(pc),由于 ARM 采⽤了流⽔线机制,当正确读取了 PC 的值后,该值为当前指令地址加8 个字节,即 PC 指向当前指令的下两条指令地址。
CPSR和SPSR都是程序状态寄存器,其中SPSR是⽤来保存中断前的CPSR中的值,以便在中断返回之后恢复处理器程序状态。
2.CPSR寄存器详解所有处理器模式下都可访问当前程序状态寄存器CPSR。
CPSR中包含条件码标志、中断禁⽌位、当前处理器模式以及其他状态和控制信息。
在每种异常模式下都有⼀个对⽤的程序状态寄存器SPSR。
当异常出现时,SPSR⽤于保存CPSR的状态,以便异常返回后恢复异常发⽣时的⼯作状态。
ARM的37个寄存器详解

ARM的37个寄存器详解ARM寄存器ARM共有37个32位物理寄存器,7种⼯作模式下可访问的寄存器见下表,User和System使⽤完全相同的物理寄存器。
2.1 R0~R7所有⼯作模式下,R0-R7都分别指向同⼀个物理寄存器(共8个物理寄存器),它们未被系统⽤作特殊的⽤途。
在中断或异常处理进⾏⼯作模式转换时,由于不同⼯作模式均使⽤相同的物理寄存器,可能造成寄存器中数据的破坏。
2.2 R8~R12在User&System、IRQ、Svc、Abt和Und模式下访问的R8~R12都是同⼀个物理寄存器(共5个物理寄存器);在FIQ模式下,访问的R8_fiq~R12_fiq是另外独⽴的物理寄存器(共5个物理寄存器)。
2.3 R13和R14在User&System、IRQ、FIQ、Svc、Abt和Und访问的R13_~R14都是各⾃模式下独⽴的物理寄存器(共12个物理寄存器)。
R13在ARM指令中常⽤作堆栈指针(SP),但这只是⼀种习惯⽤法,⽤户也可使⽤其他的寄存器作为堆栈指针。
⽽在Thumb指令集中,某些指令强制性的要求使⽤R13作为堆栈指针。
由于处理器的每种⼯作模式均有⾃⼰独⽴的物理寄存器R13,在⽤户应⽤程序的初始化部分,⼀般都要初始化每种模式下的R13,使其指向该⼯作模式的栈空间。
这样,当程序进⼊异常模式时,可以将需要保护的寄存器放⼊R13所指向的堆栈,⽽当程序从异常模式返回时,则从对应的堆栈中恢复,采⽤这种⽅式可以保证异常发⽣后程序的正常执⾏。
R14称为链接寄存器(Link Register),当执⾏⼦程序调⽤指令(BL)时,R14可得到R15(程序计数器PC)的备份。
在每⼀种⼯作模式下,都可⽤R14保存⼦程序的返回地址,当⽤BL或BLX指令调⽤⼦程序时,将PC的当前值复制给R14,执⾏完⼦程序后,⼜将R14的值复制回PC,即可完成⼦程序的调⽤返回。
以上的描述可⽤指令完成。
执⾏以下任意⼀条指令:MOV PC, LRBX LR在⼦程序⼊⼝处使⽤以下指令将R14存⼊堆栈:STMFD SP!,{,LR}对应的,使⽤以下指令可以完成⼦程序返回:LDMFD SP!,{,PC}R14也可作为通⽤寄存器。
ARM9寄存器超全详解

自己学驱动17——ARM工作模式和ARM9寄存器1.ARM体系CPU的7种工作模式(1)用户模式(usr):ARM处理器正常的程序执行状态。
(2)快速中断模式(fiq):用于高速数据传输或通道处理。
(3)中断模式(irq):用于通用的中断处理。
(4)管理模式(svc):操作系统使用的保护模式。
(5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
(6)系统模式(sys):运行具有特权的操作系统任务。
(7)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
可以通过软件进行模式的切换,或者发生各类中断、异常时CPU自动进入相应的模式。
除用户模式以外的6种工作模式都属于特权模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。
2.ARM920T的寄存器ARM920T有31个通用的32位寄存器和6个程序状态寄存器,这37个寄存器分为7组,进入某个工作模式时就使用它的那组寄存器。
有些寄存器,不同的工作模式下有自己的副本,当切换到另一个工作模式时,那个工作模式的寄存器副本将被使用:这些寄存器被称为备份寄存器。
从下图中可以看出fiq模式的备份寄存器最多,这是为了提高fiq的响应速度,减少保存寄存器值所花费的时间。
CPSR在七种模式下都是同一个寄存器,所以可以修改里面的值来转换到不同的工作模式下。
R0~R15可以直接访问,除R15外均为通用寄存器,既可以用于保存数据也可以用于保存地址。
R13~R15稍有特殊:R13又被称为栈指针寄存器sp,通常用于保存栈指针;R14又被称为程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份,而当发生中断或异常时,对应的R14_svc、R14_irq、R14_fiq、R14_abt或R14_und保存R15的返回值;R15又被称为程序计数器PC。
arm寄存器的分类

arm寄存器的分类ARM寄存器是ARM体系结构中的一部分,用于存储和处理数据。
根据其功能和用途的不同,ARM寄存器可以分为通用寄存器、程序状态寄存器、系统控制寄存器和浮点寄存器等多个类别。
一、通用寄存器通用寄存器是最常用的寄存器类型,用于存储临时数据、变量和计算结果等。
ARM体系结构提供了16个32位的通用寄存器,分别用R0-R15表示。
其中,R0-R12可用于存储数据和计算结果,R13为堆栈指针SP,R14为链接寄存器LR,R15为程序计数器PC。
通用寄存器具有快速访问和高灵活性的特点,可以在程序执行过程中频繁读写。
在函数调用过程中,通用寄存器用于保存临时变量、函数参数和返回值,保证程序的正确执行。
二、程序状态寄存器程序状态寄存器(CPSR)是ARM体系结构中的一种特殊寄存器,用于存储和控制程序的执行状态。
CPSR寄存器是一个32位的寄存器,包含了当前程序的运行状态、中断控制状态和条件执行状态等信息。
CPSR寄存器的位域有多个,其中最重要的有条件执行位、中断控制位和程序状态位等。
条件执行位用于控制条件分支指令的执行,中断控制位用于控制中断的使能和禁止,程序状态位用于记录程序的运行状态,如运行模式、状态标志和当前指令的执行情况等。
三、系统控制寄存器系统控制寄存器(SCR)是ARM体系结构中的一种特殊寄存器,用于存储和控制系统的运行状态。
SCR寄存器是一个32位的寄存器,包含了系统的控制状态、访问权限和异常处理等信息。
SCR寄存器的位域有多个,其中最重要的有访问权限位、异常处理位和系统控制位等。
访问权限位用于控制对系统资源的访问权限,异常处理位用于控制异常处理器的行为,系统控制位用于控制系统的运行方式和功能。
四、浮点寄存器浮点寄存器是ARM体系结构中的一种特殊寄存器,用于存储和处理浮点数数据。
ARM体系结构提供了16个32位或64位的浮点寄存器,分别用S0-S31或D0-D31表示。
其中,S0-S15用于单精度浮点数操作,D0-D15用于双精度浮点数操作。
Arm汇编第一讲Arm寄存器与七种模式两种状态

Arm汇编第⼀讲Arm寄存器与七种模式两种状态⽬录Arm学习第⼀讲 Arm寄存器与模式Arm寄存器1.1 什么是寄存器寄存器(register) 学过windows逆向的都知道.在汇编中同样有寄存器的概念. 寄存器是CPU的⼀个组成部分,⾥⾯放着指令⼂数据⼂和地址等相相关资源给CPU使⽤.⽽他们的速度是很快的. 在windows x86汇编下. 速度分别就是eax > ecx > ebx > edx ... 等. 寄存器速度⽐内存块. ⼜分为通⽤寄存器.以及专⽤寄存器.通⽤寄存器通⽤寄存器⼀般看名字就知道是通⽤的.它的功能就是完成通⽤的就算功能,谁都可以使⽤.专⽤寄存器专⽤寄存器⼀般特征有特别⽤处的寄存器. 如: 记录状态的状态寄存器记录下⼀条执⾏指令的寄存器. 栈寄存器等. 是不可以随便修改的.Arm寄存器运⾏模式寄存器运⾏模式在学习Arm汇编的时候.⾸先说⼀下Arm寄存器的运⾏模式,为什么要说⼀下运⾏模式. 原因在于Arm寄存器在各个模式下有单独的不同的名字以及含义.这个需要了解.⽤户模式(USR)Arm处理器正常的程序执⾏状态,在windows中我们就理解为是应⽤程序.是ring3程序快速中断模式(FIQ)⾼速数据传输或者通道处理外部中断模式(IRQ)通⽤的中断处理,⼀般就是系统发⽣中断的时候,Arm所运⾏的环境.管理模式(SVC)操作系统使⽤的保护模式数据访问终⽌模式(ABT)当数据或者指令预取终⽌的时候进⼊该模式,可⽤于虚拟存储以及存储保护.系统模式(SYS)运⾏具有特权的操作系统任务相当于内核模式. x86下的ring0未定义指令终⽌模式(UND)当未定义的指令执⾏的时候进⼊该模式以上数据模式暂时只需要了解USR即可.中寄存器介绍在Arm汇编中.有 37个寄存器其中 31个通⽤的. 6个状态寄存器然后在31 个通⽤寄存器中⼜分为未分组寄存器和分组寄存器未分组寄存器见名之意未分组的意思在各个运⾏模式下都是可以使⽤的.通⽤的寄存器.他们分别是 R0~R7分组寄存器所谓分组寄存器,指的就是在不同的模式下有不同的寄存器例如sp_und ⽽在abort(ABT) 模式下就叫做 sp_abt,反正就是进⼊不同的模式下会⾃动进⾏切换.⽽R8-R12 寄存器很特殊,只有在快速模式下(FIQ)名字才不⼀样R13寄存器R13寄存器⼀般称为栈指针,在⽤户模式与系统模式下⼀般就代表SP栈顶指针的意思⽽在其它模式下则叫做sp_x 这⾥的后缀 X 特指某⼀种模式下的后缀名. 如在UND模式下. 那么就叫做sp_und在FIQ模式下就叫做 sp_FIQR14寄存器R14寄存器也叫作LR寄存器(链接寄存器) 通常作⽤就是保存⼦程序或者中断的返回的地址.除了 USR(⽤户模式) 和 SYS(系统模式) 其它模式都叫做LR_X (x还是特指的意思)R15寄存器(PC)R15寄存器也叫作PC寄存器总是执向正在取值的指令. 学过x86汇编的应该知道.这个寄存器就类似于x86平台下的EIP寄存器CPSR(状态寄存器)当前程序状态的CPSR寄存器. 类似于x86下的EFLAGS寄存器2.3各个模式下的⼀览图下列表格就代表各个平台下的寄存器名称.可做参考.系统和⽤户模式管理模式终⽌模式中断模式未定义模式快速中断模式R0R0R0R0R0R0R1R1R1R1R1R1R2R2R2R2R2R2R3R3R3R3R3R3R4R4R4R4R4R4R4R4R4R4R4R4系统和⽤户模式管理模式终⽌模式中断模式未定义模式快速中断模式R5R5R5R5R5R5R6R6R6R6R6R6R7R7R7R7R7R7R8R8R8R8R8R8_FIQR9R9R9R9R9R9_FIQR10R10R10R10R10R10_FIQR11R11R11R11R11R11_FIQR12R12R12R12R12R12_FIQR13_SP R13_SVC R13_ABT R13_IRQ R13_UND R13_FIQR14_LR R14_SVC R14_ABT R14_IRQ R14_UND R14_FIQR15(PC)R15(PC)R15(PC)R15(PC)R15(PC)R15(PC)CPSR CPSR CPSR CPSR CPSR CPSRSPSR_SVC SPSR_ABT SPSR_IRQ SPSR_UND SPSR_FIQ2.54状态寄存器状态寄存器,⼀般就是保存程序执⾏过程中的⼀些状态. ⽐如计算是否进位. 是否溢出.等.状态寄存器如下表⽰|N|Z|C|V|.......|I|F|T|MODE|状态寄存器只⽤到了 0-4位(MODE0 4-8位(IFT) 以及28-31位(NZCV n是第31位)0-4位称为ModeBits 是⽤来定位我们的CPU所运⾏的模式4 - 8 表⽰打断标志位(Interrupt Disable bits) 表⽰是否关中断作⽤如下Interrupt Disable bits作⽤I7位: 如果为1则表⽰关闭IRQF6位: 如果F = 1则表⽰关闭FIQ其中⽐较特殊的就是第五位 T如果T = 1 则表⽰我们的程序运⾏在 Arm状态如果T = 0 则表⽰我们的程序运⾏在 thumb状态下⾯会说明什么是Arm状态,什么是Thumb状态其中第28-31位表⽰条件代码状态标志位作⽤如下Condition Code Flags(条件代码标志)位数以及作⽤(31-28位)N (Negative result from ALU flag)31位: 表⽰运算结果是否为负.为负数则是1 否则就是0Z (Zero result from ALU flag)30位: 表⽰运算结果是否为0.如果为0就是1 否则就是0C (ALU operation Carried Out)29位: 表⽰进位标志加减运算有没有进位有就是1否则就是0V (ALu operation oVerflowed)28位: 表⽰溢出位. 计算结果有没有溢出,溢出了就是1否则就是0运⾏状态 Arm&Thumb状态在Arm汇编中,他有七种运⾏模式两种运⾏状态两种运⾏状态分别是 ARM 以及 Thumb状态Thumb状态这个状态是16位指令也就是2个字节 ArmV4版本后,假如的⼀种16位指令模式. 可以看做是ARM指令压缩形式的⼦集,具有16位的代码密度(也就是2个字节指令长度),但是只能是⽀持通⽤功能,必要的时候仍然需要ARM 指令.⽽Thumb-2 技术则扩充了受限的16位thumb 指令集. 以及额外的32位指令,使指令集的使⽤更加⼴泛.下⾯是两种状态下寄存器的对应表Thumb状态Arm状态R0-R7(通⽤寄存器)与ARM相等R0-R7CPSR (同上)CPSRFP(栈底指针)R11(栈底指针)IP R12SP(栈顶)R13LR(保存返回地址指令)R14PC(当前指令)R15。
ARM处理器寄存器

ARM处理器寄存器1.1.1ARM 处理器不同模式下寄存器CPU 的模式不同,在其对应模式下可以使用的寄存器也不相同,如表3-2 所示:表3-2 ARM 处理器模式下寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理终止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10( SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svc R13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14 _fiqR15(PC)R15 状态寄存器CPSRCPSRSPSR 无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq 其中R0~R7 在所有模式下都可以使用的共有寄存器,R8~R12 是快速中断模式下私有的寄存器,其它模式下不能使用,之所以叫其快速中断,是因为快速中断模式下,这几个私有寄存器里数据在模式切换时可以不用入栈保存。
除了用户模式和系统模式共用一组R13,R14,其余每种模式都私有自己的R13,R14,因为在每种模式下都有自己的栈空间用于执行程序,在执行程序过程中还要保存返回地址,这样可以保证在进入不同模式时,当前模式下栈空间不被破坏。
比如:网卡因为数据到达,产生了中断进入中断模式,在中断模式下有自己的中断处理例程(ISR),ISR在执行时要用到栈空间,因此要使用R13,R14。
中断处理完成后,返回用户模式下,要继续执行被网卡中断信号中断的执行程序。
用户模式和系统模式为什么要共用一组R13,R14 呢?这是因为,在特权模式下可以自由切换工作模式,但是如果切换到用户模式下,就不能再切换到特权模式了,这是CPU 为操作系统提供的保护机制,但是有的时候就需要切换到用户模式下去使用其R13,R14 寄存器,比如当操作系统的进程进行上下文切换时,如果用户模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM 处理器有二十七个寄存器,其中一些是在一定条件下使用的,所以一次只能使用十六
个。
R0~R7:是通用寄存器并可以用做任何目的。
R8~R12:是通用寄存器,但是在切换到FIQ模式的时候,使用它们的影子(shadow)寄存器。
R13:被称为栈指针寄存器,常用来保存栈指针。
R14:链接寄存器,常用来保存函数返回地址
R15:是程序指针PC
CPSR:(Current Program Status Register)当前程序状态寄存器,CPSR 寄存期保存当前程序运行的状态。
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
ARM寻址方式
1.立即数寻址
ARM 指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。
这个操作数被称为立即数。
ADD R0,R0,#1 ;R0←R0 + 1
ADD R0,R0,#0x3A ;R0←R0 + 0x3A
在以上 2 条指令中,第2个源操作数即为立即数,实际使用时以“#”符
号为前缀。
2.寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采
用的一种方式,也是一种执行效率较高的寻址方式。
如以下的指令。
ADD R0,R1,R2 ;R0←R1 + R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
3.寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器
中。
例如以下指令。
ADD R0,R1,[R2] ;R0←R1 + [R2]
LDR R0,[R1] ;R0←[R1]
在第1 条指令中,以寄存器R2 的内容作为操作数的地址,然后与R1相加,其结果存入
寄存器R0中。
第2条指令将以 R1 的值为地址的存储器中的内容送到寄存器R0中。
4.基址变址寻址
基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给
出的地址偏移量相加,从而得到一个操作数的有效地址。
如下面的几条指令所示。
LDR R0,[R1,#0x0A] ;R0←[R1 + 0x0A]
LDR R0,[R1,#0x0A]!;R0←[R1 + 0x0A]、R1←R1 + 0x0A
在第1条指令中,将寄存器R1 的内容加上0x3A 形成操作数的有效地址,将该地址处的
操作数送到寄存器R0中。
在第2条指令中,将寄存器R1的内容加上0x0A形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增0x0A个字节。
5.多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
这种寻址方式可以用
一条指令完成传送最多 16 个通用寄存器的值。
比如下面的指令。
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0 + 4]
;R3←[R0 + 8]
;R4←[R0 + 12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可
将连续存储单元的值传送到R1~R4。
6.相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的
地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
比如下面的程序段完成子程
序的调用和返回,跳转指令BL采用了相对寻址方式。
BL NEXT ;跳转到子程序 NEXT 处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
7.堆栈寻址
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称
作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
根据堆栈的生成方式,堆栈又可以分为递增堆栈(Ascending Stack)和递减堆栈
(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低
地址生成时,称为递减堆栈。
这样就有4种类型的堆栈工作方式,ARM 微处理器支持以下4
种类型的堆栈工作方式。
(1)满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2)满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(3)空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址
生成。
(4)空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址
生成。
分支跳转指令
B{条件} <地址>
B、BL是一个分支跳转指令,它是在R15寄存器的基础上跳转一个偏移地址,跳转范围是由汇编器计算得到,计算方法:它的值由汇编器来计算,它是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移为26位(+/-32M)。