资源描述
第一章 ARM概述及其基本编程模型
ARM芯片具有RISC体系的一般特点,如:
l 具有大量的寄存器
l 绝大多数操作都在寄存器中进行,通过Load/Store的体系在内存和寄存器之间进行数据传递
l 寻址方式简单
l 采用固定长度的指令格式
除此之外,ARM体系采用了一些特殊的技术,在保证高性能的同时尽量减少芯片体积,减低芯片的功耗,这些技术包括:
l 在同一条数据处理指令中包含算术逻辑处理单元和移位处理
l 使用地址自动增加(减少);来优化程序中循环处理
l Load/Store指令可以批量传输数据,从而提高数据传输的效率
l 所有指令都可以根据前面指令执行的结果,决定是否执行,以提高指令执行的效率
1.2 ARM体系结构的版本及命名方法
迄今为止,ARM体系结构共定义了6个版本,版本号分别为1~6.从版本1到版本6,ARM体系的指令功能不断扩大,同时,各版本中还有一些变种,这些变种定义了该版本指令集中不同的功能。ARM处理器系类中的各种处理器,其采用的实现技术各不相同,性能差别很大,应用场合也有所不同,但是只要它们支持相同的ARM体现版本,基于它们的应用软件将是兼容的。
1.2.1 ARM体系结构的版本
1. 版本1
本版本在ARM1中实现,但没有在商业产品中使用。它包括下列指令:
l 处理乘法指令之外的基本数据处理指令
l 基于字节,字,多字的读取和写入指令(Load/Store)
l 包括子程序调用指令BL在内的跳转指令
l 供操作系统使用的软件中断指令SWI
本版本中地址空间是26位,目前已经不再使用
2. 版本2
与版本1相比,版本2增加了下列指令:
l 乘法指令和乘加法指令
l 支持协处理器的指令
l 对于FIQ模式,提供了额外的两个备份寄存器
l SWP指令及SWPB指令
本版本中地址空间是26位,目前已经不再使用
3. 版本3
版本3较以前的版本发生了比较大的变化。主要改进部分如下:
l 处理器的地址空间扩展到了32位,但除了版本3G外的其他版本是向前兼容的,支持26位的地址空间。
l 当前程序状态信息从原来的R15寄存器移到一个新的寄存器中,新的寄存器名字为CPSR(Current Program Status Register,当前状态寄存器)
l 增加了SPSR(Saved Program Status Register,备份的程序状态寄存器),用于在程序异常中断程序时,保存被中断的程序的程序状态
l 增加了两种处理器模式,使操作系统代码可以方便地使用数据访问中止异常,指令预取中止异常和未定义指令异常
l 增加了指令MRS和指令MSR,用于访问CPSR寄存器和SPSR寄存器
l 修改了原来的从异常中返回的指令
4. 版本4
与版本3相比,版本4增加了下列指令:
l 半字的读取和写入指令
l 读取(Load)带符号的字节和半字数据的指令
l 增加了T变种,可以使处理器状态切换到Thumb状态,在该状态下指令集是16位的Thumb指令集
l 增加了处理器的特权模式。在该模式下,使用的是用户模式下的寄存器。
另外,在版本4中明确定义了哪些指令会引起未定义指令异常。版本4不再强调要求与以前的26位地址空间兼容。
5. 版本5
与版本4相比,版本5增加或者修改了下列指令:
l 提高了T变种中ARM/Thumb混合使用的效率
l 对于T变种的指令和非T变种的指令使用相同的代码生成技术
同时,版本5还具有以下的特点
l 增加了前导零指令,该指令可以使整数除法和中断优先级排队操作更为有效
l 增加了软件断点指令
l 为协处理器设计提供更多的可选择的指令
l 更加严格的定义了乘法指令对条件标志位的影响
6. 版本6
ARM体系版本6是2001年发布的。其主要特点是增加了SIMD功能扩展。它适合使用电池供电的高性能便携式设备。这些设备一方面需要处理器提供高性能,另一方面又需要功耗很低。SIMD功能扩展为包括音频/视频处理在内的应用系统提供了优化功能。它可以使音频/视频处理性能提高4倍。
ARM体系版本6首先在2002年春季发布的ARM11处理器中使用
1.2.2 ARM体系的变种
这里将某种特定功能称为ARM体系的某种变种,例如支持Thumb指令集称为T变种。目前ARM定义了一些变种。
1、Thumb指令集(T变种)
Thumb指令集是将ARM指令集的一个子集重新编码 而形成的一个指令集。ARM指令长度为32位,Thumb指令长度为16位。这样,使用Thumb指令集得到密度更高的代码,这对于需要严格控制成本的设计是非常有意义的。
与ARM指令集相比,Thumb指令集具有以下局限:
l 完成相同的操作,Thumb指令通常需要更多的指令。因此,在对系统运行时间要求苛刻的应用场合,ARM指令集更为合适。
l Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断的低级处理时,his需要使用ARM指令。这种限制决定了Thumb指令需要和ARM指令配合使用。对于支持Thumb指令的ARM体系版本,使用符号T来表示
目前Thumb指令集具有以下两个版本:
l Thumb指令集版本1 本版本用于ARM体系版本4的T变种。
l Thumb指令集版本2 本版本用于ARM体系版本5的T变种
与版本1相比,Thumb指令集的版本2具有以下特点:
l 通过增加指令和对已有指令的修改,提高ARM指令和Thumb指令混合使用时的效率
l 增加了软件断点指令
l 更加严格地定义了Thumb乘法指令对条件标志位的影响
这些特点和ARM体系版本4到版本5进行的扩展密切相关。实际上,通常并不使用Thumb版本号,而是使用相应的ARM版本号。
2、Thumb指令集(T变种)
M变种增加了两条用于进行长乘法操作的ARM指令。其中一条指令用于实现32为整数乘以32位整数,生成64位整数的长乘法操作;另一条指令用于实现32位整数乘以32位整数,然后加上32位整数,生成64位整数的长乘加操作。在需要这种长乘法的应用场合M变种很适合
然而,在有些应用场合中,乘法操作的性能并不重要,但对于尺寸要求很苛刻,在系统实现时就不合适增加M变种的功能。
M变种首先在ARM体系版本3中加入。如果没有上诉的设计方面的限制,在ARM体系版本4以及其后的版本中,M变种是系统的标准部分。对于支持长乘法ARM指令的ARM体系版本,使用字符M来表示。
3、增强型DSP指令(E变种)
E变种包含了一些附加的指令,这些指令用于增强处理器对一些典型的DSP算法的处理性能。主要包括:
l 几条新的实现16位数据乘法和乘加法操作的指令
l 实现饱和的带符号的加减法操作的指令。所谓饱和的加减法操作是在加减法操作溢出时,结果并不进行卷绕,而是使用最大的整数或者最小的负数来表示。
l 进行双字数据操作的指令,包括双字读取指令LDRD,双字写入指令STRD和些处理器的寄存器传输指令MCRR/MRRC.
l Cache预取指令PLD
E变种首先在ARM体系版本5T中使用,用符号E表示。在ARM体系版本5以前的版本中,以及在非M变种和非T变种的版本中,E变种是无效的。
在早期的一些E变种中,未包含双字的读取指令LDRD,双字的写入指令STRD,协处理器的寄存器传输指令MCRR/MRRC以及cache预取指令PLD。这种E变种记作ExP,其中x表示缺少,P代表上诉的集中指令。
4、Java加速器Jazelle(J变种)
ARM的Jazelle技术将Java的优势和先进的32位RISC芯片完美的结合在一起。Jazelle技术提供了Java加速功能,可以得到比普通Java虚拟机高得多的性能。与普通的Java虚拟机相比,Jazelle使Java运行速度提高了8倍,而功耗降低了80%。
Jazelle技术使得程序员可以在一个单独的处理器上同时运行Java应用程序,已经建立好的操作系统,中间件以及其他的应用程序。与使用协处理器和双处理器相比,使用单独的处理器可以在提高性能的同时,保证低功耗和低成本。
J变种首先在ARM体系版本4TEJ中使用,用符号J表示J变种。
5、ARM媒体功能扩展(SIMD变种)
ARM媒体功能扩展为嵌入式应用系统提供了高性能的音频/视频处理技术。
新一代的Internet应用系统,移动电话和PDA等设备需要提供高性能的流式媒体,包括音频和视频等;而且这些设备需要提供更加人性化的界面,包括语音识别和手写输入识别等。这样,就要求处理器能够提供很强的数字信号处理能力,同时还必须保持低功耗,以延长电池的使用时间。ARM的SIMD媒体功能扩展就为这些应用系统提供了解决方案。它为包括音频/视频处理在内的应用系统提供了优化功能,它可以使音频/视频处理性能提高4倍。主要特点如下:
l 将音频/视频处理能力提高了2~4倍
l 可以同时进行两个26位操作数或者4个8位操作数的运算
l 提供了小数算术运算
l 用户可以定义饱和运算的模式
l 两套16位操作数的乘加/乘减运算
l 32位乘以32位小数MAC
l 同时8位/16位选择操作
它的主要应用领域包括:
l Internet应用系统
l 流式媒体应用系统
l MPEG4编码/解码系统
l 语音和手写输入识别
l FFT处理
l 复杂的算术运算
l Viterbi处理。
1.2.3 ARM/Thumb体系版本的命名格式
表示ARM/Thumb体系版本的字符串是由下面几部分组成的:
l 字符串ARMv
l ARM指令集版本号。目前是1~6的数字字符
l 表示变种的字符。由于在ARM体系版本4以后,M变种成为系统的标准功能,字符M通常不需要列出来。
l 使用字符x表示排除某种写功能。比如,在早期的一些E变种中,未包含双字读取指令LDRD,双字写入指令STRD,协处理器的寄存器传输指令MCRR/MRRC以及cache预取指令PLD。这种E变种记作ExP,其中x表示缺少,P代表上诉的几种指令。
目前有效的ARM/Thumb体系版本名称以及其含义如表1.1和表1.2中所列。这些名称描述了各版本的具体特点。
表1.1 目前有效的ARM/Thumb体系版本名称及其含义
名称 ARM指令集版本号 Thumb指令集版本号 M变种 E变种
ARMv3 3 无 否 否
ARMv3M 3 无 是 否
ARMv4xM 4 无 否 否
ARMv4 4 无 是 否
ARMv4TxM 4 1 否 否
ARMv4T 4 1 是 否
ARMv5xM 5 无 否 否
ARMv5 5 无 是 否
ARMv5TxM 5 2 否 否
ARMv5T 5 2 是 否
ARMv5TexP 5 2 是 处理LDRD
MCRR,MRRC
PLD,STRD指令 外的指令
ARMv5TE 5 2 是 是
表1.2 目前有效的ARM/Thumb体系版本名称以及含义(续)
名称 T变种 E变种 J变种 SIMD变种
ARMv5TEJ 是 是 是 否
ARMv6 是 是 是 是
1.3 ARM处理器系列
ARM处理器目前包括下面的几个系列的处理器产品已经其他厂商实现的基于ARM体系结构的处理器。
l ARM7系列
l ARM9系列
l ARM9E系列
l ARM10E系列
l SecurCore系列
l Intel的Xscale
l Inter的StrongARM
这些处理器最高主频达到了800MIPS,功耗数量级为Mw/MHz。对于支持同样ARM体系版本的处理器,其软件是兼容的。这些处理器广泛应用于以下领域:
l 开放应用平台 包括无线系统,消费产品以及成像设备等
l 实现嵌入式应用 包括存储设备,汽车,工业和网络设备
l 安全系统 包括信用卡和SIM卡
1.3.1 ARM7系列
ARM7系列处理器是低功耗的32位RISC处理器。它主要用于对功耗和成本要求比较苛刻的消费类产品。其最高主频可以达到130MIPS。ARM7系列处理器支持16位的Thumb指令集,使用Thumb指令集可以以16位的系统开销得到32位的系统性能。
ARM7系列包括ARM7TDMI,ARM7TDMI-S,ARM7EJ-S和ARM720T 4种类型,主要用于适应不同的市场需求。
ARM7系类处理器具体应用于以下场合:
l 个人音频设备(MP3播放器,WMA播放器,AAC播放器)
l 接入级的无线设备
l 喷墨打印机
l 数字照相机
l PDA
ARM7系类处理器觉有以下主要特点:
l 成熟的大批量的32位RISC芯片
l 最高主频达到130MIPS
l 功耗很低
l 代码密度很高,兼容16位的微处理器
l 得到广泛的操作系统和实时操作系统支持,包括windows CE,Palm OS,Symbian OS,Linux 以及业界领先的实时操作系统。
l 众多的开发工具
l EDA仿真模型
l 优秀的调试机制
l 业界众多领先的IC制造商生产这类芯片
l 提供0.25um,0.18um,及0.13um的生产工艺
l 代码与ARM9系类,ARM9E,ARM10E兼容。
1.3.2 ARM9系列
ARM9系列处理器使用ARM9TDMI处理器核,其中包含了16位的Thumb指令集。使用Thumb指令集可以以16位的系统开销得到32位的系统性能。
ARM9系列包括ARM920T,ARM922T和ARM940T 三种类型,用于适应不同的市场需求。
ARM9系列处理器具体应用在以下场合:
l 下一代的无线设备,包括视频电话和PDA等
l 数字消费品,包括机顶盒,家庭网关,MP3播放器和MPEG4播放器等
l 成像设备,包括打印机,数字照相机和数字摄像机等。
l 汽车,通信和信息系统
ARM9E系列处理器具有以下主要特点:
l 支持32位的ARM指令集和16位的Thumb指令集的32位RISC处理器
l 五级整数流水线
l 单一的32位AMBA总线接口
l MMU支持Window CE,Palm OS,Symbian OS,Linux等
l MPU支持实时操作系统,包括Vxworks
l 统一的数据cache和指令cache
l 提供0.18um,0.15um及0.13um的生产工艺
1.3.3 ARM9E系列
ARM9E系列处理器使用单一的处理器内核提供了微控制器,DSP,Java应用系统的解决方案,从而极大的减小了芯片的大小以及复杂程度,降低了功耗,缩短了产品面世时间。ARM9E系列处理器提供了增强的DSP处理能力,非常适合那些需要同时使用DSP和微控制器的应用场合。其中的ARM926EJ-S包含了Jazelle技术,可以通过硬件直接运行Java代码,提高了系统运行Java代码的性能。
ARM9E系列包括ARM926EJ-S,ARM946E-S和ARM966E-S 三种类型,用于适应不同的市场需求。
ARM9E系列处理器具体应用在以下场合:
l 下一代的无线设备,包括视频电话和PDA等
l 数字消费品,包括机顶盒,家庭网关,MP3播放器和MPEG4播放器等
l 成像设备,包括打印机,数字照相机和数字摄像机等。
l 存储设备,包括DVD和HDD等
l 工业控制,包括马达控制和能量控制等
l 汽车,通信和信息系统的ABS和车体控制等
l 网络设备,包括VoIP,WirelessLAN,xDSL等
ARM9E系列处理器具有以下主要特点:
l 支持32位的ARM指令集和16位的Thumb指令集的32位RISC处理器
l 包括了DSP指令集
l 五级整数流水线
l 在典型的0.13um工艺下,主频可以达到300MIPS的性能
l 集成的实时跟踪和调试功能
l 单一的32位AMBA总线接口
l 可选的VFP9浮点处理协处理器
l 在实时控制和三维图像处理时主频可达到215MFLOPS
l 高性能的AHB系统
l MMU支持Window CE,Palm OS,Symbian OS,Linux等
l MPU支持实时操作系统,包括Vxworks
l 统一的数据cache和指令cache
l 提供0.18um,0.15um及0.13um的生产工艺
1.3.4 ARM10E系列
ARM10E系列处理器有高性能和低功耗的特点。它所采用的新的体系使其在所有ARM产品中具有最高的MIPS/MHz。ARM10E系列处理器采用了新的节能模式,提供了64位的读取/写入(Load/Store)体系,支持包括向量操作的满足IEEE754的浮点运算协处理器,系统集成更加方便,拥有完整的硬件和软件可开发工具。
ARM10E系列包括ARM1020E,ARM1022E,ARM1026EJ-S 三种类型,主要用于适应不同的市场需求。
ARM10E系列处理器具体应用于以下场合:
l 下一代的无线设备,包括视频电话,PDA,笔记本电脑和Internet设备等
l 数字消费品,包括机顶盒,家庭网关,MP3播放器和MPEG4播放器等
l 成像设备,包括激光打印机,数字照相机和数字摄像机等
l 工业控制,包括马达控制和能量控制等
l 汽车,通信和信息系统等
ARM10E系列处理器具有以下主要特点:
l 支持32位的ARM指令集和16位的Thumb指令集的32位RISC处理器。
l 包括了DSP指令集
l 六级整数流水线
l 在典型的0.13um工艺下,主频可以达到400MIPS的性能
l 单一的32位AMBA总线接口
l 可选的VFP10浮点处理协处理器
l 在实时控制和三维图像处理时主频可达到650MFLOPS
l 高性能的AHB系统
l MMU支持window CE,Palm OS,Symbian OS,Linux等
l 统一的数据cache和指令cache
l 提供0.18um,0.15um,0.13um的生产工艺
l 并行读取/写入部件
1.3.5 SecurCore系列
SecurCore系列处理器提供了基于高性能的32位RISC技术的安全解决方案。SecurCore系列处理器具有体积小,功耗低,代码密度大和性能高等特点外,还具有它自己的特别优势,即提供了安全解决方案的支持。SecurCore系列处理器具有以下特点:
l 支持ARM指令集和Thumb指令集,以提高代码密度和系统性能。
l 采用软内核技术,以提供最大限度的灵活性,以及防止外部对其进行扫描探测。
l 提供了安全特性,抵制攻击
l 提供面向智能卡的和低成本的存储保护单元MUP
l 可以集成用户自己的安全特性和其他的协处理器
SecurCore系列包括SecurCore SC100,SecurCore SC110,SecurCore SC200和SecurCore SC210 四种类型,主要用于适应不同的市场需求。
SecurCore系列处理器主要应用于一些安全产品及应用系统,包括电子商务,电子银行业务,网络,移动媒体和认证系统等。
1.4 ARM处理器系列
ARM共有7种运行模式,如表1.3所示。
表1.3 ARM处理器的7种运行模式
处理器模式 描述
用户模式 正常程序执行的模式
快速中断模式 用于告诉数据传输和通道处理
外部中断模式 用于通常的中断处理
特权模式 供操作系统使用的一种保护模式
数据访问中止模式 用于虚拟存储及存储保护
未定义指令中止模式 用于支持通过软件仿真硬件的协处理器
系统模式 用于运行特权级的操作系统任务
除了用户模式之外的其他6种处理器模式称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中除系统模式外,其他5种特权模式又称为异常模式。
处理器模式可以通过软件控制进行切换,也可以通过外部中断或者异常处理过程进行切换。大多数的用户程序运行在用户模式下。这时,应用程序不能够访问一些受操作系统保护的系统资源。应用程序也不能直接进行处理器模式的切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常陌生中都有一组寄存器,供相应的异常处理程序使用,这样就可以保护在进入异常模式时,用户模式下的寄存器不被破坏。
系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所有的胸资源,也可以直接进行处理器模式切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
1.5 ARM寄存器介绍
ARM处理器共有37个寄存器。其中包括:
l 31个通用寄存器,包括程序计数器(PC)在内,这些寄存器都是32位寄存器
l 6个状态寄存器。这些寄存器都是32位寄存器,但目前只适用了其中12位。
ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14),一个或者两个状态寄存器及程序计数器。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。表1.4列出了各处理器模式下可见的寄存器情况。
表1.4 各种处理器模式下的寄存器
用户模式 系统模式 特权模式 中止模式 未定义指令模式 外部中断模式 快速中断模式
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 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 PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_FIQ
1.5.1 通用寄存器
通用寄存器可以分为下面3类:
l 未备份的寄存器,包括R0~R7
l 备份寄存器,包括R8~R14
l 程序计数器PC,即R15
1、未备份寄存器
未备份寄存器包括R0~R7,对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。
2、备份寄存器
对于备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_FIQ,R9_FIQ;当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_usr,R9_usr等。在这两种情况下使用的是不同的物理寄存器,系统没有将这几个寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。
对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式下和系统模式共用的;另外5个对应的其他5种处理器模式。采用下面的记号来区分各个物理寄存器:
R13_<mode>
其中<mode>可以是下面几种模式之一:usr,svc,abt,und,irq及fiq
寄存器R13在ARM中常用作栈指针。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针,而在Thumb指令集中,有一些指令强制性的使用R13作为栈指针。
每一种异常模式拥有自己的物理的R13.应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常模式处理程序时,将保存在R13所指的栈中的寄存器值弹出,这样就使异常处理程序不会被破坏其中断程序的运行现场。
寄存器R14又被称为连续寄存器,在ARM体系中具有下面两种特殊作用:
l 每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中是,子程序即返回。可以通过下面两种方式实现这种子程序的返回操作。
u 执行下面任何一条指令:
mov PC,LR
bx LR
u 在子程序入口使用下面的指令将PC保存到栈中
stmfd SP!,{<registers>,LR}
相应的,下面的指令可以实现子程序的返回:
jdmfd SP!,{<registers>,PC}
l 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。
R14寄存器也可以作为通用寄存器使用。
3、程序计数器R15
程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些限制。当违反了这些限制时,该指令执行的结果将是不可预料的。
由于ARM采用的流水线机制,当正确读取了PC的值时,该值为当前指令地址值加一个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第1位总是为0。
需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体的设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STR/STM指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种实现方式。假设R0指向可用的一个内存字,下面的代码可以在R0指向的内存字中返回该芯片所采用的地址偏移量
sub R1,PC,#4
STR PC,[R0]
LDR R0,[R0]
SUB R0,R0,R1
在上面的讨论中,都是针对指令返回的值。该值并非在指令读取期间出现在数据总线上的值。在指令读取期间出现在数据总线上的值取决于芯片的具体实现方式。
当成功的像R15中写入一个地址数值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的地址应该满足bits[1:0]=0b00,具体要求ARM各版本有所不同:
l 对于ARM版本3以及更低的版本,写入R15地址值的bits[1:0]被忽略,即写入R15的地址值将与0xFFFFFFFC做与操作。
l 对于ARM版本4以及更高版本,程序必须保证写入R15寄存器的地址值bits[1:0]为0b00;否则将会产生不可预知的结果。
对于Thumb指令来说,指令是半字对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0xfffffffe做与操作,再写入R15中。
还有一些指令对于R15的用法有一些特殊的要求,比如指令BX利用bit[1]来确定是ARM指令,还是Thumb指令。
这种读取PC值和写入PC值的不对称操作需要特别注意。这一点在以后的章节还会介绍。如指令MOV PC,PC将程序跳转到当前指令下面的第2条指令处执行。因为指令中,第二个PC寄存器读出的值为当前指令的地址加8,这样对于这样ARM指令而言写入PC寄存器的是当前指令下面的第2条指令的地址。类似的指令还有ADD PC,PC,#0。
1.5.3 程序状态寄存器
CPSR可以在任何处理器模式下被访问。它包含了条件标志位,中断禁止位,当前处理器模式标志位以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR重保存的值来恢复CPSR。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或者系统模式中访问SPSR,将会产生不可预知的结果。
CPSR的格式如下所示,SPSR格式与CPSR格式相同。
N
Z
C
V
Q
DNM(RAZ)
I
F
T
M4
M3
M2
M1
M0
1、 条件标志位
N,Z,C,及V统称为条件标志位,大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性的执行。各条件标志位的具体含义如表1.5所示。
表1.5 CPSR中的条件标志位
标志位 含义
N 本位设置成当前指令运算结果的bit[31]的值
当两个补码表示的有符号整数运算时,N=1表示运算结果为负数;N=0表示结果为正数或者零
Z Z=1表示的结果为零;Z=0表示的运算结果不为零。
C 下面分四种情况讨论C的设置方法:
在加法指令中(包括)比较指令CMN,当结果产生了进位,则C=1,表示无符号数运算发生了溢出,其他情况下C=0
在减法指令中(包括比较指令CMP),当运算中发生借位,则C=0,表示无符号数运算发生溢出,其他情况下C=1
对于包含移位操作的非加减运算指令,C中包含最后一次被溢出的数值
对于其他非加减运算指令,C位的值通常不受影响
V 对于加减运算指令,当操作室和运算结果为二进制的补码表示的带符号数
时,V=1表示符号位溢出
通常情况下其他指令不影响V位,具体可参考各指令的说明
以下指令会影响CPSR中的条件标志位:
l 比较指令,如CMP,CMN,TEQ和TST等。
l 当一些算术指令和逻辑指令的目标寄存器不受R15时,这些指令会影响CPSR中的条件标志位
l MSR指令向CPSR/SPSR中写入新值
l MRC指令将R15作为目标寄存器时,可以把协处理器产生的条件标志位的值送到ARM处理器
l 一些LDM指令的变种指令可以将SPSR的值复制到CPSR中,这种操作主要用于异常中断程序中返回
l 一些带“位”的算术和逻辑指令的变种指令,也可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回
2、 Q标志位
在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出。同样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
在ARMv5以前的版本及ARMv5的非E系列的处理器中,Q标志位没有被定义。CPSR的bit[27]属于DNM(RAZ)
3、 CPSR中的控制位
CPSR的低8位I,F,T,及M[4:0]统称为控制位。当异常发生中断时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位
l 中断禁止位
n 当I=1时禁止IRQ中断
n 当F=1时禁止FIQ中断
l T控制位
T控制位用于控制指令执行的状态,即说明本指令是ARM指令,还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义不同
对于ARMv3以及更低版本的ARMv4的非T系列版本的处理器,没有ARM状态和Thumb状态切换,T控制位应为0
对于ARMv4以及更高版本的T系列的ARM处理器,T控制位含义如下:
u T=0表示执行ARM指令
u T=1表示执行Thumb指令
对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位含义如下:
u T=0表示执行ARM指令
u T=1表示强制下一条执行的指令产生未定义指令中断
l M控制位
控制位M[4:0]控制位处理器模式,具体含义如表1.6所示。
表1.6 控制位M[4:0]的含义
M[4:0] 处理器模式 可访问的寄存器
0b10000 User PC,R14~R0,CPSR
0b10001 FIQ PC,R14_ fiq ~R8_ fiq,R7~R0,CPSR,SPSR_fiq
0b10010 IRQ PC,R14_ irq ~R13_irq,R12~R0,CPSR,SPSR_ irq
0b10011 Supervisor PC,R14_ svc ~R13_ svc,R12~R0,CPSR,SPSR_ svc
0b10111 Abort PC,R14_ abt ~R13_ abt,R12~R0,CPSR,SPSR_ abt
0b11011 Undefined PC,R14_ und ~R13_ und,R12~R0,CPSR,SPSR_ und
0b11111 Systerm PC,R14~R0,CPSR(ARMv4及更高版本)
4、 CPSR的其他位
CPSR中的其他位用于将来ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展的冲突。
1.6 ARM体系的异常中断
在ARM体系中通常有以下3种方式控制程序的执行流程:
l 在正常程序执行过程中,没执行一条ARM指令,程序计数器的值加4个字节,每执行一条Thumb指令,程序计数器的值加两个字节。整个过程是按顺序执行
l 通过跳转指令,程序可以跳转到特定的地址
展开阅读全文