ARM的编程模式及寄存器

根据朱老师的课程及下面博客整理

http://blog.chinaunix.net/uid-20443992-id-5700979.html

ARM 采用的是32位架构

ARM 约定:

  Byte : 8 bits

  Halfword :16 bits (2 byte)

  Word : 32 bits (4 byte)

大部分ARM core 提供:

  ARM 指令集(32-bit)

  Thumb 指令集(16-bit )

  Thumb2指令集(16 & 32bit)

ARM 有7个基本工作模式:

  User :非特权模式,大部分任务执行在这种模式。

  FIQ :当一个高优先级(fast) 中断产生时将会进入这种模式,如高速数据传输或通道处理。

  IRQ :当一个低优先级(normal) 中断产生时将会进入这种模式,通常在硬件中断信号后进入该模式。

  Supervisor :当复位或软中断指令执行时将会进入这种模式,主要用于系统的初始化。

  Abort :当存取异常时将会进入这种模式,当访问非法地址或读取无权限内存地址时进入该模式。

  Undef :当执行未定义指令时会进入这种模式,用于支持硬件协处理器的软件仿真。

  System :使用和User模式相同寄存器集的特权模式。

  注意:

  (1)除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。

  (2)Privilege中除Sys模式外,其余5种为异常模式。

  (3)各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。

  (4)各种模式下权限和可以访问的寄存器不同。

ARM中7种模式下的寄存器

  ARM共有37个寄存器,都是32位长度

  37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

  图中有名字相同的寄存器,但是不是同一个寄存器。如r13在不同的模式下都有,但是不同模式下的r13都是不一样的,这种寄存器叫影子寄存器。

  (1)黑色部分的代表共用的寄存器,其他颜色的代表对应工作模式下才有的寄存器。

  (2)为什么7种模式下的r13是不一样的?

    r13(sp)是堆栈指针,如果7种模式都是采用同一个堆栈指针的话,在某一个模式中,堆栈出现了问题,则会导致7中模式都奔溃,故7种模式的栈都是不同的。

  (3)r14(lr)是用来存储返回地址的,每种模式的r14都是不同的寄存器。

  (4)spsr是用于切换模式前,将当前模式的cpsr的内容保存起来,在返回时,再将spsr的值给cpsr。

  (5)PC(Program control register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)。

  (6)整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个)。

程序状态寄存器CPSR

                                                                                            

  N(Negative)---设置成当前指令运算结果的bit[31]的值。当两个有符号整数运算时,N=1运算结果为负数,N=0运算结果为正。

Z(Zero)---Z=1运算结果为零;Z=0表示运算的结果不为零。对于CMP指令,Z=1表示进行比较的两个数大小相等。

C(Carried out)---分四种情况讨论

1)在加法指令中(包括比较指令CMP),当结果产生进位,则C=1,表示无符号运算发生上溢出;其他情况C=0。

2)在减法指令中(包括减法指令CMP),当运算发生借位,则C=0,表示无符号运算发生下溢出;其他情况下C=1。

3)对于包含移位操作的非加减运算指令,C中包含最后一次溢出的位的数值

4)对于其他非加减运算指令,C位的值通常不受影响

V(oVerflow)---对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1符号为溢出;通常其他指令不影响V位。

I和F---当I=1时禁止IRQ中断,当F=1时禁止FIQ中断

T---对于ARM V4以更高版本的T系列ARM处理器,T=0表示执行ARM指令;T=1表示执行Thumb指令

  M[4:0]---定义了的ARM工作模式,具体下中表CSPR[4:0]定义的ARM工作模式。


CPSR[4:0]


处理器模式


可访问的寄存器


0b10000


USER


R0~R14;PC;CPSR


0b10001


FIQ


R0~R7;R8_FIQ-R14_fiq;PC;CPSR;SPSR_fiq


0b10010


IRQ


R0~R12;R13_irq-R14_irq;PC;CPSR;SPSR_irq


0b10011


SUPERVISOR


R0~R12;R13_svc-R14_svc;PC;CPSR;SPSR_svc


0b10111


ABORT


R0~R12;R13_abt-R14_abt;PC;CPSR;SPSR_abt


0b11011


UNDEFINED


R0~R12;R13_und-R14_und;PC;CPSR;SPSR_und


0b11111


SYSTEM


R0~R14;PC;CPSR

R0~R7

所有工作模式下,R0-R7都分别指向同一个物理寄存器(共8个物理寄存器),它们未被系统用作特殊的用途。在中断或异常处理进行工作模式转换时,由于不同工作模式均使用相同的物理寄存器,可能造成寄存器中数据的破坏。

