ARM寄存器详解

合集下载

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关键几个寄存器

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寄存器

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的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寄存器超全详解

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寄存器可以分为通用寄存器、程序状态寄存器、系统控制寄存器和浮点寄存器等多个类别。

一、通用寄存器通用寄存器是最常用的寄存器类型,用于存储临时数据、变量和计算结果等。

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学习第⼀讲 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处理器寄存器

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 寄存器,比如当操作系统的进程进行上下文切换时,如果用户模式。

ARM 内核寄存器 和 基本汇编语言讲解

ARM 内核寄存器 和 基本汇编语言讲解

ARM 内核寄存器和基本汇编语言讲解•一、ARM内核寄存器▪ 1.1 M3/M4内核寄存器▪ 1.2 A7内核寄存器▪ 1.3 ARM中的PC指针的值•二、ARM汇编语言▪ 2.1 ARM汇编基础▪ 2.2 汇编伪指令▪ 2.3 ARM汇编指令集•三、代码反汇编简析▪ 3.1 不同编译器的反汇编▪ 3.2 C 和汇编比较分析开头直接来看几个简单的汇编指令:MOV R0,R1MOV PC,R14上面的指令中使用了汇编MOV指令,但是其中的R0,R1,R14,PC分别是什么?哪来的?怎么用?要讲ARM 汇编语言,必须得先了解ARM的内核寄存器,内核处理所有的指令计算,都需要用到内核寄存器,所以ARM汇编里面指令大都是基于寄存器的操作。

文章前推荐韦东山老师的单片机核心视频,视频可以在韦东山老师官网里面找到:百问网ARM版本简单介绍:对于M3/M4而言:R13,栈指针(Stack Pointer)•R13寄存器中存放的是栈顶指针,M3/M4 的栈是向下生长的,入栈的时候地址是往下减少的。

•裸机程序不会用到PSP,只用到MSP,需要运行RTOS的时候才会用到PSP。

•堆栈主要是通过POP,PUSH指令来进行操作。

在执行PUSH 和 POP 操作时, SP 的地址寄存器,会自动调整。

R14 ,连接寄存器(Link Register)•LR 用于在调用子程序时存储返回地址。

例如,在使用BL(分支并连接,Branch and Link)指令时,就自动填充 LR 的值(执行函数调用的下一指令),进而在函数退出时,正确返回并执行下一指令。

如果函数中又调用了其他函数,那么LR将会被覆盖,所以需要先将LR寄存器入栈。

•保存子程序返回地址。

使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回•当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断R15,程序计数器(Program Count)•在Cortex-M3中指令是3级流水线,出于对Thumb代码的兼容的考虑,读取pc时,会返回当前指令地址+4的值。

ARM寄存器的总结

ARM寄存器的总结
ARM寄存器的总结
ARM处理器共有37个寄存器:
1) 31个通用寄存器,包括程序计数器(PC)。这些寄存器都是32位的;
2)6个状态寄存器。这些寄存器也是32位的,但是只使用了其中的12位。
ARM通用寄存器
通用寄存器(R0-R15)可分为三类:不分组寄存器R0~R7;分组寄存器R8~R14;程序计数器PC。
1)不分组寄存器R0~R7
不分组寄存器R0~R7在所有处理器模式下,它们每一个都访问一样的32位寄存器。它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2)分组寄存器R8~R14
分组寄存器R8~R14对应的物理寄存器取决于当前的处理器模式。若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12各有两组物理寄存器:一组为FIQ模式,另一组为除了FIQ以外的所有模式。寄存器R8~R12没有任何指定的特殊用途,只是在作快速中断处理时使用。寄存器R13,R14各对应6个分组的物理寄存器,1个用于用户模式和系统模式,其它5个分别用于5种异常模式。寄存器R13通常用做堆栈指针,称为SP;寄存器R14用作子程序链接寄存器,也称为LR。
中断禁止位:I置1则禁止IRQ中断;F置1则禁止FIQ中断。
T位:T=0指示ARM执行;T=1指示Thumb执行。在这些体系结构系统中,可自由地使用能在ARM和Thumb状态之间切换的指令。
模式位:M0,M1,M2,M3和M4(M[4:0])是模式位,这些位决定处理器的工作模式,如表所示。
3)其他位
程序状态寄存器的其他位保留,用作以后的扩展。
ARM核工作在用户模式,R0~R15可用。
存储器格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节零到字节三放置第一个字(WORD),字节四到字节七存储第二个字,以此类推。

ARM寄存器详解

ARM寄存器详解

ARM寄存器详解 ARM A系列寄存器的情况 这是寄存器的总表,下⾯是CPU的各个模式,上⾯的纵轴就是寄存器组。

CPU在运⾏的时候为什么会有寄存器? 想象CPU是⼀个圈⼀直在运转,然后寄存器⾥⾯有⼤量的指令,这些指令不知道从哪⾥来的,但是⼀般情况下我们的程序在计算我们的程序,我们的程序⼀般是放在内存⾥⾯的,它从内存⾥⾯把这些程序读进来之后,在运⾏,但是如果现在这个程序在运⾏时异常,那么就要进⾏CPU状态的切换,除了状态切换之外,当前的⼀些数据结果需要进⾏⼀个保存,但是如果要把这个结果存到内存去,内存并不稳定并且很慢,所以就要想办法能不能找到⼀个临时空间保存⼀下,这就是为什么会诞⽣寄存器。

设置寄存器的原因就是为了更好的去控制和达到效率,ARM体系为了很好的去控制CPU,设定了哪些寄存器? User纵轴上的⼗三个寄存器称为通⽤寄存器,R13是⼀个⽐较特殊的寄存器,也叫做SP,就是占指针的寄存器,就是指向某⼀些占空间,R14是LR,就是连接寄存器,它肯定是去连接某⼀个地⽅。

R15是PC,这是程序计数器,这是CPU在每⼀个空间切换的时候的计数器,最下⾯那个也就是APSR或者CPSR,PSR就是程序状态寄存器,A代表应⽤程序状态寄存器,C代表当前程序状态寄存器。

在往下就类似于R17,只不过它叫做SPSR,S就是以保存程序代表寄存器或者我们也可以称为存储状态寄存器,通过这些我们⼤概把寄存器了解了。

