ARM 架构还采用了一些特别的技术,在保证性能的前提下尽量缩小芯片的面积,并降低功耗:
所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。
可用加载/存储指令连续传输数据,以提高数据的传输效率。
可在一条数据处理指令中同时完成逻辑处理和移位处理。
在循环处理中使用地址的自动增减来提高执行效率。
2.5.1 RISC架构
传统的CISC(Complex Instruction Set Computer,复杂指令集计算机)结构有其固有的缺点,即随着计算机技术的发展而不断引入新的复杂指令集,为支持这些新增的指令,计算机的架构会越来越复杂,然而,在CISC指令集中的各种指令中,其使用频率却相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%,显然,这种结构是不太合理的。基于以上的不合理性,1979年美国加州大学伯克利分校提出了RISC(Reduced Instruction Set Computer, 精简指令集计算机)的概念,RISC 并非只是简单地去减少指令,而是把着眼点放在了如何使计算机的结构更加简单合理地提高运算速度上。RISC结构优先选取使用频最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻地方式种类减少;以控制逻辑为主,不用或少用微码控制指令等措施来达到上述目的。到目前为止,RISC 架构也还没有严格的定义,一般认为,RISC 架构应具有如下特点:
采用固定长度的指令格式,指令归整、简单、基本寻址方式有2∼3 种。
使用单周期指令。
大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储
指令可以存取内存,以提高指令的执行效率。
当然,和CISC 架构相比较,尽管RISC 架构有上述的优点,但决不能认为RISC 架构就可以取代CISC 架构,事实上,RISC 和CISC 各有优势,而且界限并不那么明显。现代的CPU 往往采用CISC 的外围,内部加入了RISC 的特性,如超长指令集CPU 就是融合了RISC 和CISC 的优势,成为未来的CPU 发展方向之一。
ARM处理器共有37个寄存器。些寄存器包括:
31 个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。
6 个状态寄存器,用以标识CPU 的工作状态及程序的执行状态,均为32 位,目前只使用了其中的12位。
ARM处理器有7 种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与之对应。在任意一种处理器模式下,可存取的寄存器包括15个通用寄存器(R0∼R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在7 种处理器模式下共享的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。关于ARM 处理器的寄存器结构,在后面的相关章节将会详细描述。
ARM微处理器的在较新的架构中支持两种指令集:ARM指令集和Thumb 指令集。其中,ARM指令为32 位,Thumb指令为16位。Thumb 指令集为ARM 指令集的功能子集,但与等价的ARM 程序代码相比较,可节省30%∼40%以上的存储空间,同时具备32 位程序代码的所有优点。关于ARM 处理器的指令结构,在后面的相关章节将会详细描述。
从前面所介绍的内容可知,ARM微处理器包含一系列的核心结构,以适应不同的应用领域,用户如果希望使用WinCE或标准Linux等操作系统以减少软件开发时间,就需要选择ARM720T 以上带有MMU(Memory Management Unit)功能的ARM 芯片,ARM720T、ARM920T、ARM922T、ARM946T、Strong-ARM都带有MMU 功能。而ARM7TDMI 则没有MMU,不支持Windows CE 和标准Linux,但目前有uCLinux 等不需要MMU 支持的操作系统可执行于ARM7TDMI硬件平台之上。事实上,uCLinux 已经成功移植到多种不带MMU 的微处理器平台上,并在稳定性和其它方面都有上佳表现。
系统的工作频率在很大程度上决定了ARM 微处理器的处理能力。ARM7 系列微处理器的典型处理速度为0.9MIPS/MHz,常见的ARM7 芯片系统主时钟为20MHz-133MHz,ARM9系列微处理器的典型处理速度为1.1MIPS/MHz,常见的ARM9的系统主时脉频率为100MHz-233MHz,ARM10 最高可以达到700MHz。不同芯片对时钟的处理不同,有的芯片只需要一个主时钟频率,有的芯片内部时钟控制器可以分别为ARM 核心和USB、UART、DSP、音频等功能组件提供不同频率的时脉。
大多数的ARM 微处理器芯片内部存储器的容量都不太大,需要用户在设计系统时外扩内存,但也有部分芯片具有相对较大的芯片内部存储空间,如ATMEL 的AT91F40162 就具有高达2MB 的芯片内部程序存储空间,用户在设计时可考虑选用这种类型,以简化系统的设计。
2.3.7芯片内部外围电路的选择
除ARM 微处理器核以外,几乎所有的ARM 芯片均根据各自不同的应用领域,扩充了相关功能模块,并整合在一个芯片中,我们称之为芯片内部外围电路,如USB 接口、IIS 接口、LCD 控制器、键盘接口、RTC、ADC 和DAC、DSP 辅助处理器等,设计者应分析系统的需求,尽可能采用芯片内部外围电路完成所需的功能,这样既可简化系统的设计,同时提高系统的可靠性。
2.4 选择ARM微处理器
鉴于ARM微处理器的众多优点,随着国内外嵌入式应用领域的逐步发展,ARM 微处理器必然会获得广泛的重视和应用。但是,由于ARM 微处理器有多达十几种的核心结构,几十个芯片生产厂家,以及千变万化的内部功能组合,给开发人员在选择方案时带来一定的困难,所以,对ARM 芯片做一些对比研究是十分必要的。
ARM微处理器的指令集是加载/存储(Load/Store)指令,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统内存的存取则需要透过专门的加载/存储指令来完成。
ARM 微处理器的指令集可以分为跳移指令、数据处理指令、程序状态寄存器(PSR)传输指令、加载/存储指令、协处理器指令和异常中断产生指令六大类,具体的指令及功能如下所示(表中指令为基本ARM指令,不包括衍生的ARM指令)。
表1-1ARM指令和功能描述
|
助记符 |
指令功能描述 |
|
ADC |
带进位加法指令 |
|
ADD |
加法指令 |
|
AND |
逻辑与指令 |
|
B |
跳转指令 |
|
BIC |
位清零指令 |
|
BL |
带返回的跳移指令 |
|
BLX |
带返回和状态切换的跳转指令 |
|
BX |
本章节对ARM 指令集的六大类指令进行详细的描述。
跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程式流程的跳转:
n 使用专门的跳转指令。
n 直接向程序计数器PC 写入跳转地址值。
透过向程序计数器PC 写入跳转地址值,可以实现在4GB 的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性26位地址空间的子程序使用。
ARM 指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4 条指令:
B 跳转指令。
BL 带返回的跳转指令。
BLX 带返回和状态切换的跳转指令。
BX 带状态切换的跳转指令。
B 指令
B 指令的语法为:
B {条件}目标地址
B 指令是最简单的跳转指令。一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是24 位有符号数,左移两位后有符号扩充为32 位,表示的有效偏移为26 位(前后32MB 的地址空间)。
BL 指令
BL 指令的语法为:
BL{条件} 目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以透过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序使用的一个基本但常用的手段。以下指令:
|
BL Label ;当程序无条件跳转到标号Label 处执行时,同时将当前的PC 值保存到R14 中
|
BLX 指令
BLX 指令的语法为:
BLX 目标地址
BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而用户使用ARM 指令集时,可以透过BLX 指令实现子程序的使用和处理器工作状态的切换。同时,子程程序的返回可以透过将寄存器R14 值复制到PC 中来完成。
BX 指令
BX 指令的语法为:
BX{条件} 目标地址
BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb 指令。
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和内存之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR 中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。数据处理指令包括:
MOV 数据传送指令
MVN 数据取反传送指令
CMP 比较指令
CMN 反值比较指令
TST 位测试指令
TEQ 相等测试指令
ADD 加法指令28
ADC 带进位加法指令
SUB 减法指令
SBC 带借位减法指令
RSB 逆向减法指令
RSC 带借位的逆向减法指令
AND 逻辑与指令
ORR 逻辑或指令
EOR 逻辑互斥指令
BIC 位清除指令
1. MOV 指令
MOV 指令的语法为:
MOV{条件}{S} 目的寄存器,来源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数载入到目的寄存器。其中S 选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位的值。
指令范例:
MOV R1,R0 ;将寄存器R0 的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14 的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0 的值左移3 位后传送到R1
2. MVN 指令
MVN 指令的语法为:
MVN{条件}{S} 目的寄存器,源操作数
MVN 指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数载入到目的寄存器。与MOV 指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S 决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位的值。
指令范例:
MVN R0,#0 ;将立即数0 取反传送到寄存器R0 中,完成后R0=-1
3. CMP 指令
CMP 指令的语法为:
CMP{条件} 操作数1,操作数2
CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR 中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1 与操作数2 的关系(大、小、相等),例如,当操作数1 大于操作操作数2,则此后的有GT 后缀的指令将可以执行。
指令范例:
CMP R1,R0 ;将寄存器R1 的值与寄存器R0 的值相减,并根据结果设定CPSR 的标志位
CMP R1,#100 ;将寄存器R1 的值与立即数100 相减,并根据结果设定CPSR 的标志位
4. CMN 指令
CMN 指令的语法为:
CMN{条件} 操作数1,操作数2
CMN 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR 中条件标志位的值。该指令实际完成操作数1 和运算元2 相加,并根据结果更改条件标志位。
指令范例:
CMN R1,R0 ;将寄存器R1 的值与寄存器R0 的值相加,并根据结果设定CPSR 的标志位
CMN R1,#100 ;将寄存器R1 的值与立即数100 相加,并根据结果设定CPSR 的标志位
5. TST 指令
TST 指令的语法为:
TST{条件} 操作数1,操作数2
TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR 中条件标志位的值。操作数1 是要测试的数据,而操作数2 是一个位屏蔽,该指令一般用来测试是否设定了特定的位。
指令范例:30
TST R1,#%1 ;用于测试在寄存器R1 中是否设定了最低位(%表示二进制数)
TST R1,#0xffe ;将寄存器R1 的值与立即数0xffe 按位与,并根据结果设定CPSR 的标志位
6. TEQ 指令
TEQ 指令的语法为:
TEQ{条件} 操作数1,操作数2
TEQ 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的互斥运算,并根据运算结果更新CPSR 中条件标志位的值。该指令通常用于比较操作数1 和操作数2 是否相等。
指令范例:
TEQ R1,R2 ;将寄存器R1 的值与寄存器R2 的值按位互斥,并根据结果设定CPSR 的标志位
7. ADD 指令
ADD 指令的语法为:
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD 指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。
指令范例:
ADD R0,R1,R2 ; R0 = R1 + R2
ADD R0,R1,#256 ; R0 = R1 + 256
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
8. ADC 指令
ADC 指令的语法为:
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC 指令用于把两个操作数相加,再加上CPSR 中的C 条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32 位大的数的加法,注意不要忘记设定S 后缀来更改进位标志。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。以下指令序列完成两个128 位数的加法,第一个数由高到低存放在寄存器R7∼R4,第二个数由高到低存放在寄存器R11∼R8,运算结果由高到低存放在寄存器R3∼R0:
ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二个字,带进位
ADCS R2,R6,R10 ; 加第三个字,带进位
ADC R3,R7,R11 ; 加第四个字,带进位
9. SUB 指令
SUB 指令的语法为:
SUB {条件}{S} 目的寄存器,操作数1,操作数2
SUB 指令用于把操作数1 减去操作数2,并将结果存放到目的寄存器中。运算元1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。
指令范例:
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
10. SBC 指令
SBC 指令的语法为:
SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC 指令用于把操作数1 减去操作数2,再减去CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32 位的减法,注意不要忘记设定S 后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令范例:
SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设定CPSR 的进位标志位32
11. RSB 指令
RSB 指令的语法为:
RSB{条件}{S} 目的寄存器,操作数1,操作数2
RSB 指令称为逆向减法指令,用于把操作数2 减去操作数1,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。指令范例:
RSB R0,R1,R2 ; R0 = R2 – R1
RSB R0,R1,#256 ; R0 = 256 – R1
RSB R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
12. RSC 指令
RSC 指令的语法为:
RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC 指令用于把操作数2 减去操作数1,再减去CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32 位的减法,注意不要忘记设定S 后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令范例:
RSC R0,R1,R2 ; R0 = R2 – R1 - !C
13. AND 指令
AND 指令的语法为:
AND{条件}{S} 目的寄存器,操作数1,操作数2
AND 指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1 的某些位。
指令范例:33
AND R0,R0,#3 ; 该指令保持R0 的0、1 位,其余位清零。
14. ORR 指令
ORR 指令的语法为:
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设定操作数1 的某些位。指令范例:
ORR R0,R0,#3 ; 该指令设定R0 的0、1 位,其余位保持不变。
15. EOR 指令
EOR 指令的语法为:
EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR 指令用于在两个操作数上进行逻辑互斥运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1 的某些位。
指令范例:
EOR R0,R0,#3 ; 该指令反转R0 的0、1 位,其余位保持不变。
16. BIC 指令
BIC 指令的语法为:
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC 指令用于清除操作数1 的某些位,并把结果放置到目的寄存器中。运算
元1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2 为32 位的屏蔽,如果在屏蔽中设定了某一位,则清除这一位。未设定的屏蔽位保持不变。指令范例:
BIC R0,R0,#%1011 ; 该指令清除R0 中的位0、1、和3,其余的位保持不变。
ARM 微处理器支持的乘法指令与乘加指令共有6 条,可分为运算结果为32位和运算结果为64 位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1 必须是不同的寄存器。乘法指令与乘加指令共有以下6 条:
MUL 32 位乘法指令
MLA 32 位乘加指令
SMULL 64 位有符号数乘法指令
SMLAL 64 位有符号数乘加指令
UMULL 64 位无符号数乘法指令
UMLAL 64 位无符号数乘加指令
1. MUL 指令
MUL 指令的语法为:
MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL 指令完成将操作数1 与操作数2 的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,运算元1 和操作数2 均为32 位的有符号数或无符号数。
指令范例:
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同时设定CPSR 中的相关条件标志位
2. MLA 指令
MLA 指令的语法为:
MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA 指令完成将操作数1 与操作数2 的乘法运算,再将乘积加上操作数3并把结果放置到目的寄存器中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的有符号数或无符号数。
指令范例:
MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同时设定CPSR 中的相关条件标志位
3. SMULL 指令
SMULL 指令的语法为:
SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位元放置到目的寄存器Low 中,结果的高32 位放置到目的寄存器High 中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,操作数1 和运算元2 均为32 位的有符号数。
指令范例:
SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位;
;R1 = (R2 × R3)的高32 位
4. SMLAL 指令
SMLAL 指令的语法为:
SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位元同目的寄存器Low 中的值相加后又放置到目的寄存器Low 中,结果的高32位同目的寄存器High 中的值相加后又放置到目的寄存器High 中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的有符号数。对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32 位。对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32 位。36
指令范例:
SMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位+ R0
;R1 = (R2 × R3)的高32 位+ R1
5. UMULL 指令
UMULL 指令的语法为:
UMULL {条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位元放置到目的寄存器Low 中,结果的高32 位放置到目的寄存器High 中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,操作数1 和运算元2 均为32 位的无符号数。
指令范例:
UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位
;R1 = (R2 × R3)的高32 位
6. UMLAL 指令
UMLAL 指令的语法为:
UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位元同目的寄存器Low 中的值相加后又放置到目的寄存器Low 中,结果的高32位同目的寄存器High 中的值相加后又放置到目的寄存器High 中,同时可以根据运算结果设定CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的无符号数。对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32 位。对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32 位。
指令范例:
UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位+ R0
;R1 = (R2 × R3)的高32 位+ R137
2.6.4程序状态寄存器存取指令
ARM 微处理器支持程序状态寄存器存取指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器存取指令包括以下两条:
MRS 程序状态寄存器到通用寄存器的数据传送指令。
MSR 通用寄存器到程序状态寄存器的数据传送指令。
1. MRS 指令
MRS 指令的语法为:
MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
MRS 指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:
当需要改变程序状态寄存器的内容时,可用MRS 将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
当在例外处理或行程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令范例:
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0
2. MSR 指令
MSR 指令的语法为:
MSR{条件} 程序状态寄存器(CPSR 或SPSR)_<域>,操作数
MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设定程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为4 个域:
位[31:24]为条件标志位域,用f 表示;
位[23:16]为状态位域,用s 表示;38
位[15:8]为扩充位域,用x 表示;
位[7:0]为控制位域,用c 表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR 指令中指明将要操作的域。
指令范例:
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域
|