arm通用寄存器及其别名
- 格式:doc
- 大小:52.50 KB
- 文档页数:4
arm9处理器的内部寄存器结构
ARM9处理器是一种32位的嵌入式处理器,内部包含了多种寄存器,这些寄存器扮演着不同的角色,用于存储不同类型的数据和指令,从而实现处理器的各种功能。
ARM9处理器的内部寄存器结构主要包括:
1.通用寄存器:ARM9处理器有16个32位的通用寄存器,这些寄存器不仅可以用于存储数据,还可以用于存储指令中的操作数。
通用寄存器还可以用于存储函数的参数和返回值。
2.程序计数器(PC):程序计数器是一个32位的寄存器,用于存储当前正在执行的指令的地址。
当处理器执行完一条指令后,PC会自动递增,指向下一条指令的地址。
3.状态寄存器:状态寄存器用于存储处理器的当前状态。
例如,它可以用于存储处理器的运行模式,或者存储处理器的条件码。
4.堆栈指针(SP):堆栈指针用于指向当前的堆栈顶部。
当处理器需要执行函数调用或其他需要使用堆栈的指令时,它会将数据压入堆栈中,并将堆栈指针减小。
当函数返回时,处理器会将数据从堆栈中弹出,并将堆栈指针增加。
5.链接寄存器(LR):链接寄存器用于存储函数调用的返回地址。
当函数被调用时,处理器将当前指令的地址存储在LR中。
当函数执行完毕后,处理器会将LR中的地址作为返回地址,跳转回调用函数的地方。
6.中断寄存器:中断寄存器用于存储当前中断的状态。
当处理器
接收到一个中断时,它会将当前的状态保存在中断寄存器中,并跳转到中断处理程序的地址。
总之,ARM9处理器的内部寄存器结构是非常复杂的,不同类型的寄存器扮演着不同的角色。
通过合理地利用这些寄存器,程序员可以实现各种复杂的嵌入式应用。
arm常用的名词解释ARM(Advanced RISC Machine)是一种常用的计算机架构,被广泛应用于移动设备、嵌入式系统和单片机等领域。
本文将对ARM常用的一些名词进行解释,以帮助读者更好地了解ARM架构。
1. RISC(Reduced Instruction Set Computer):精简指令集计算机。
相对于复杂指令集计算机(CISC),RISC采用简化指令集,每条指令都非常简单,执行速度快,并且易于设计和优化硬件。
2. 架构:计算机系统的基本设计和组织原则。
ARM架构设计了一套标准的指令集和寄存器组织,以及与之兼容的处理器核心,为ARM生态系统提供了一致的编程接口。
3. 处理器核心(Processor Core):ARM的核心部分,负责执行指令和进行算术逻辑运算。
常见的ARM处理器核心包括Cortex-A系列(用于应用处理器)、Cortex-M系列(用于嵌入式系统和微控制器)和Cortex-R系列(用于实时应用和嵌入式处理器)。
4. 指令集架构(Instruction Set Architecture):定义了一套计算机指令的规范和编码方式。
ARM指令集架构包括ARMv8-A、ARMv7-A、ARMv6-M等不同的版本,不同版本支持不同的指令集和功能。
5. 寄存器:位于处理器核心内部的高速存储器,用于存储指令执行过程中需要操作的数据。
ARM体系结构中,常见的寄存器包括通用寄存器、程序计数器、状态寄存器等。
6. 多核处理器(Multi-core Processor):使用多个处理器核心的处理器。
ARM 架构支持多核处理器的设计,使得多个核心可以同时进行计算任务,提高处理能力和并行性能。
7. SoC(System on a Chip):一种集成了多个功能组件的芯片,包括处理器核心、内存控制器、I/O接口等。
ARM架构广泛应用于SoC的设计,提供了高度集成的解决方案,节省了系统板块的空间和功耗。
单片机笔记-寄存器、引脚及其英文名称缩写在单片机开发过程中,我们常常会涉及到寄存器和引脚的使用。
寄存器是用于存储和处理数据的重要组成部分,而引脚则是用于连接外部设备和单片机的接口。
了解寄存器、引脚及其英文名称缩写是学习和理解单片机编程的重要一步。
一、寄存器寄存器是单片机中的一种特殊功能寄存器,它们用来存储特定的信息,如状态、控制和数据等。
寄存器的使用是通过对其地址进行读/写操作来实现的。
在单片机中,存在着许多不同的寄存器,下面是一些常见的寄存器及其英文名称缩写:1. 状态寄存器(Status Register) - SR状态寄存器用于存储和显示一些跟运算或处理结果有关的标志位,如进位标志位、溢出标志位、零标志位等。
通过对状态寄存器的读写,可以获取或设置这些标志位的值。
2. 数据寄存器(Data Register) - DR数据寄存器用于存储临时数据,如中间计算结果或输入/输出数据等。
读写数据寄存器时,可以进行数据的读取或写入操作。
3. 控制寄存器(Control Register) - CR控制寄存器用于控制某些外设或特定功能的工作方式,如时钟控制寄存器、中断控制寄存器等。
写入或读取控制寄存器可以实现对相应功能的配置和控制。
4. 地址寄存器(Address Register) - AR地址寄存器用于存储指令和数据的地址信息。
在程序执行过程中,地址寄存器可以用于指示当前要执行的指令或要读取/写入数据的地址。
二、引脚引脚是单片机的外部接口,通过引脚可以与其他电子元件或设备进行连接和通信。
引脚的使用通常包括输入输出、中断触发、时钟输入等功能。
下面是一些常见的引脚及其英文名称缩写:1. 电源引脚(Power Pin) - VCC、GND电源引脚用于提供单片机的供电电源。
其中,VCC用于给单片机提供正电源,而GND则是单片机的接地端。
2. 输入引脚(Input Pin) - IN输入引脚用于接收外部信号。
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用于双精度浮点数操作。
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,没用别的用途。
指令格式:指令{条件}{S} {目的Regi ster},{OP1},{OP2} "{ }"中的内容可选。
即,可以不带条件只有目的寄存器,或只有目的寄存器和操作数1,也可以同时包含所有选项。
“S”决定指令的操作是否影响C PSR中条件标志位的值,当没有S时指令不更新C P SR中条件标志位的值助记符英文全称示例、功能跳转指令BBranch跳转指令B Label;程序无条件跳转到标号L a bel处执行BLBranch with Link带返回的跳转指令BL Label;当程序无条件跳转到标号L abel处执行时,同时将当前的P C值保存到R14中BLXBranch with Link and exchan ge带返回和状态切换的跳转指令BLX Label;从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有A RM状态切换到Th umb状态,该指令同时将PC的当前内容保存到寄存器R14中BXBranch and exchan ge带状态切换的跳转指令BX Label;跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Th umb指令数据处理MOVMove数据传送MOV R1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MVNMove NOT数据非传送MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1CMPCompare比较指令CMP R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMNCompare negati ve负数比较指令CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位TSTTest位测试指令TST R1,#0xffe;将寄存器R1的值与立即数0xff e按位与,并根据结果设置CPSR的标志位TEQTest equivalence相等测试指令TEQ R1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位ADDAdd加法运算指令ADD R0,R2,R3,LSL#1; R0 = R2 + (R3 << 1)ADCAdd with carry带进位加法ADCS R2,R6,R10; R2 = R6+R10+!C,且更新CPS R的进位标志位SUBSubtract减法运算指令SUB R0,R1,#256; R0 = R1 – 256SBCSubtract with carry带进位减法指令SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位RSBReverse subtra ct逆向减法指令RSB R0,R1,R2 ; R0 = R2 – R1RSCReverse subtra ct with carry带进位逆向减法指令RSC R0,R1,R2; R0 = R2 – R1 - !CANDAnd逻辑与操作指令AND R0,R0,#3;该指令保持R0的0、1位,其余位清零。
ARM寄存器总结
ARM 有16 个32 位的寄存器(r0 到r15)。
r15 充当程序寄存器
PC,r14(link register)存储子程序的返回地址,r13 存储的是堆栈地址。
ARM 有一个当前程序状态寄存器:CPSR。
一些寄存器(r13,r14)在异常发生时会产生新的instances,比如IRQ 处理器模式,这时处理器使用r13_irq 和r14_irq
ARM 的子程序调用是很快的,因为子程序的返回地址不需要存放在堆栈中。
1、ARM 处理器共有37 个寄存器,其中包括:
i. 31 个通用寄存器,包括程序计数器(PC)在内。
都是32 位寄存器
ii. 6 个状态寄存器,都是32 位寄存器,但目前只使用了其中12 位
2、ARM 处理器有7 种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。
任意时刻(也就是任意的处理器模式下),可见的寄存器包括
15 个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。
在所有的寄存器中,有些是各模式共用的同一个物理寄存器,有些是各模式自己拥有的独立的物理寄存器。
3、通用寄存器可以分为3 类:未备份寄存器(R0~R7)、备份寄存器
(R8~R14)和程序计数器PC(R15)。
对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。
对应备份寄存器R8~R12 来说,每个寄存器对应两个不同的物理寄存器,这使得中断处理非常简单。
例如,仅仅使用R8~R14 寄存器时,FIQ 处理程序可以不必执行保存和恢复中断现场的。
ARM(包括ARMv7⼯作模式介绍)寄存器、⼯作模式和指令集(来源:IT165收集)转载于: /uid-30234312-id-5077078.html本章介绍ARM处理器的基础特性,包括寄存器、⼯作模式和指令集的细节。
我们也会涉及⼀些处理器实现细节,包括指令流⽔线和分⽀预测。
ARMv7架构是⼀个32位处理器架构。
它是⼀种load/store架构,意味着数据处理指令操作通⽤寄存器中的值。
只有加载(load)和存储(store)指令访问存储器。
通⽤存储器也是32位的。
本书中,字(word)代表32位,双字(doubleword)代表64位,半字(halfword)代表16位宽。
尽管ARMv7架构是⼀种32位架构,单独的处理器对所有模块和内部连接的实现不⼀定必须都是32位宽。
例如,对于指令获取和数据访问,具有64位或更宽的路径是可能的。
实现ARMv7-A架构的处理器不具有由架构固定的存储器映射。
处理器能访问4GB的虚拟地址空间,存储器和外设都可以在那个空间范围之内⾃由地映射。
我们将会在第9章和第10章中讲述存储器管理,那⾥我们会看到缓存和内存管理单元(MMU)。
4.1 指令集 ⼤多数ARM处理器⽀持超过⼀种指令集: >ARM--- ⼀种32位指令集 >Thumb--- ⼀种16位指令集,具有更好的代码密度(但是相⽐ARM代码,性能有所降低)在程序的控制之下,处理器可以在这两种指令集之间来回切换。
所有的Cortex-A系列处理器实现了Thumb-2技术,它扩展了Thumb指令集。
混合使⽤32位和16位指令,以Thumb指令集的代码密度和接近ARM指令集的性能。
⾃从所有的Cortex-A系列处理器⽀持这⼀扩展,针对它们的软件常被编译成Thumb指令集。
(本⽂作者注:按照⽂章《如何使⽤Thumb-2改善代码密度和性能》所述,Thumb-2代码⼤⼩约为ARM代码的74%,性能则为其98%)4.2 模式 ARM架构有9种处理器模式,在表4-1中所总结。
一:模式
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因为用户模式不属于异常中断模式)。
汇编语言寄存器英文缩写全称由于汇编语言是一种底层的计算机程序设计语言,与人类自然语言有很大的差别。
在汇编语言中,寄存器是一种非常重要的数据存储和处理方式。
寄存器用于存放计算过程中的临时数据、地址偏移量和指令操作数等。
对于初学者来说,掌握汇编语言中寄存器的英文缩写全称是非常重要的一步。
以下是一些常用的汇编语言寄存器英文缩写全称:1. 通用寄存器:- 累加器 (Accumulator):ACC- 基址寄存器 (Base Pointer):BP- 数据寄存器 (Data Register):DR- 索引寄存器 (Index Register):IR- 堆栈寄存器 (Stack Pointer):SP2. 数据寄存器:- 通用数据寄存器 (General Data Register):GDR- 扩展数据寄存器 (Extended Data Register):EDR- 输入数据寄存器 (Input Data Register):IDR- 输出数据寄存器 (Output Data Register):ODR3. 地址寄存器:- 通用地址寄存器 (General Address Register):GAR- 扩展地址寄存器 (Extended Address Register):EAR- 输入地址寄存器 (Input Address Register):IAR- 输出地址寄存器 (Output Address Register):OAR4. 控制寄存器:- 程序计数器 (Program Counter):PC- 状态寄存器 (Status Register):SR- 控制寄存器 (Control Register):CR5. 特殊寄存器:- 指令寄存器 (Instruction Register):IR- 标志寄存器 (Flag Register):FR- 索引寄存器 (Index Register):IR- 堆栈指针寄存器 (Stack Pointer Register):SPR以上只是介绍了一部分汇编语言寄存器的英文缩写全称,实际上还有更多的寄存器在不同的架构和指令集中使用。
在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处理器内部共有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汇编学习笔记——MRS和MSR指令MRS,状态寄存器传送⾄通⽤寄存器类指令功能:将状态寄存器的内容传送⾄通⽤寄存器。
格式:MRS{<条件码>}Rd,CPSR}SPSR其中:Rd ⽬标寄存器,Rd不允许R15。
R=0 将CPSR中的内容传送⽬的寄存器。
R=1 将SPSR中的内容传送⾄⽬的寄存器。
注释:MRS与MSR配合使⽤,作为更新PSR的读-修改-写序列的⼀部分。
例如:改变处理器或清除标志Q。
注意:当处理器在⽤户模式或系统模式下,⼀定不能试图访问SPSR这条指令不影响条件码标志。
例:MRS R0,CRSR ;将CPSR中的内容传送⾄R0MRS R3,SPSR ;将SPSR中的内容传送⾄R3MSR,通⽤寄存器传送⾄状态寄存器传送指令功能:将通⽤寄存器的内容传送⾄状态寄存器。
格式:MSR{<条件码>CPSR_f|SPSR_f,<#immed_8r>MSR{<条件码>CPSR_<field>|SPSR_<field>,Rm其中:<field>字段可以是以下之⼀或多种:(位从右到左)C:控制域屏蔽字段(PSR中的第0位到第7位);X:扩展域屏蔽字段(PSR中的第8位到第15位);S:状态域屏蔽字段(PSR中的第16位到第32位);F:标志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值数字常量的表达式。
常量必须对应8位位图。
该位图在32位字中循环移位偶数数位。
Rm 源寄存器。
注释:同前⼀条指令(MRS)。
例1:设置N、Z、C、V标志。
MSR CPSR_f,#&f0000000 ;仅⾼位有效,其他必须为0例2:仅置位C标志,保留N、Z、V标志。
MRS R0,CPSR ;将CPSR中的内容传送⾄R0ORR R0,R0,#&1f ;置位R0的第29位MSR CPSR_c,R0 ;再将R0中的内容传送⾄CPSR例⼦:设置cpu⼯作在超级保护模式(SVC32)@set the cpu to SVC32 modemrs r0,cpsr@把CPSR内容存⼊r0.使⽤了mrs指令:专⽤寄存器到通过寄存器的存取.@CPSR当前程序状态寄存器格式如下:@ 31 30 29 28 27 26 25 24 ~ ~ ~ 8 7 6 5 4 3 2 1 0@ ___ ___ ___ ___ ___ ___ ___ ___ _ _ _ _ ___ ___ ___ ____ ____ ____ ____ ____@| N | Z | C | V | * | * | * | * | * * * | I | F | T | M4 | M3 | M2 | M1 | M0 |@bic r0,r0,#0x1f@bic指令(bit clear): r0:= r0 and (not op2).上边的指令⽬的是把bit0~bit4清零.orr r0,r0,#0xd3@r0:= r0 or 0xd3 . 以上三条指令执⾏后r0值为:**** **** **** **** **** ***** 11*1 0011msr cpsr,r0@把r0存于cpsr.注意:msr指令是专⽤的通⽤寄存器到特殊功能寄存器的指令与mrs对应说明:通过上边的指令可以看到,实现了两个功能.1,disable 外部中断(IRQ)与快速中断(FIR).2,把系统设为SVC32状态(超级保护)即M4~M1=10011。
AMR寄存器的别名+ APCS
默认情况下,arm处理器中的通用寄存器被称为:r0、r1...r14等,在APCS中为arm通用寄存器定义了别名。
在某些情况下(比如多人协作编辑汇编代码,或需要修改其它人所写的汇编代码时),使用APCS所定义的别名有助于提高代码的可读性和兼容性。
arm通用寄存器及其别名对照表:
The following register names are predeclared:
r0-r15 and R0-R15
a1-a4 (argument, result, or scratch registers, synonyms for r0 to r3)
v1-v8 (variable registers, r4 to r11)
sb and SB (static base, r9)
ip and IP (intra-procedure-call scratch register, r12)
sp and SP (stack pointer, r13)
lr and LR (link register, r14)
pc and PC (program counter, r15).
arm中r12的用途
原文作者在维护1个以前的程序,该程序包括应用、库文件以及linux device driver。
该程序原来使用arm-linux-gcc 3.4.3编译,现在改用arm-linux-gcc 4.1.1进行编译时发现程序无法运行。
经原文作者测试,发现当使用shared library形式编译程序后无法运行,而使用static linking形式编译程序后可正常运行。
这是由于在arm-linux-gcc 4.1.1所使用的新的规范中,r12不仅作为通用寄存器,还被称为Intra-Procedure-call scratch register。
Register r12 (IP) may be used by a linker as a scratch register between a routine and any subroutine it calls (for details, see §5.3.1.1, Use of IP by the linker). It can also be used within a routine to hold intermediate values between subroutine calls
Both the ARM- and Thumb-state BL instructions are unable to address the full 32-bit address space, so it may be necessary for the linker to insert a veneer between the calling routine and the called subroutine. Veneers may also be needed to support ARM-Thumb inter-working or dynamic linking. Any veneer inserted must preserve the contents of all registers except IP (r12) and the condition code flags; a conforming program must assume that a veneer that alters IP may be inserted at any branch instruction that is exposed to a relocation that supports inter-working or long branches.
——引用自:"Procedure Call Standard for the ARM Architecture"
19th January, 2007, Richard Earnshaw.
由上述说明可知,若在汇编代码中使用了bl命令,而r12又被作为通用寄存器使用时,则r12的值可能会被链接器插入的veneer代码所修改,若是单纯的c源码则不会出现此问题。
arm中R0-R15寄存器的作用
r0-r3:被用来传递函数参数和函数返回值(可使用其别名A1~A3),在子程序调用之间,可使用r0~r3
作为任何用途。
若在被调用程序中需要使用r0~r3,则应在使用前保存这些寄存器的内容。
r4-r11:被用来存放函数局部变量(可使用其别名V1~V8)。
若在被调用程序中需要使用r4~r11,则应在使用前保存这些寄存器的内容。
r12:可作为内部调用过程寄存器ip,链接器可能会在过程链接胶合代码(比如,交互操作胶合代码)中使用ip寄存器。
在过程调用之间,可将r12用于任何用途,被调用函数在返回之前无需恢复r12。
r13:栈指针sp,通常不会将sp作为其它用途使用,在退出被调用函数时,需将sp恢复到进入时的状态。
r14:链接寄存器lr,用来保存函数返回地址,若在被调用程序中需要使用r14,则应在使用前保存r14寄存器的内容。
r15:程序计数器PC,不可将PC作为其它用途使用。
注意:在中断ISR中需要保护所有寄存器,编译器会自动保护R4~R11。