📄 arm应用系统开发详解全集.txt
字号:
2、在子程序入口处使用以下指令将R14存入堆栈:
STMFD SP!,{<Regs>,LR}
对应的,使用以下指令可以完称子程序返回:
LDMFD SP!,{<Regs>,PC}
R14也可作为通用寄存器。
程序计数器PC(R15)
寄存器R15用作程序计数器(PC)。在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb
状态下,位[0]为0,位[31:1]用于保存PC;虽然可以用作通用寄存器,但是有一些指令在使用R15
时有一些特殊限制,若不注意,执行的结果将是不可预料的。在ARM状态下,PC的0和1位是0,在Thumb
状态下,PC的0位是0。
R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违
反了这些限制时,程序的执行结果是未知的。
由于ARM 体系结构采用了多级流水线技术,对于ARM 指令集而言,PC 总是指向当前指令的
下两条指令的地址,即PC 的值为当前指令的地址值加8 个字节。
图2.3 ARM状态下的寄存器组织
在ARM状态下,任一时刻可以访问以上所讨论的16个通用寄存器和一到两个状态寄存器。在非
用户模式(特权模式)下,则可访问到特定模式分组寄存器,图2.3说明在每一种运行模式下,哪
一些寄存器是可以访问的。
寄存器R16:
----------------------- 页面 18-----------------------
ARM 应用系统开发详解──基于S3C4510B 的系统设计 5
寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在
任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些
相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR (Saved Program Status
Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时
则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果
是未知的。
2.5.2 Thumb 状态下的寄存器组织
Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器
(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。同时,在每一种特
权模式下都有一组SP、LR和SPSR。图2.4表明Thumb状态下的寄存器组织。
图2.4 Thumb状态下的寄存器组织
Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系:
─ Thumb状态下和ARM状态下的R0~R7是相同的。
─ Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的。
─ Thumb状态下的SP对应于ARM状态下的R13。
─ Thumb状态下的LR对应于ARM状态下的R14。
─ Thumb状态下的程序计数器对应于ARM状态下R15
以上的对应关系如图2.5所示:
----------------------- 页面 19-----------------------
ARM 应用系统开发详解──基于S3C4510B 的系统设计 6
图2.5 Thumb状态下的寄存器组织
访问THUMB状态下的高位寄存器(Hi-registers):
在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分,但可使用汇编语言程序受
限制的访问这些寄存器,将其用作快速的暂存器。使用带特殊变量的MOV指令,数据可以在低位寄
存器和高位寄存器之间进行传送;高位寄存器的值可以使用CMP和ADD指令进行比较或加上低位寄存
器中的值。
2.5.3 程序状态寄存器
ARM体系结构包含一个当前程序状态寄存器 (CPSR)和五个备份的程序状态寄存器 (SPSRs)。
备份的程序状态寄存器用来进行异常处理,其功能包括:
─ 保存ALU中的当前操作信息
─ 控制允许和禁止中断
─ 设置处理器的运行模式
程序状态寄存器的每一位的安排如图2.6所示:
图2.6 程序状态寄存器格式
条件码标志(Condition Code Flags)
----------------------- 页面 20-----------------------
ARM 应用系统开发详解──基于S3C4510B 的系统设计 7
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可
以决定某条指令是否被执行。
在ARM状态下,绝大多数的指令都是有条件执行的。
在Thumb状态下,仅有分支指令是有条件执行的。
条件码标志各位的具体含义如表2-1所示:
表2-1 条件码标志的具体含义
标志位 含 义
N 当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正
数或零;
Z Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;
C 可以有4 种方法设置C 的值:
─ 加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
─ 对于包含移位操作的非加/减运算指令,C 为移出值的最后一位。
─ 对于其他的非加/减运算指令,C 的值通常不改变。
V 可以有2种方法设置V 的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1 表示符号
位溢出。
─ 对于其他的非加/减运算指令,C 的值通常不改变。
Q 在ARM v5 及以上版本的E 系列处理器中,用Q 标志位指示增强的DSP 运算指令是否发生了溢出。
在其他版本的处理器中,Q 标志位无定义。
控制位
PSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处
理器运行特权模式,这些位也可以由程序修改。
─ 中断禁止位I、F:
I=1 禁止IRQ中断;
F=1 禁止FIQ中断。
─ T标志位:该位反映处理器的运行状态。
对于ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,
否则运行于ARM状态。
对于ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令以引起
为定义的指令异常;当该位为0时,表示运行于ARM状态。
─ 运行模式位M[4:0]:M0、M1、M2、M3、M4是模式位。这些位决定了处理器的运行模式。
具体含义如表2-2所示:
表2-2 运行模式位M[4:0]的具体含义
M[4:0] 处理器模式 可访问的寄存器
0b10000 用户模式 PC,CPSR,R0-R14
0b10001 FIQ 模式 PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0
0b10010 IRQ 模式 PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0
0b10011 管理模式 PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0,
0b10111 中止模式 PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0,
0b11011 未定义模式 PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0,
0b11111 系统模式 PC,CPSR (ARM v4 及以上版本), R14~R0
由表2-2 可知,并不是所有的运行模式位的组合都是有效地,其他的组合结果会导致处理器进
入一个不可恢复的状态。
保留位
----------------------- 页面 21-----------------------
ARM 应用系统开发详解──基于S3C4510B 的系统设计 8
PSR中的其余位为保留位,当改变PSR中的条件码标志位或者控制位时,保留位不要被改变,
在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。
2.6 异常(Exceptions)
当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处
理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处
理器允许多个异常同时发生,它们将会按固定的优先级进行处理。
ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念
并不完全等同。
2.6.1 ARM 体系结构所支持的异常类型
ARM体系结构所支持的异常及具体含义如表2-3所示。
表2-3 ARM 体系结构所支持的异常
异常类型 具体含义
复位 当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。
未定义指令 当ARM 处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用
该异常机制进行软件仿真。
软件中断 该异常由执行SWI 指令产生,可用于用户模式下的程序调用特权操作指令。可使
用该异常机制实现系统功能调用。
指令预取中止 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理
器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据
中止异常。
IRQ (外部中断请求) 当处理器的外部中断请求引脚有效,且CPSR 中的I 位为0 时,产生IRQ 异常。系
统的外设可通过该异常请求中断服务。
FIQ (快速中断请求) 当处理器的快速中断请求引脚有效,且CPSR 中的F 位为0 时,产生FIQ 异常。
2.6.2 对异常的响应
当一个异常出现以后,ARM微处理器会执行以下几步操作:
1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置
重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC
+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这
样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令 MOV PC,
R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
2、将CPSR复制到相应的SPSR中。
3、根据异常类型,强制设置CPSR的运行模式位。
4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到
ARM状态。
ARM微处理器对异常的响应过程用伪码可以描述为:
R14_<Exception_Mode> = Return Link
SPSR_<Exception_Mode> = CPSR
CPSR[4:0] = Exception Mode Number
----------------------- 页面 22-----------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -