第3章 31ARM处理器工作模式及寄存器介绍

合集下载

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工作模式

arm工作模式

arm工作模式ARM工作模式。

ARM处理器是一种广泛应用于嵌入式系统和移动设备中的处理器架构。

它以其低功耗、高性能和灵活性而闻名,是许多设备的首选处理器。

在ARM处理器中,工作模式是其核心概念之一,不同的工作模式可以实现不同的功能和性能。

本文将介绍ARM处理器的工作模式及其特点。

1. 用户模式。

在ARM处理器中,用户模式是最基本的工作模式。

在用户模式下,处理器可以执行大多数指令,但对于一些特权指令和资源的访问会受到限制。

用户模式通常用于运行普通应用程序,保护系统的安全性和稳定性。

2. 特权模式。

特权模式是ARM处理器的特殊工作模式,它具有更高的权限和特权级别。

在特权模式下,处理器可以执行所有指令并访问系统的所有资源,包括控制寄存器和中断控制器等。

特权模式通常用于操作系统内核和驱动程序,以及一些需要直接访问硬件资源的任务。

3. 直接存储器访问(DMA)模式。

DMA模式是用于实现直接存储器访问的工作模式。

在DMA模式下,处理器可以将数据直接传输到存储器中,而无需通过CPU的中间传输。

这种模式可以显著提高数据传输的效率,特别适用于需要大量数据传输的场景,如音频和视频处理。

4. 睡眠模式。

睡眠模式是用于节能的工作模式,在这种模式下,处理器会暂停大部分运行,并且关闭一些不必要的电路和部件,以降低功耗。

当系统处于空闲状态或需要长时间等待时,可以进入睡眠模式以节省能源。

5. 睡眠模式。

睡眠模式是用于节能的工作模式,在这种模式下,处理器会暂停大部分运行,并且关闭一些不必要的电路和部件,以降低功耗。

当系统处于空闲状态或需要长时间等待时,可以进入睡眠模式以节省能源。

6. 睡眠模式。

睡眠模式是用于节能的工作模式,在这种模式下,处理器会暂停大部分运行,并且关闭一些不必要的电路和部件,以降低功耗。

当系统处于空闲状态或需要长时间等待时,可以进入睡眠模式以节省能源。

7. 睡眠模式。

睡眠模式是用于节能的工作模式,在这种模式下,处理器会暂停大部分运行,并且关闭一些不必要的电路和部件,以降低功耗。

关于ARM寄存器组及工作模式知识

关于ARM寄存器组及工作模式知识

关于ARM寄存器组及⼯作模式知识关于ARM寄存器组及⼯作模式知识(周⽅辉)2012/8/10 编改记录⽬录1 参考⽂献 (2)1.1 内部参考⽂献 (2)1.2 外部参考⽂献 (2)2 名词解释 (2)3 ARM核⼯作模式 (2)3.1 程序状态寄存器 (3)3.2 寄存器分组 (4)3.3 何为特权(异常)模式 (6)3.4 各种模式⼯作机制 (7)3.5 各种模式⼯作返回⽤户模式机制 (9)4 ARM核⼯作模式初始化参考代码 (11)1参考⽂献1.1内部参考⽂献内部参考⽂献指的是周⽅辉⾃⽣的百度博⽂中的⽂件。

⽆内部参考⽂献。

1.2外部参考⽂献外部参考⽂献指的是相对于上述内部参考⽂献以外的⽂件。

《ARMv8_ISA_PRD03-GENC-010197-24-0.pdf》《cortex_a8_r3p2_trm.pdf》《CortexA8TechRefManul.pdf》2名词解释CPSR:当前程序状态寄存器,其数值反映出当前程序运⾏的⼀些状态指⽰。

SPSR:保存程序状态寄存器,在程序调⽤等情况下,需要保存⼀下当前程序状态寄存器的值(SPSR<=CPSR),便于⽇后回复。

SP:堆栈指针寄存器,其值⽤于执⾏当前堆栈栈顶(或栈底)位置。

PC:程序指针寄存器,其值⽤于指向要执⾏的程序代码地址。

LR:连接返回寄存器,保存要返回的地址,PC<=LR。

3ARM核⼯作模式常规CPU⼯作核⼼模块都是由:寄存器组和ALU两⼤模块组成,ALU完成数据的加⼯处理,寄存器⽤来保存数据,这些数据是直接参与ALU运算。

ARM的处理器也不例外。

ARM处理器的寄存器分成许多组,不同的组完成不同环境下的⼯作,不过它们都共⽤⼀套ALU数据处理模块。

ARM寄存器⼀般⽤了37个,Cortex A8的ARM核的寄存器多⼤40个。

