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将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处