CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

mrs用来读psr(cpsr或者spsr),msr用来写psr
NOTE:
cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SoC中只有1个;而spsr有5个,分别在5种异常模式下,作用是当从普通模式进入异常模式时,用来保存之前普通模式下的cpsr的,以在返回普通模式时恢复原来的cpsr。

二、mrs

功能:将状态寄存器的内容传送至通用寄存器。(读psr)

例:
MRS   R0,CRSR              ;将CPSR中的内容传送至R0

MRS   R3,SPSR              ;将SPSR中的内容传送至R3

三、msr

功能:(写psr)

MSR{< 条件码 >CPSR_<field>|SPSR_<field>,Rm

<field> 字段可以是以下之一或多种: ( 位从右到左)

C :控制域屏蔽字段( PSR 中的第 0 位到第 7 位);

X :扩展域屏蔽字段( PSR 中的第 8 位到第 15 位);

S :状态域屏蔽字段( PSR 中的第 16 位到第 32 位);

F :标志域屏蔽字段( PSR 中的第 24 位到第 31 位)。

例1:设置N、Z、C、V标志。
MSR    CPSR_f,#&f0000000            ;仅高位有效,其他必须为0

参考文献:

1.朱老师课堂笔记

2.http://blog.sina.com.cn/s/blog_6ac051b2010123cz.html

一、简介CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。mrs用来读psr(cpsr或者spsr),msr用来写psrNOTE:cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SoC中只有1个;而spsr有5个,分别在5种异常模式下,作用是当从普通模式进入异常模式时,用来保存之前普通模式下的cpsr的,以在返回普通模式时恢复原来的cpsr。二、mrs功能:将状态寄存...
ARM 处理器中,只有MSR 指令 可以对状态寄存器 CPSR 和SPSR进行写操作。与MRS配合使用,可以实现对 CPSR 或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。 由于xPSR寄存器代表了CPU的状态,其每个位有特殊意义,在执行对xPSR状态寄存器写入时(读取时不存在该用法),为了防止误操作和方便记忆,将xPSR里32位分成四个区域,每个区域用小写字母表
ARM 中有两条 指令 用于在状态寄存器和通用寄存器之间传送数据。   状态寄存器中有些位是当前没有使用的,但在 ARM 将来版本中有可能使用这些位,因此用户程序不要使用这些位。   程序不能通过直接修改 CPSR 中T的控制位直接将程序状态切换到Thumb状态,必须通过BX等 指令 完成程序状态的切换。   通常修改状态寄存器是通过“读取-修改-写回”的操作序列来实现。   状态寄存器 访问 指令 包括以下两条。   (1)MRS 状态寄存器到通用寄存器的传送 指令 MRS(条件)  <Rd>' CPSR MRS 指令 用于将状态寄存器的内容传送到通用寄存器中。   MRS 指令 主要用于以下3种场合
分成了4部分: 1,条件标志位 N(Negative), Z(Zero), C(Carry), V(Verflow)统称为条件标志位。 ARM 指令 可以根据 CPSR 中的这些条件标志位来选择性的执行。 2,Q标志位 ARM v5的... MRS 指令 的格式为: MRS{条件} 通用寄存器,程序状态寄存器( CPSR 或SPSR) MRS 指令 用于将程序状态寄存器的内容传送到通用寄存器中。该 指令 一般用在以下两种情冴: Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。 Ⅱ.当在异常处理或进程切换时,需要保存程序...
数据处理 指令 分为3类:数据传送 指令 ,如MOV;算术逻辑运算 指令 ,如ADD、SUB和AND等;比较 指令 ,如TST等。   数据传送 指令 用于向寄存器传入一个常数。该 指令 包括一个目标寄存器和一个源操作数。   算术逻辑运算 指令 通常包括一个目标寄存器和两个源操作数。其中一个源操作数为寄存器的值;   比较 指令 不保存运算结果,只更新 CPSR 中相应的条件标志位。   数据处理 指令 包括以下 指令 。   (1)MOV 数据传送 指令 MOV 指令 可完成从另一个寄存器、被移位的寄存器装载一个值到目的寄存器;或将一个立即值装载到目的寄存器。可以指定相同.的寄存器来实玑NOP 指令 的效果。还可以专门移位一个
SimIt- ARM -3.0 给予命令行 ARM 指令 模拟器,短小精悍,是研究 ARM 处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪 指令 的执行。 SimIt- ARM -3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt- ARM -3.0 SimIt- ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt- ARM -3.0-gk-20150902.tar.bz2 cd SimIt- ARM -3.0-gk ./configure make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt- ARM -3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt- ARM -3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c * hello.c * Tue Sep 8 10:13:40 CST 2015 int main() printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); [root@ORA9 gcc-asm]# arm -linux-gcc -v Reading specs from /usr/local/ arm /3.4.1/bin/../lib/gcc/ arm -linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/ arm -linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target= arm -linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/ arm -linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/ arm -linux/gcc-3.4.1-glibc-2.3.2/ arm -linux/include --with-local-prefix=/opt/crosstool/ arm -linux/gcc-3.4.1-glibc-2.3.2/ arm -linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm -linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM , vers
●shifte_operand表示第2个操作数。   对应地转换成一条典型的 ARM 指令 编码格式如下( ARM 指令 字长为固定的32位)。   在 ARM 指令 中,第2个操作数(shifter_operand)有多种表示方法。   1.常数表达式#immed_8r   该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位 一、 跳转 指令 跳转 指令 用于实现程序流程的跳转, 在 ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转 指令 。 Ⅱ.直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用 MOV ,LR,PC 等类似 指令 ,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。 ARM 指令 集中的跳转 指令 可以完成从当前 指令 向前或向后的 32MB 的地址空间的跳转,包括以下 4 条 指令 : 1、 B 指令 B 指令 的格式为: B{条件} 目标地址 B 指令 是最简单的跳转 指令 。一旦遇到一个 B 指令 ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转 指令 中的实际值是相对当前 PC 值的一个偏移量,而不是一个绝对地址,它的值由 汇编 器来计算(参考寻址方式中的相对寻址) 。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。以下 指令 : B Label ;程序无条件跳转到标号 Label 处执行 CMP R1,#0 ;当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执行 BEQ Label
在启动代码里,我们会看到如 msr cpsr _cxsf,r0这样的代码。 用MSR 指令 对PSR进行操作的时候,为了设定操作的范围,避免对某些位的操作而影响其他部分而定义了这几个FLAG。 具体 指令 如下: MSR{cond} _, #immed_8r MSR{cond} _, Rm 的具体含义如下: specifies the field or fields to be m
MRS 指令 的格式为: MRS{条件}   通用寄存器,程序状态寄存器( CPSR 或SPSR) MRS 指令 用于将程序状态寄存器的内容传送到通用寄存器中。该 指令 一般用在以下两种情冴:  Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。 Ⅱ.当在异常处