我们学习ARM⼯作模式需要了解和解决下⾯问题:ARM寄存器为什么要分组?⼜是如何分组?各组与CPU⼯作模式是如何关联?各个组或⼯作模式是如何切换的?我们在学习ARM寄存器分组⼯作模式之前,先来看⼀下很特殊的⼀个寄存器——PSR 程序状态寄存器。

ARM处理器的工作模式

ARM处理器的工作模式
模式的状态不可靠。
支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式
(3)用户和系统模式
6
处理器模式 用用户户 (u(surs) r) 系统系统 (sy(sy) s)
快中断 (fiq) 中断 (irq) 管理 (svc)
中止 (abt)
说明
备注
正常程序工作这模两式 种模式都不不能能由直接异切常换到进其入它模,式 用于而支持且操系它作系统们统模使的特式用权是完任务特全等权相与 到模同用 其式的户 它模 模,寄式 式不存类 等似 特受器, 权用组但具。有可以直接切换 支持户高速模数式据传的输限及通制道。处理操作F系IQ异统常在响应该时模进入式此模式
操作系访统问保护。代此码 外,特权模系式统复可位以和软自件由中断的响应时进入此模式
用保于护支切直持换接虚拟处切内理换存和器到/或模别存储式的器,模而式在用。AR户M7模TDM式I没不有能大用处
支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式
5
(2)异常模式
处理器模式 用户 (usr) 系统 (sys)
7
2.ARM微处理器的处理器改变方式
• ARM微处理器的运行模式可以通过软件改变(特权模式),也可以通过外部中断或异常 处理改变。
• 大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的 系统资源是不能被访问的。也不能改变模式。除非异常发生。
• 特权模式可以自由地访问系统资源和改变模式。
中止 (abt)
用于支持虚拟内存和/或存储器保护 在ARM7TDMI没有大用处
未定义 (und) 支持硬件协处理器的软件仿真
未定义指令异常响应时进入此模式
4
(1)特权模式
处理器模式 用户 (usr) 系系统统 (sy(ssy)s)

第3章_ARM指令系统

第3章_ARM指令系统