那么这上⾯分为通⽤的,那么下⾯就是特殊寄存器,从横向来看,我们可以看到在USR模式下⾯,这样寄存器挺全的,但是USR下⾯没有SPSR,就是没有存储状态的寄存器,然后FIQ快速中断模式下⾯⾯是共享R0到R7,意思就是这些模式下的R0到R7它们与USR模式下的R0到R7是共享的,这样如果存储⼀些数据在R0到R9下⾯,突然发⽣异常,切换到另⼀个模式,那么我们就应该要想办法把这个存取⼀下,因为另⼀个模式可能也要往这⾥⾯写东西,那么写之前就应该把USR模式下的先保留⼀下,到时候退出解决后在还原回来,所以我们要⼀个R0到R7这块寄存器是共享的,同样FIQ后⾯⼏个模式的R8到R12也是和USR共享的,只有FIQ是⾃⼰独有的,同样的我们在看到PC计数器也是共享的,还有SPSR也是共享的,但是SPSR每个状态都有⾃⼰独有的。

ARM存储器寄存器体系结构介绍

ARM存储器寄存器体系结构介绍

一、ARM7的体系结构(一)每种单片机的区别在于内核前段时间学习的以51为核的单片机,现在正在学习ARM9,实际上是以ARM处理器为核的单片机,51为核的单片机就是把中央处理器,存储器,输入输出设备集成在一个芯片内的芯片,ARM处理器为核的单片机就是把ARM处理器,存储器,输入输出设备集成在一个芯片内的芯片。

对于ARM处理器来说,对外围的操作都是对外围设备的寄存器的操作,也就是对地址的操作。

(外围设备如串口,定时器等等,他们也有相应的寄存器)。

但是ARM处理器里面有37个32位寄存器,31个通用寄存器,6个状态寄存器,这些寄存器都是不能同时被访问的,具体那些寄存器是可编程访问的,取决于微处理器的工作状态和运行模式。

但在任何时候,通用寄存器R0--R14、程序计数器PC、一个或两个状态寄存器都是可以访问的。

ARM处理器都是一样的,只是生产厂家不同而有了像S3C2440这样的单片机等等,实际上这些都是在以ARM处理器外增加了许多外围而形成了单片机,然后在加些外围成了开发板。

(二)ARM处理器的存储结构1.有两种存储方式,大端和小端2.在使用一个单片机之前一定要搞清楚此单片机的存储格式3.每个存储单元为一个字节,且都有一个地址,对于32位机来说,数据或代码有32位的,那么一个数据就需要四个单元来存,就涉及到顺序问题,也就是大端方式存和小端方式。

4.对字,半字,字节操作(如图)5.与51核单片机不同,ARM处理器的指令代码字节数是相同的,在Tumb指令集中,所有的指令代码都是16位2字节代码,在ARM指令集中,所有的指令代码都是32位4字节代码。

6.ARM处理器有多种模式,而51只有一种模式,可以访问全部资源。

(三)ARM处理器内部寄存器1.为了使用方便,常常赋予寄存器专用的助记符,也就是寄存器的名称,如下图:2.关于寄存器R13、R14、R15R13作为堆栈指针,和51系列单片机中的SP一样。

如果程序发生异常中断时,中断服务程序要把保护的寄存器值堆栈到R13指向的堆栈入口,在退出中断服务时,再把堆栈中的数据弹出来。

ARM寄存器简介

ARM寄存器简介

ARM寄存器简介ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。