R8~R12

在User&System、IRQ、Svc、Abt和Und模式下访问的R8~R12都是同一个物理寄存器(共5个物理寄存器);在FIQ模式下,访问的R8_fiq~R12_fiq是另外独立的物理寄存器(共5个物理寄存器)。

R13R14

在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, LR

BX LR

  在子程序入口处使用以下指令将R14存入堆栈:

STMFD SP!,{,LR}

  对应的,使用以下指令可以完成子程序返回:

LDMFD SP!,{,PC}

程序计数器PC(R15)

所有工作模式下访问的R15都是同一个物理寄存器,由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节(每个ARM指令四个字节)。

CPSRSPSR

R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何工作模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。

每一种工作模式下又都有一个专用的物理状态寄存器,称为SPSR(Specified Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。

User模式和System模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。

时间: 2024-08-01 22:05:23

ARM的编程模式及寄存器的相关文章

ARM的编程模式

ARM的编程模式 Linux ARM的工作状态 (主要指指令模式) 基本概述 32位架构 指令相关 ARM 32bit Thumb指令 16bit Thumb-2 16||32 bit 兼容 复位后开始执行代码为ARM模式,ARM与Thumb通过BL指令切换16bit 存储格式 小端模式 低位低地址 ARM的工作模式 原文地址:https://www.cnblogs.com/Howbin/p/10661086.html

ARM汇编编程基础之一 —— 寄存器

ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB

ARM处理器工作模式

++++++++++++++++++++++++++++++++++++++++++ 本文转载自mr_raptor的专栏,感谢mr_raptor大神. http://blog.csdn.net/mr_raptor/article/details/6556157 ++++++++++++++++++++++++++++++++++++++++++ 1.1 ARM处理器工作模式 CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网

arm9的操作模式,寄存器,寻址方式

工作模式 Arm有7种工作模式: 名称 简称 简介 User Usr 正常用户程序执行的模式(linux下用户程序就是在这一模式执行的.) FIQ Fiq 快速中断模式 IRQ Irq 普通中断模式 Supervisor Svc 给操作系统准备的保护模式,权限很高的一种模式,linux的内核就是运行在此模式 Abort Abt 比如访问虚拟内存,导致了异常,就是进入这一模式. Undefined Und 运行一条处理器并不支持的指令就进入此模式. System Sys Armv4及以上的版本才有

软件和硬件都是对生活的高度抽象---论中断控制(ARM体系编程)

不同的芯片体系设计在集成电路系统设计阶段其实都遵循大体一致的设计思想,芯片设计发展那么多年,真正为人所熟知的就是X86架构和ARM架构,当然还有日渐没落的MIPS,其他都是一些简单的控制器芯片体系.而硬件模块设计又是高度抽象于现实需求,很多时候,X86.ARM和MIPS只有底层寄存器和指令级别的差异,对于软件驱动基本是一致的.本文论及ARM体系的中断控制,以基于Cortex A8的S5PV210为例.中断是一种异步工作机制,也是嵌入式处理器的一个核心工作机制,对于实时操作系统来说必不可少. 1.

GNU风格ARM汇编编程实战之一 <C与汇编混合编程>

一.参考资料 1. <ARM GCC内联汇编手册>:http://www.ethernut.de/en/documents/arm-inline-asm.html 2. <__asm__ __volatile__内嵌汇编用法简述>:http://www.embedu.org/Column/Column28.htm 3. <A?R?M?内?嵌?汇?编?示?例>:http://wenku.baidu.com/view/72c12e4133687e21af45a990.htm

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

[国嵌笔记][021-022][ARM处理器工作模式]

[ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Supervisor(svc):系统保护模式,linux内核运行在系统保护模式 5.Abort(abt):异常模式 6.Undefined(und):未定义指令模式 7.System(sys):系统模式 [ARM寄存器详解] ARM寄存器(37个) 通用寄存器(31个) 1.未分组通用寄存器(R0-R7) 2.分组通

ARM之工作模式

前言            以下内容是个人学习之后的感悟,转载请注明出处~ ARM工作模式 ARM工作模式根据功能不同,可分为7类: User Mode:用户模式.操作系统的Task一般以这种模式执行.User Mode是ARM唯一的非特权模式,这表示如 果CPU处于这种模式下,很多指令将不能够执行,因此操作系统的资源得以保护. System Mode:这是V4及其以上版本所引入的特权模式. IRQ Mode:中断模式.中断(不包括软中断)处理函数在这种模式下执行. FIQ Mode:快速中断模