23
3.2 ARM指令的 寻址方式
堆栈寻址和多寄存器寻址有很多相似之处,可以说 堆栈寻址是多寄存器寻址的特例,堆栈操作的指令
也有一一对应的多寄存器访问指令,如下表所示。
递增 满 先增 增值 后增 先减 减值 后减 LDMDA LDMFA STMIB STMFA STMIA LDMIA 空 满 递减 空 LDMIB LDMED
、后索引偏移和自动索引之分。
零偏移----实际上就是寄存器间接寻址 前索引偏移: LDR R2, [R3, #0X12] ; [(R3)+ #0X12]送R2,R3值不变 后索引偏移: STR R2, [R3], #0X12; R2送[R3],R3+0X12送R3 自动索引: LDR R2, [R3,#0X12]!; [(R3)+ #0X12]送R2,R3+0X12送R3
存储器 R2 0X00009000 0X00009000
0X20
R1
0X20
13
3.2 ARM指令的寻址方式
(6)基址变址寻址
基址变址寻址是指操作数的有效地址是由寄存器的内容加
上指令中给出的变址来确定的;
操作数所在存储单元的基地址由寄存器给出,这个寄存器 就叫做基址寄存器。 变址既可以以立即数形式给出,也可以由寄存器来提供。
4
3.2 ARM指令的寻址方式
所谓寻址方式就是人们根据操作数所在位置、数据 类型及其数据结构的不同,人为规定的根据指令中
给出的信息找出操作数有效地址的方式。
根据操作数的种类不同,ARM寻址方式可以分为
数据操作数寻址方式和地址操作数寻址方式两大类
,其中,数据操作数又有立即数、寄存器操作数、 存储器操作数和I/O操作数之分。 操作的对象不同,所用的寻址方式也不同。

ARM(包括ARMv7工作模式介绍)寄存器、工作模式和指令集

ARM(包括ARMv7工作模式介绍)寄存器、工作模式和指令集

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中所总结。

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位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Neusoft Institute of Information
3.1.3 寄存器组织
如图 3-1 所示,ARM微处理器共有37个 32位寄存器,其中31个为通用寄存器,6个为 状态寄存器。 这些寄存器不能被同时访问,具体哪些寄 存器是可编程访问的,取决于微处理器的工作 状态及具体的运行模式。 但在任何时候,通用寄存器R0~R14、程 序计数器PC、当前状态寄存器CPSR都是可访 问的。
3.1.1 ARM微处理器的工作状态
从编程的角度看,ARM微处理器的工作状态一般有两种, 并可在两种状态之间切换: •ARM状态,此时处理器执行32位的字对齐的ARM指 令; •Thumb状态,此时处理器执行16位的、半字对齐的 Thumb指令。
December 25, 2018
Neusoft Institute of Information
December 25, 2018
Neusoft Institute of Information
3.1.2 处理器模式
• • • • •


ARM微处理器支持7种运行模式,分别为: 用户模式(User):正常的程序执行模式。 快速中断模式(Fast Interrupt):用于高速数据传输或通道处理。 外部中断模式(Interrupt):用于通用的中断处理。 管理模式(Supervisor):操作系统使用的保护模式,系统复位 后的缺省模式。 中止模式(Abort):用于虚拟存储或存储器保护。 – 1.指令中止模式(abt):指令预取终止时进入该模式。 – 2.数据访问中止模式(abt):当数据访问终止时进入该模式, 可用于虚拟存储及存储保护。 指令未定义模式(Undefined):支持硬件协处理器指令的软件 仿真 系统模式(System):运行具有特权的操作系统任务。
December 25, 2018
Neusoft Institute of Information
3.1 ARM处理器工作模式及寄存器介绍
3.1.1 ARM微处理器的工作状态 3.1.2 处理器模式 3.1.3 寄存器组织 3.1.4 异常
December 25, 2018
Neusoft Institute of Information
December 25, 2018
Neusoft Institute of Information
处理器启动时的模式转换图
管理模式 (Supervisor)
多种特权模式变化
用户程序的运行模式
复位后的缺 省模式
主要完成各 模式的堆栈 设置,注意 不要进入用 户模式一来自为用户 模式处理器模式
December 25, 2018
• • • 通用寄存器包括R0~R15,可以分为3类: 未分组寄存器R0~R7 分组寄存器R8~R14 程序计数器PC(R15)
December 25, 2018
Neusoft Institute of Information
① 未分组寄存器R0~R7
在所有的运行模式下,未分组寄存器都指 向同一个物理寄存器,它们未被系统用作特殊 的用途,因此,在中断或异常处理进行运行模 式转换时,由于不同的处理器运行模式均使用 相同的物理寄存器,可能会造成寄存器中数据 的破坏,这一点在进行程序设计时应引起注意。
December 25, 2018
Neusoft Institute of Information
对于R13、R14,每个寄存器对应6个不 同的物理寄存器,其中一个是用户模式与系统 模式共用,另外5个物理寄存器对应于其他5种 不同的运行模式。 采用以下记号来区分不同的物理寄存器: R13_<mode> R14_<mode> 其中,mode为以下几种模式之一:usr、 fiq、irq、svc、abt、und。
两种工作状态切换的情况: •在执行Thumb程序段时发生异常中断
在执行Thumb程序段时,处理器处于Thumb状 态,异常中断发生时,处理器自动进入ARM状态。
•程序从中断返回时
如果发生异常中断时,处理器处于Thumb状态, 则中断返回时,处理器会恢复为Thumb状态
•执行BX指令
使用BX指令时,程序可以实现跳转和处理器工作 状态转换。 BX Rn
December 25, 2018
Neusoft Institute of Information
② 分组寄存器R8~R14 对于分组寄存器,它们每一次所访问的物 理寄存器与处理器当前的运行模式有关。 对于R8~R12,每个寄存器对应两个不同 的物理寄存器,当使用fiq模式时,访问寄存器 R8_fiq~R12_fiq;当使用除fiq模式以外的其 他模式时,访问寄存器R8_usr~R12_usr。
December 25, 2018
Neusoft Institute of Information
寄存器R13在ARM指令中常用作堆栈指针, 但这只是一种习惯用法,用户也可使用其他的寄存 器作为堆栈指针。而在Thumb指令集中,某些指令 强制性的要求使用R13作为堆栈指针。 由于处理器的每种运行模式均有自己独立的物 理寄存器R13,在用户应用程序的初始化部分,一 般都要初始化每种模式下的R13,使其指向该运行 模式的栈空间。 这样,当程序的运行进入异常模式时,可以将 需要保护的寄存器放入R13所指向的堆栈,而当程 序从异常模式返回时,则从对应的堆栈中恢复,采 用这种方式可以保证异常发生后程序的正常执行。
December 25, 2018
Neusoft Institute of Information
ARM微处理器的运行模式可以通过软件改变,也 可以通过外部中断或异常处理改变。 大多数的应用程序运行在用户模式下,当处理器 运行在用户模式下时,某些被保护的系统资源是不能 被访问的。 除用户模式以外,其余的所有6种模式称为非用户 模式或特权模式(Privileged Modes); 其中除去用户模式和系统模式以外的5种又称为异 常模式(Exception Modes),常用于处理中断或异常, 以及需要访问受保护的系统资源等情况。
December 25, 2018
Neusoft Institute of Information
1. ARM状态下的寄存器组织
(1) 通用寄存器. (2) 状态寄存器 如图 3-2 所示
December 25, 2018
Neusoft Institute of Information
(1) 通用寄存器.
相关文档
最新文档