(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。

(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是只使用了其中的12位。

1.通用寄存器在ARM处理器的7种模式下都有一组对应的寄存器组。

在任意时刻,可见的寄存器组包括15个通用寄存器R0~R14、一个或两个状态寄存器和PC。

在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。

详细如表1-3所示。

表1-3 ARM物理寄存器用户模式系统模式特权模式中止模式未定义指令模外部中断模快速中断模R0 R0 R0 R0 R0 R0 R0R1 R1 R1 R1 R1 R1 R1R2 R2 R2 R2 R2 R2 R2R3 R3 R3 R3 R3 R3 R3R4 R4 R4 R4 R4 R4 R4R5 R5 R5 R5 R5 R5 R5R6 R6 R6 R6 R6 R6 R6R7 R7 R7 R7 R7 R7 R7R8 R8 R8 R8 R8 R8 R8_fiq R9 R9 R9 R9 R9 R9 R9_fiq R10 R10 R10 R10 R10 R10 R10_fiq R11 R11 R11 R11 R11 R11 R11_fiq R12 R12 R12 R12 R12 R12 R12_fiq R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq PC PC PC PC PC PC PCCPSR CPSR CPSR CPSR CPSR CPSR CPSRSPSR_svc S PSR_abt SPSR_und SPSR_irq SPSR_fiq 通用寄存器通常又可以分为下面3类。

ARM寄存器解释

ARM寄存器解释

一:模式
1.用户模式(USR):ARM处理器正常的程序执行状态。

2.快速中断模式(FIQ):用于高速数据传输或通断管理。

3.外部中断模式(IRQ):用于通用的中断处理。

4.管理模式(SVC):操作系统使用的保护。

5.数据访问种植模式(ABT)。

6.系统模式(SYS):运行具有特权的操作系统任务。

7.未定义指令终止模式(UND):当未定义指令执行时进入该模式可用于支持硬件协
处理器的软件仿真。

二:寄存器
1.R0——》R7:通用寄存器。

2.R13:一般为栈指针。

3.R14:返回地址。

4.R15:程序计数器。

(指向当前指令的下的第2条指令的地址。

例:当前指令正在执
行,第1条指令正在译码,第2条指令正在取址,总共是三条指令(当前正在执行的指令+第1条指令+第2条指令=3条指令)R15指向第2条指令)
5.CPSR:程序状态寄存器。

(在用户级编程时用于存储条件码)。

6.SPSR:程序状态保存寄存器。

(SPSR用于保存CPSR的状态,以便异常返回后恢复异
常发生时的工作状态。

注意:用户模式和系统模式没有SPSR因为用户模式不属于异常中断模式)。

ARM中文指令--寄存器和处理器模式

ARM中文指令--寄存器和处理器模式

ARM中文指令--寄存器和处理器模式值得拥有的资料是来自平时学习积累总结的有问题的地方肯定有的还请大家批评指正!ARM中文指令--寄存器和处理器模式ARM 处理器有二十七个寄存器其中一些是在一定条件下使用的所以一次只能使用十六个...寄存器 0 到寄存器 7 是通用寄存器并可以用做任何目的不象 80x86 处理器那样要求特定寄存器被用做栈访问或者象 6502 那样把数学计算的结果放置到一个累加器中ARM 处理器在寄存器使用上是高度灵活的寄存器 8 到 12 是通用寄存器但是在切换到 FIQ 模式的时候使用它们的影子(shadow)寄存器寄存器 13 典型的用做 OS 栈指针但可被用做一个通用寄存器这是一个操作系统问题不是一个处理器问题所以如果你不使用栈只要你以后恢复它你可以在你的代码中自由的占用(corrupt)它每个处理器模式都有这个寄存器的影子寄存器寄存器 14 专职持有返回点的地址以便于写子例程当你执行带连接的分支的时候把返回地址存储到 R14 中同样在程序第一次运行的时候把退出地址保存在 R14 中R14 的所有实例必须被保存到其他寄存器中(不是实际上有效)或一个栈中这个寄存器在各个处理器模式下都有影子寄存器一旦已经保存了连接地址这个寄存器就可以用做通用寄存器了寄存器 15 是程序计数器它除了持有指示程序当前使用的地址的二十六位数之外还持有处理器的状态为更清晰一些... 提供下列图表:User 模式 SVC 模式 IRQ 模式 FIQ 模式 APCSR0 ------- R0 ------- R0 ------- R0 a1R1 ------- R1 ------- R1 ------- R1 a2R2 ------- R2 ------- R2 ------- R2 a3R3 ------- R3 ------- R3 ------- R3 a4R4 ------- R4 ------- R4 ------- R4 v1R5 ------- R5 ------- R5 ------- R5 v2R6 ------- R6 ------- R6 ------- R6 v3R7 ------- R7 ------- R7 ------- R7 v4R8 ------- R8 ------- R8 R8_fiq v5R9 ------- R9 ------- R9 R9_fiq v6R10 ------ R10 ------ R10 R10_fiq slR11 ------ R11 ------ R11 R11_fiq fpR12 ------ R12 ------ R12 R12_fiq ipR13 R13_svc R13_irq R13_fiq spR14 R14_svc R14_irq R14_fiq lr------------- R15 / PC ------------- pc最右侧的列是 APCS 代码使用的名字关于 APCS 的详情参见这里程序计数器构造如下:位 31 30 29 28 27 26 25------------2 1 0N Z C V I F 程序计数器 S1 S0对 R15 的详细解释请参见 psr.html下面是你想知道的"模式"比如上面提及的"FIQ"模式用户模式运行应用程序的普通模式限制你的内存访问并且你不能直接读取硬件设备超级用户模式(SVC 模式)主要用于 SWI(软件中断)和 OS(操作系统)这个模式有额外的特权允许你进一步控制计算机例如你必须进入超级用户模式来读取一个插件(podule)这不能在用户模式下完成中断模式(IRQ 模式)用来处理发起中断的外设这个模式也是有特权的导致IRQ 的设备有键盘、VSync (在发生屏幕刷新的时候)、IOC 定时器、串行口、硬盘、软盘、等等...快速中断模式(FIQ 模式)用来处理发起快速中断的外设这个模式是有特权的导致 FIQ 的设备有处理数据的软盘串行端口(比如在 82C71x 机器上的 A5000) 和 EconetIRQ 和 FIQ 之间的区别是对于 FIQ 你必须尽快处理你事情并离开这个模式IRQ 可以被 FIQ 所中断但 IRQ 不能中断 FIQ为了使 FIQ 更快所以有更多的影子寄存器FIQ 不能调用 SWIFIQ 还必须禁用中断如果一个 FIQ 例程必须重新启用中断则它太慢了并应该是 IRQ 而不是 FIQPhew!关于如果变更处理器的模式的详情请参照 psr.htmlARM中文指令--32 位操作这里的许多信息取自 ARM 汇编器手册我现在没有 32 位处理器就只能信任文档了... 这个文档中表述的 UMUL 和 UMLA 只能在32bit 模式下进行是错误的如果你的处理器(比如: StrongARM)可以这么做则它可以在 32bit 或 26bit 下工作...ARM2 和 ARM3 有一个 32 位数据总线和一个 26 位地址总线在以后版本的 ARM 上数据总线和地址总二者都是完全的 32 位宽这解释了为什么一个"32 位处理器"被称为 26 位数据宽度和指令/字大小是 32 位并总是这样但地址总线只是 24 位因为 PC 总是字对齐的一个地址中的低两位总是零所以在 ARM2/ARM3 处理器上这些位持有处理器模式设置尽管实际上只使用了 24 位PC 的有效宽度仍是 26 位在老机器上这没有问题4Mb 内存是基准的一些人升级到 8Mb、和 16Mb 是理论上的限制(Some people upgraded to 8Mb, and 16Mb was the theoretical limit.) 但是 RiscPC 使用一个 26 位程序计数器是不可能的因为 RiscPC 允许安装 258Mb 内存而 26 位只允许你寻址到 %11111111111111111111111100 (或67108860 字节或 64Mb)这附带的解释了对应用任务的28Mb 大小限制;就是希望系统与老的 RISC OS API 相容尽管这个汇编器站点的某些部分覆盖了32 位模式(比如运行在SVC32 下的一个简要的例子!)但多数部分是关于 26 位模式操作的这是为了与 RISC OS 的当前可获得的版本相兼容(就是 RISC OS 2 到 RISC OS 4);我注意到部分例子不适用于 32 位RiscPC、Mico、RiscStation、A7000 等都有能力运行完全的 32 位操作系统;实际上 ARMLinux 就是这样的一个操作系统RISC OS 不是因为 RISC OS 需要至少一个时期保持与现存版本的兼容这是个古老的两分问题(dichotomy)有一个崭新的完全 32 位版本的 RISC OS 版本是美妙的但当你发现许多你的现存软件不能继续运行(so much as load)就不那么美妙了!RISC OS 不是完全的 26 位一些处理程序(handler)需要工作在32 位模式下;限制它的是金钱(就是说谁为完全转换 RISC OS 付钱;谁为用来重建它们的代码的开发工具付钱(PD 在 RISC OS 上是强壮的))和必要性(就是说很多人使用 Impression 而 CC 不再与我们同在;Impression 好象不能在更新的 RISC OS 上工作所以如果人们需要的软件将不能工作那么他们不会认为有升级的必要)为什么这如此重要? 新的 ARM 处理器将不支持 26 位操作尽管做了一些融合(ARM6、ARM7、StrongARM)但气数就要尽了你可以增加一个 26/32 位系统的复杂性或者只用 32 位而得到更简单、更小的处理器我们要么随波逐流要么被甩下... 所以我们别无选择32 位体系ARM 体系在 ARM6 系列中进行了重大变更下面我将描述 26 位和 32 位操作行为的不同之处在 ARM 6 中程序计数器被扩展到完整的 32 位结果是:PSR 从 PC 中分离到自己的寄存器 CPSR(当前的程序状态寄存器)中在改变处理器模式的时候不再与PC 一起保存PSR;现在是每个有特权的模式都有一个额外的寄存器- SPSR (保存的程序状态寄存器) - 用来持有前面模式的PSR增加了使用这些新寄存器的指令除了允许 PC 使用完全的 32 位之外还有进一步的变更就是给 PSR 增加了额外的有特权的模式这些模式用于处理未定义指令和异常终止例外:未定义指令、异常终止、和超级用户不再共享同一个模式去掉了在早期 ARM 上存在的对超级用户的那些限制在ARM6 系列(和以后的其他兼容芯片)中通过设置片上某个控制寄存器来确定这些特征的可获得性可以选择三个处理器配置中的一个:26 位程序和数据空间这个配置强制 ARM 在 26 位地址空间中进行操作在这个配置中只能获得四个26 位模式(参照处理器模式描述);不可能选择任何 32 位模式在所有当前的 ARM6 和 7 系列上复位(reset)时被设置为这个模式26 位程序空间和 32 位数据空间除了禁止地址例外来允许数据传送操作访问完整的 32 位地址空间之外与 26 位程序和地址空间配置相同32 位程序和数据空间这个配置把地址空间扩展成 32 位并介入了对处理器模型的重大变更在这个配置中你可以选择任何 26 位和 32 位处理器模式(参见下面的处理器模式)在配置成 32 位程序和数据空间的时候ARM6 和 ARM7 系列支持十个有所重叠的处理器操作模式:用户模式: 正常的程序执行状态;或 User26 模式: 一个 26 位版本FIQ模式: 设计来支持一个数据传送或通道处理;或 FIQ26 模式: 一个 26 位版本IRQ 模式: 用于通用中断处理;或 IRQ26 模式: 一个 26 位版本SVC 模式: 用于操作系统的保护模式或 SVC26模式: 一个 26 位模式异常终止模式(ABT 模式): 在一个数据或指令预取异常终止(abort)的时候进入的模式未定义模式(UND 模式): 在执行了一个未定义的指令的时候进入的模式当在一个 26 位处理器模式中的时候编程模型倒退成早期的 26 位 ARM 处理器除了下列变动之外它的行为与 ARM2aS 宏单元(macrocell)相同:只在 ARM 被配置为 26 位程序和数据空间的时候它才生成地址例外在其他配置下OS 仍然可以通过使用外部逻辑模拟地址例外的行为比如用一个内存管理单元在超出 64Mbyte 范围的时候生成一个异常终止并把这个异常终止转换成给这个应用程序的一个'地址例外陷入'保持在通用寄存器和程序状态寄存器之间传送数据的新指令可操作在调用了包含 26 位的 ARM 二进制代码的之后操作系统可以使用这些新指令返回到一个 32 位模式当在一个 32 位程序和数据空间配置下的时候所有例外(包括未定义指令和软件中断)把处理器返回到一个32 位模式所以必须修改操作系统来处理它们如果处理器尝试写到在 &0 和 &1F 之间包括二者(就是例外向量)的一个位置则硬件将禁止写操作并生成一个数据异常终止这允许操作系统来截获对例外向量的变动并把向量重定向到一些伪装(veneer)代码上在调用 26 位例外处理程序之前这些伪装代码应该把处理器置于一个 26 位模式中在所有其他方面当在一个 26 位模式下进行操作的时候ARM 表现的如同一个 26 位 ARMCPSR 的相关的位将被组建(incorporated)回到 R15 中来形成 I 和 F 位在位 27 和 26 的 PC/PSR指令集表现的如同增加了 MRS 和 MSR 指令的 ARM2aS 宏单元在 ARM 6(和以后)的 32 位模式下可获得的寄存器有:User26 SVC26 IRQ26 FIQ26 User SVC IRQ ABT UND FIQR0 ----- R0 ----- R0 ----- R0 -- -- R0 ----- R0 ----- R0 ----- R0 ----- R0 ----- R1R1 ----- R1 ----- R1 ----- R1 -- -- R1 ----- R1 ----- R1 ----- R1 ----- R1 ----- R2R2 ----- R2 ----- R2 ----- R2 -- -- R2 ----- R2 ----- R2 ----- R2 ----- R2 ----- R2R3 ----- R3 ----- R3 ----- R3 -- -- R3 ----- R3 ----- R3 ----- R3 ----- R3 ----- R3R4 ----- R4 ----- R4 ----- R4 -- -- R4 ----- R4 ----- R4 ----- R4 ----- R4 ----- R4R5 ----- R5 ----- R5 ----- R5 -- -- R5 ----- R5 ----- R5 ----- R5 ----- R5 ----- R5R6 ----- R6 ----- R6 ----- R6 -- -- R6 ----- R6 ----- R6 ----- R6 ----- R6 ----- R6R7 ----- R7 ----- R7 ----- R7 -- -- R7 ----- R7 ----- R7 ----- R7 ----- R7 ----- R7R8 ----- R8 ----- R8 R8_fiq R8----- R8 ----- R8 ----- R8 ----- R8 R8_fiqR9 ----- R9 ----- R9 R9_fiq R9 ----- R9 ----- R9 ----- R9 ----- R9 R9_fiqR10 ---- R10 ---- R10 R10_fiq R10 ---- R10 ---- R10 ---- R10 ---- R10 R10_fiqR11 ---- R11 ---- R11 R11_fiq R11 ---- R11 ---- R11 ---- R11 ---- R11 R11_fiqR12 ---- R12 ---- R12 R12_fiq R12 ---- R12 ---- R12 ---- R12---- R12 R12_fiqR13 R13_svc R13_irq R13_fiq R13 R13_svc R13_irq R13_abt R13_und R13_fiqR14 R14_svc R14_irq R14_fiq R14 R14_svc R14_irq R14_abt R14_und R14_fiq--------- R15 (PC / PSR) --------- --------------------- R15 (PC) -------------------------------------------- CPSR -----------------------SPSR_svc SPSR_irq SPSR_abt SPSR_und SPSR_fiq简要的说32 位的与 26 位的不同是:PC 是完全的 32 位宽并只用做程序计数器PSR 包含在它自己的寄存器 CPSR 中每个有特权的模式都有一个专有的 SPSR 寄存器用来保存 CPSR这里有两个新的特权模式每个有特权的模式都有 R13 和 R14 的专有复件CPSR 和 SPSR 寄存器CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如下:31 30 29 28 --- 7 6 - 4 3 2 1 0N Z C V I F M4 M3 M2 M1 M00 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 模式关于 N、Z、C、V 标志和 I、F 中断标志请参见(26 位) PSR这在实践中意味着什么?多数 ARM 代码将正确的工作唯一不能工作的是通过摆弄 R15 来设置处理器状态的那些操作不幸的是好象没有简便的方法修理这个问题我检查了一个有潜在问题的9K 程序(一个MODE 7 teletext frame viewer用 C 写的)基本上查找:用 R15 作为目的寄存器的 MOVS 指令以'^'作为后缀并装载 R15 的 LDMFD 指令大约有 64 个指令被归入此类好象有没有什么方式来自动进行转换基本上...系统如何知道哪个是数据哪个是代码实际上一个灵巧的基于规则的程序能够可以做非常准确的猜测但"非常准确的猜测"就足够了吗?没有简单的指令替代一个自动系统可以修补需要的指令并调整(jiggle)周围的代码但这将导致不希望的副作用比如一个 ADR 宏指令(directive)不在范围内(in range)需要难以置信的技巧(It is incredibly hacky)当然最好重新编译或修改源代码这是很不容易的这样小的变更竟有如此严重(far-reaching)的后果ARM中文指令--程序状态寄存器程序状态寄存器MRSMSR直接查看 R15/PSR 在 32-bit 模式下的详情寄存器 15 (26-bit 模式):R15 构造如下:Bit 31 30 29 28 27 26 25------------2 1 0N Z C V I F 程序计数器 S1 S0标志的意义:N Negative 如果结果是负数则置位Z Zero 如果结果是零则置位C Carry 如果发生进位则置位O Overflow 如果发生溢出则置位I IRQ 中断禁用F FIQ 快速中断禁用S1 和 S0 是处理器模式标志:S1 S0 模式0 0 USR - 用户模式0 1 FIQ - 快速中断模式1 0 IRQ - 中断模式1 1 SVC - 超级用户模式在 R15 作为一个指令的第一个操作数的时候只有程序计数器部分是可以获得的所以下列指令把 PC 复制到一个寄存器中并向这个目标寄存器加上 256: ADD R0, R15, #256(对于 BASIC 汇编器 R15 和 PC 的意思是相同的)在 R15 作为第二个操作数的时候所有 32 位都是可以获得的: 程序计数器、标志、和状态下列代码段将标识当前的处理器模式:MOV R0, #3 ; 装载一个位掩码(%11)到 R0 中AND R0, R0, PC ; 把 R15 与 R0 做逻辑与并把结果放入 R0来得到模式状态CMP R0, #3 ; 把模式与 '3' 相比较(SVC)BEQ svc ; 如果等于 SVC 模式分支到 'svc'CMP R0, #2 ; 把模式与 '2' 相比较 (IRQ)BEQ irq ; 如果等于 IRQ 模式分支到 'irq'CMP R0, #1 ; 把模式与 '1' 相比较(FIQ)BEQ fiq ; 如果等于 FIQ 模式分支到 'fiq'CMP R0, #0 ; 把模式与 '0' 相比较(USR)BEQ usr ; 如果等于 USR 模式分支到 'usr'这个例子不遵从 32-bit 体系如何在 32-bit 环境中读当前的模式请参照下面的章节改变处理器的状态:要改变处理器模式、或者任何标志我们需要用想要的标志 EOR(异或)状态标志新状态 = 旧状态 EOR (1 << 28) 可以成为改变 oVerflow 标志的伪码但是我们不能做这个简单的 EORS 操作原因是这将导致随后的两个指令被跳过不要担心指令 TEQ 做一个假装的 EOR (结果不存储到任何地方)把它与 P 后缀组合则把结果的第 0、1、和 26 至 31 位直接写到 R15 的第 0、1、和26 至 31 位这是改变标志的一个简便的方法: TEQP R15, bit_mask如果你处在允许你设置一个标志的一个模式中则你只可以改变这个标志这个例子不遵从 32-bit 体系如何在 32-bit 环境中改变模式请参照下面的章节可以被扩充它来改变处理器模式例如要进入 SVC 模式你可以:MOV R6, PC ; 把 PC 的最初状态存储到 R6 中ORR R7, R6, #3 ; 设置 SVC 模式TEQP R7, #0 ; 把(在 R7 中的)模式标志写入 PC而返回最初的模式是:TEQP R6, #0 ; 把(在 R6 中的)最初的模式写入 PC在改变了模式之后你应该进行一个空操作来允许这个寄存器安定下来比如 MOV R0, R0 之类的东西就可以废弃使用 NV 后缀的指令32 位 PSR如同在32 位操作中描述的那样ARM 3 之后的处理器提供一个 32 bit 地址空间它们把 PSR 移出 R15 并给予 R15 完整的 32 位位域在其中存储当前位置的地址目前除了一些不太可能遇到的情况之外RISC OS 工作在 26 位模式32 位模式是重要的因为 26 位(在老的 PSR 中)把每个应用程序的可寻址内存的最大数量限制为 28Mb这就是不管你安装了多少内存你不能拖动超过28Mb 的下一个槽(drag the Next slot beyond 28Mb)的原因CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如下:31 30 29 28 --- 7 6 - 4 3 2 1 0N Z C V I F M4 M3 M2 M1 M00 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 模式典型的处理器将在 User26、FIQ26、IRQ26 和 SVC26 下操作可以进入一个 32 位模式但要格外小心RISC OS 不希望这样并且如果它发现自己在其中会非常生气!操纵 32 位 PSR 的指令你不能在32 位模式中使用MOVS PC, R14 或LDMFD R13!, {registers, PC}^也不能使用 ORRS PC, R14, #1<<28 来设置 V 标志现在需要使用 MRS 和 MSR复制一个寄存器到 PSR 中MSR CPSR, R0 ; 复制 R0 到 CPSR 中MSR SPSR, R0 ; 复制 R0 到 SPSR 中MSR CPSR_flg, R0 ; 复制 R0 的标志位到 CPSR 中MSR CPSR_flg, #1<<28 ; 复制(立即值)标志位到 CPSR 中复制 PSR 到一个寄存器中MRS R0, CPSR ; 复制 CPSR 到 R0 中MRS R0, SPSR ; 复制 SPSR 到 R0 中指令格式你有两个PSR - CPSR 是当前的程序状态寄存器(Current ProgramStatus Register)而SPSR 是保存的程序状态寄存器(Saved Program Status Register)(前面的处理器模式的 PSR)每个有特权的模式都有自己的 SPSR可获得的 PSR 有:CPSR_all - 当前的SPSR_svc - 保存的SVC(32) 模式SPSR_irq - 保存的IRQ(32) 模式SPSR_abt - 保存的ABT(32) 模式SPSR_und - 保存的UND(32) 模式SPSR_fiq - 保存的FIQ(32) 模式你不能显式的指定把 CPSR 保存到哪个 SPSR 中比如 SPSR_fiq而是必须变更到 FIQ 模式并接着保存到 SPSR换句话说你只能在你所在的模式中改变这个模式的 SPSR使用 _flg 后缀允许你改变标志位而不影响控制位在 user(32) 模式中保护 CPSR 的控制位你只能改变条件标志在其他模式中可获得整个 CPSR你不应该指定 R15 为一个源寄存器或一个目标寄存器最后在 user(32) 模式中你不能尝试访问 SPSR因为它不存在!要设置 V 标志:MSR CPSR_flg, #&10000000这将设置 V 标志但不影响控制位要改变模式:MRS R0, CPSR_all ; 复制 PSRBIC R0, R0, #&1F ; 清除模式位ORR R0, R0, #new_mode ; 把模式位设置为新模式MSR CPSR_all, R0 ; 写回 PSR变更模式现在我们要做的是进入 SVC32 模式并设置 Z 标志接着我们返回 SVC26 模式并'测试'是否设置了 Z RISC OS 不希望发现自己处在 32 位模式中所以我们要禁止所有中断并保持它们这样(keep them that way) 尽管这些代码应该执行的非常快但我们不应当冒任何风险...你可能觉得 32 位模式不是非常有用在当前版本的 RISC OS 下这是事实实际上就我而言32 位模式提供给你的只是:访问大于 28Mb 的区域在 RISC OS 上这不是真的很重要在这个系统里 web 浏览器适合于 1 M 或 2 M而重要的艺术程序为那些非常巨大的图象提供它们自己的虚拟内存系统本文档的最初版本和最初的 ARM 汇编器指南包括...StrongARM 提供了两个指令(UMUL 和 UMLA、IIRC)它们处理 64 位乘法这只能在 32 位模式下获得这是错误的在 26 位模式下可以使用扩展的乘法;MP3 解码器就使用了它!尽管 32 位模式的利益好象不是多的那么惊人新近的处理器(比如 Xscale)不再支持 26 位模式所以 RISC OS 和它的应用程序要在 32 位环境下工作则必须经过修改听起来不是很多但是如果所有补偿/改变 R15 中的 PSR 位的引用都必须被变更为对不在 R15 中的独立的 PSR 的引用这就突然变成一个非常重大的问题了还有你不能继续用一个指令来恢复 PSR 并分支回到调用者现在这需要两个独立的指令为此代码必须重写你不能简单的用另一个指令来修补...ARM中文指令--寄存器装载和存储寄存器装载和存储LDMLDRSTMSTRSWP它们可能是能获得的最有用的指令其他指令都操纵寄存器所以必须把数据从内存装载寄存器并把寄存器中的数据存储到内存中传送单一数据使用单一数据传送指令(STR 和LDR)来装载和存储单一字节或字的数据从/到内存寻址是非常灵活的首先让我们查看指令格式:LDR{条件} Rd, <地址>STR{条件} Rd, <地址>LDR{条件}B Rd, <地址>STR{条件}B Rd, <地址>指令格式这些指令装载和存储 Rd 的值从/到指定的地址如果象后面两个指令那样还指定了'B'则只装载或存储一个单一的字节;对于装载寄存器中高端的三个字节被置零(zeroed)地址可以是一个简单的值、或一个偏移量、或者是一个被移位的偏移量可以还可以把合成的有效地址写回到基址寄存器(去除了对加/减操作的需要)各种寻址方式的示例:译注:下文中的 Rbase 是表示基址寄存器Rindex 表示变址寄存器index 表示偏移量偏移量为 12 位的无符号数用移位选项表示比例因子标准寻址方式 - 用 AT&T 语法表示为 disp(base, index, scale) 用 Intel 语法表示为 [base + index*scale + disp]中的变址(连带比例因子)与偏移量不可兼得STR Rd, [Rbase] 存储 Rd 到 Rbase 所包含的有效地址STR Rd, [Rbase, Rindex] 存储 Rd 到 Rbase + Rindex 所合成的有效地址STR Rd, [Rbase, #index] 存储 Rd 到 Rbase + index 所合成的有效地址index 是一个立即值例如STR Rd, [R1, #16] 将把 Rd 存储到 R1+16STR Rd, [Rbase, Rindex]! 存储 Rd 到 Rbase + Rindex 所合成的有效地址并且把这个新地址写回到 RbaseSTR Rd, [Rbase, #index]! 存储 Rd 到 Rbase + index 所合成的有效地址并且并且把这个新地址写回到 RbaseSTR Rd, [Rbase], Rindex 存储 Rd 到 Rbase 所包含的有效地址把 Rbase + Rindex 所合成的有效地址写回 RbaseSTR Rd, [Rbase, Rindex, LSL #2]存储 Rd 到 Rbase + (Rindex * 4) 所合成的有效地址STR Rd, place 存储 Rd 到 PC + place 所合成的有效地址你当然可以在这些指令上使用条件执行但要注意条件标志要先于字节标志所以如果你希望在结果是等于的时候装载一个字节要用的指令是 LDREQB Rx,(不是 LDRBEQ...)如果你指定预先变址寻址(这里的基址和变址都在方括号中)用是否存在'!'来控制写回操作上面的第4和第5个例子中使用了这个标志你可以使用它来在内存中自动正向或反向移动一个字符串打印例程将变成:.loopLDRB R0, [R1, #1]!SWI "OS_WriteC"CMP R0, #0BNE loop而不是:.loopLDRB R0, [R1]SWI "OS_WriteC"ADD R1, R1, #1CMP R0, #0BNE loop对于过后变址寻址'!'是无效的(这里的变址在方括号外面比如上面的例子6)因为写回是暗含的如同你见到的那样变址可以被移位来实现比例缩放除此之外可以从基址上减去偏移量在这种情况下你可以使用如下代码:LDRB R0, [R1, #-1]尽管你可以存储或装载 PC但你不可以用装载或存储指令来修改 PSR要装载一个被存储的'状态'并正确的恢复它请使用:LDR R0, [Rbase]MOVS R15, R0假如你在有特权的模式下MOVS 将导致 PSR 的位被更改对 PC 使用 MOVS 不遵从 32-bit 体系你需要使用 MRS 和 MSR 来处理 PSR依照 ARM 汇编手册:译注:下文所叙述内容针对的是小端字节序配置对大端字节序配置在手册中另有专门叙述如果提供的地址在一个字边界上则字节装载(LDRB)使用在 0 至 7 位上的数据如果在一个字地址加上一个字节上则使用 8 至 15 位以此类推选择的字节被放入目标寄存器的低端 8 位中并把寄存器中其余的位用零填充字节存储(STRB)在数据总线上重复源寄存器的的低端 8 位 4 次由外部的内存系统来激活适当的字节子系统来存储数据字装载(LDR)或字存储(STR)将生成一个字对齐的地址使用一个非字对齐的地址将有不明显和未规定的结果实际上提示的是你不能使用 LDR 从一个非对齐的地址装载一个字传送多个数据使用多数据传送指令(LDM 和 STM)来装载和存储多个字的数据从/到内存LDM/STM 的主要用途是把需要保存的寄存器复制到栈上如我们以前见到过的 STMFD R13!, {R0-R12, R14}指令格式是:xxM{条件}{类型} Rn{!}, <寄存器列表>{^}'xx'是 LD 表示装载或 ST 表示存储再加 4 种'类型'就变成了 8 个指令:栈其他LDMED LDMIB 预先增加装载LDMFD LDMIA 过后增加装载LDMEA LDMDB 预先减少装载LDMFA LDMDA 过后减少装载STMFA STMIB 预先增加存储STMEA STMIA 过后增加存储STMFD STMDB 预先减少存储STMED STMDA 过后减少存储指令格式汇编器关照如何映射这些助记符注意 ED 不同于 IB;只对于预先减少装载是相同的在存储的时候ED 是过后减少的FD、ED、FA、和 EA 指定是满栈还是空栈是升序栈还是降序栈一个满栈的栈指针指向上次写的最后一个数据单元而空栈的栈指针指向第一个空闲单元一个降序栈是在内存中反向增长(就是说从应用程序空间结束处开始反向增长)而升序栈在内存中正向增长其他形式简单的描述指令的行为意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)RISC OS 使用传统的满降序栈在使用符合 APCS 规定的编译器的时候它通常把你的栈指针设置在应用程序空间的结束处并接着使用一个 FD (满降序 - Full Descending)栈如果你与一个高级语言(BASIC 或 C)一起工作你将别无选择栈指针(传统上是 R13)指向一个满降序栈你必须继续这个格式或则建立并管理你自己的栈(如果你是死硬派人士那么你可能喜欢这样做!)'基址'是包含开始地址的寄存器在传统的 RISC OS 下它是栈指针 R13但你可以使用除了 R15 之外的任何可获得的寄存器如果你想把复制操作后栈顶的当前的内存地址保存到栈指针中可以寄存器按从最低到最高的编号次序与到从低端到高端的内存之间传送数据并且因为用指令中的一个单一的位来表示是否保存一个寄存器不可能指定某个寄存器两次它的副作用是不能用下面这样的代码:STMFD R13!, {R0, R1}LDMFD R13!, {R1, R0}来交换两个寄存器的内容提供了一个有用的简写要包含一个范围的寄存器可以简单的只写第一个和最后一个并在其间加一个横杠例如 R0-R3 等同与 R0, R1, R2, R3只是更加整齐和理智而已...在把 R15 存储到内存中的时候还保存了 PSR 位。

ARM处理器模式和寄存器介绍

ARM处理器模式和寄存器介绍

ARM处理器共有7种运行模式:用户模式(user,use)正常程序执行模式快速中断模式(fiq)用于高速数据传输和通道处理外部中断模式(irq)用于通常的中断处理管理模式(sve)操作系统使用的一种保护模式数据访问终止模式(abt)用于虚拟存储及存储保护未定义指令终止模式(und)用于支持通过软件方针硬件的协处理器系统模式(sys)用于运行特权级的操作系统任务除了用户模式之外的6种处理器模式称为特权模式(privileged modes)。

在这些模式下,程序可以访问所有的系统资源,也可以任意第进行处理器模式切换。

其中,除系统模式外,其他5种特权模式又称为异常模式。

处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。

大多数的用户程序运行在用户模式下。

这时,应用程序不能够访问一些受操作系统保护的系统资源。

应用程序也不能直接进行处理器模式的切换。

当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器处理器模式的切换。

这种体系结构可以使系统控制整个系统的资源。

当应用程序发生异常中断时,处理器进入相应的异常模式。

在每一种异常模式中都有一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,拥护模式下的寄存器(保存了程序运行状态)不被破坏。

系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。

但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换。

它主要供操作系统任务使用。

通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用拥护模式的寄存组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。

ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。

(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。

(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是只使用了其中的12位。

ARM汇编之寄存器

ARM汇编之寄存器

在ARM处理器内部共有37个用户可访问的寄存器,分别为31个通用的32位寄存器和6个状态寄存器。

一.通用寄存器:1.在汇编语言中,寄存器R0-R13为保存数据或地址值的通用寄存器。

2.其中寄存器R0-R7为未分组的寄存器。

对于任何处理器模式,它们都共享R0~R7的通用寄存器。

3.寄存器R8-R12为两个分组的物理寄存器。

a.FIQ拥有自己独立的R8~R12的通用寄存器。

b.其他六种处理器模式共享R8~R12的通用寄存器注:寄存器R8~R12在ARM体系结构中没有特定的用途。

给FIQ单独的R8~R12可实现快速的中断处理(在发生FIQ中断后,处理器不用为了保护寄存器而浪费时间,从而提高了FIQ的处理速度)4.寄存器R13和R14a.用户模式和系统模式公用R13和R14的寄存器内容。

b.其它五个模式拥有自己独立的R13和r14寄存器内容。

c.R13作为堆栈指针(SP),用于保存待使用的寄存器内容。

d.寄存器R14称为链接寄存器(LR),它的作用有两个:当使用BL指令调用子程序时,系统会自动将 BL指令的下一条指令的地址存入R14中。

程序A指令过程中调用程序B程序跳转至标号Lable处,执行程序B.系统将BL Lable指令的下一条指令所在地址存入R14中程序B执行最后,执行语句MOV PC,LR将R14寄存器的内容放入PC处,返回至NEXT处继续执行。

●当发生异常时,系统自动将异常的返回地址放入R14中(有些异常有一个小的固定的偏移量)二.重要的寄存器1.堆栈指针R13R13作为堆栈指针SP。

在ARM指令集中,由于没有以特殊方式使用R13的指令。

(在Thumb)指令集中存在使用R13的指令)每个异常模式都有其自身的R13分组版本,它通常指向由异常模式所专用的堆栈。

在入口处,异常处理程序通常将其他要使用的寄存器值保存到这个堆栈。

通过返回时将这些值重装到寄存器中。

异常处理程序可确保异常发生时的程序状态不会被破坏。

arm工作模式及寄存器解析

arm工作模式及寄存器解析
1、用户模式(Usr) 用于正常执行程序
2、快速中断模式(FIQ) 用于高速数据传输
3、外部中断模式(IRQ) 用于通常的中断处理
工作模式
4. 管理模式(svc) 操作系统使用的保护模式
5. 数据访问终止模式(abt) 当数据或指令预取终止时进入该模式,可用于虚拟存储及 存储保护。 6. 系统模式(sys) 运行具有特权的操作系统任务。 7. 未定义指令中止模式(und) 当未定义的指令执行时进入该模式,可用于支持硬件
工作模式
ARM微处理器的运行模式可以通过软件改 变,也可以通过外部中断或异常处理改变。
应用程序运行在用户模式下,当处理器运行
在用户模式下时,某些被保护的系统资源是 不能被访问的。
工作模式
除用户模式以外,其余的所有6种模式称之为 非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以
寄存器(Thumb状态)
寄存器对应
Thumb状态下的寄存器组织与ARM状态下的寄存器组织的 关系: v Thumb状态下和ARM状态下的R0~R7是相同的。 v Thumb状态下和ARM状态下的CPSR和SPSR是相同的。 v Thumb状态下的SP对应于ARM状态下的R13。 v Thumb状态下的LR对应于ARM状态下的R14。
ARM微处理器的指令长度可以是32位(在 ARM状态下),也可以为16位(在Thumb 状态下)。ARM微处理器中支持字节(8 位)、半字(16位)、字(32位)三种数 据类型,其中,字需要4字节对齐(地址的 低两位为0)、半字需要2字节对齐(地址
的最低位为0)。
工作模式
ARM微处理器支持7种工作模式,分别为:
不分组通用寄存器
R0-R7是不分组寄存器。这意味着在所有处 理器模式下,访问的都是同一个物理寄存 器。未分组寄存器没有被系统用于特别的用 途,任何可采用通用寄存器的应用场合都可

ARM汇编之寄存器

ARM汇编之寄存器

ARM汇编之寄存器在ARM处理器内部共有37个⽤户可访问的寄存器,分别为31个通⽤的32位寄存器和6个状态寄存器。

⼀.通⽤寄存器:1.在汇编语⾔中,寄存器R0-R13为保存数据或地址值的通⽤寄存器。

2.其中寄存器R0-R7为未分组的寄存器。

对于任何处理器模式,它们都共享R0~R7的通⽤寄存器。

3.寄存器R8-R12为两个分组的物理寄存器。

a.FIQ拥有⾃⼰独⽴的R8~R12的通⽤寄存器。

b.其他六种处理器模式共享R8~R12的通⽤寄存器注:寄存器R8~R12在ARM体系结构中没有特定的⽤途。

给FIQ单独的R8~R12可实现快速的中断处理(在发⽣FIQ中断后,处理器不⽤为了保护寄存器⽽浪费时间,从⽽提⾼了FIQ的处理速度)4.寄存器R13和R14a.⽤户模式和系统模式公⽤R13和R14的寄存器内容。

b.其它五个模式拥有⾃⼰独⽴的R13和r14寄存器内容。

c.R13作为堆栈指针(SP),⽤于保存待使⽤的寄存器内容。

d.寄存器R14称为链接寄存器(LR),它的作⽤有两个:当使⽤BL指令调⽤⼦程序时,系统会⾃动将 BL指令的下⼀条指令的地址存⼊R14中。

程序A指令过程中调⽤程序B程序跳转⾄标号Lable处,执⾏程序B.系统将BL Lable指令的下⼀条指令所在地址存⼊R14中程序B执⾏最后,执⾏语句MOV PC,LR将R14寄存器的内容放⼊PC处,返回⾄NEXT处继续执⾏。

●当发⽣异常时,系统⾃动将异常的返回地址放⼊R14中(有些异常有⼀个⼩的固定的偏移量)⼆.重要的寄存器1.堆栈指针R13R13作为堆栈指针SP。

在ARM指令集中,由于没有以特殊⽅式使⽤R13的指令。

(在Thumb)指令集中存在使⽤R13的指令)每个异常模式都有其⾃⾝的R13分组版本,它通常指向由异常模式所专⽤的堆栈。

在⼊⼝处,异常处理程序通常将其他要使⽤的寄存器值保存到这个堆栈。

通过返回时将这些值重装到寄存器中。

异常处理程序可确保异常发⽣时的程序状态不会被破坏。

ARM寄存器详解

ARM寄存器详解

ARM 处理器有二十七个寄存器,其中一些是在一定条件下使用的,所以一次只能使用十六个。

R0~R7:是通用寄存器并可以用做任何目的。

R8~R12:是通用寄存器,但是在切换到FIQ模式的时候,使用它们的影子(shadow)寄存器。

R13:被称为栈指针寄存器,常用来保存栈指针。

R14:链接寄存器,常用来保存函数返回地址R15:是程序指针PCCPSR:(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 指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指在以上2 条指令中,第2个源操作数即为立即数,实际使用时以“#”符号为前缀。

2.寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。

如以下的指令。

3.寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。

例如以下指令。

在第 1 条指令中,以寄存器R2 的内容作为操作数的地址,然后与R1 相加,其结果存入寄存器R0中。

第2条指令将以R1 的值为地址的存储器中的内容送到寄存器R0中。

4.基址变址寻址基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。

如下面的几条指令所示。

在第1条指令中,将寄存器R1 的内容加上0x3A 形成操作数的有效地址,将该地址处的操作数送到寄存器R0中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)。

相关文档
最新文档