cpsr当前程序状态寄存器
标签:
arm920t寄存器cpsrcpu工作原理 |
分类: 第四章-踏入嵌入式领域之ARM |
在介绍CPSR寄存器之前,让我们来想个问题。CPU执行一条指令的流程是这样的,CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。在这个过程中,CPU执行了加、减、移位运算。想想看每次加、减、移位运算后的结果的信息哪里去了?有两种可能,A:随着运算的结束消失了。B:将运算的相关信息存储了起来。举个例子:8位二进制无符号数相加,1111_1110B+0000_0011B=0000_0001(假设微处理器是8位的,该加法结果溢出了)。该加法表达式译为汇编语言为:
MOV R0 #0xFE @将立即数0xFE装入通用寄存器R0中
ADD R0 R0 #03 @将R0中的内容和立即数0x03相加后存入R0中
显然,在运算完成后通用寄存器中的值为0x01,那么给人的感觉就是254+3=1(有点“小学没毕业”的感觉)。对!CPU就是“小学没毕业” 该运算结果CPU认为是正确的,只不过CPU将运算信息(该运算信息就是在运算过程中出现了一次运算溢出)存储了起来。其实CPU认为R0中的值和中间运算信息的集合才是该表达式的预算结果。好!我们的答案出来了,选B。CPU将运算的相关信息存储了起来。问题又来了,这个运算信息要存到哪里?答案便是笔者今天要将得内容:程序状态寄存器CPSR。
ARM920T微处理器任何一种模式下都有一个程序状态寄存器CPSR(current program status register)的寄存器。该寄存器就是用来存储一些关于运算的信息,包括,条件标志位、中断禁止位、当前处理器模式标志和控制状态位等。CPSR是一个32位寄存器,大体分为三段:[31:28]、[27:8]和[7:0],如图所示:
一、条件标志位[31:28]
条件标志位有N(Negative)、Z(Zero)、C(Carry)和V(Overflow)。这些标志位统称为条件标志位。
1、符号标志位N
当两个补码表示的有符号整数运算时,若结果为负则N=1;若结果为正或为零则N=0;例如代码(假设CPU是8位的):
MOV R0 #0x05
SUB R1, R0, #0x06
当CPU执行完该代码之后R1中的值为0XFF。同时CPSR中的符号标志位N=1,表示运算结果R1中的值为-1。再看下面一段代码:
MOV R0, #0x06
SUB R1, R0, 0x05
当CPU执行完该代码后R1中的值为0x01,同时CPSR中的符号标志位N=0,表示运算结果R1中的值为1。
2、零标志位Z
Z=1表示运算结果为零;Z=0表示运算结果不为零。
注:对于CMP命令中,Z=1表示比较的两个数大小相等。
MOV R0 #05
CMP R0 #05
当CPU执行CMP这条代码时,将R0中的值(0x05)与立即数0x05相减(结果不保存),同时使CPSR中的符号标志位Z=1,表示比较的两个数大小相等。
3、进位、借位标志C
该标志位分四种情况表示:
A、在加法指令(包括比较指令CMN)中,C=1,表示无符号运算结果产生了进位。其他情况C=0。例如:
MOV R0 #0xFE
ADD R0 R0 #03
当CPU执行完该代码后,R0中的值为0x01,同时CPSR的标志位
C=1,表示运算结果向上进位,该运算结果的大小为257(这便解释了,开头说所的CPU “小学没毕业” 的问题)。
B、 在减法指令(包括比较指令CMP)中,当运算中发生借位C=0,表示无符号数运算发生下溢出;其他情况,C=1;
C、 在对于移位操作的指令,C的值为最后一次被移出位的值。例如:
MOV R1, #0xA5
MOV R0, R1, LSR#2 @将R1中的值向右移动两位后存入R0
CPU执行完该代码后,R0中的值为0x29,同时CSPR中标志位C的值为最后一出去的‘0’。
D、对于其他非加、减运算指令一般不会影响C的值。
4、溢出标志位V
当带符号数进行加减运算指令出现符号位溢出时V=1。
二、[27:8]没有开发利用。
三、控制位[7:0]
当异常中断发生时,该控制位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
● 中断禁止位:
1. 当I=1时,禁止IRQ中断。
2. 当F=1时,禁止FIQ中断。
在CPU上电复位时需要将IRQ和FIQ中断关闭,可以通过一下代码实现。
MRS R0, CPSR @将CPSR中的内容读入R0中
BIC R0, R0, #0xC0 @清零R0的第7、6位
ORR R0, R0, #0xC0 @置位R0的第7、6位
MSR CPSR, R0 @将R0中的内容回送到CPSR中
● T控制位
T控制位用于说明执行的指令时ARM指令还是Thumb指令。对于ARM920T来说,T=0表示ARM指令;T=1表示Thumb指令。
● 控制位M[4:0]控制处理器的模式,共7种模式,如表所示:
注:ARM920T共有7种工作模式,除去用户模式和系统模式剩下的5中模式中,处理器有一个专用的备份程序状态寄存器SPSR(Backups Program statues register)。当特定的异常中断发生时,SPSR用于存放CPSR中的内容,在异常中断处理完成后,可以用SPSR中的内容来恢复CPSR。已达到保护并恢复中断现场作用。SPSR的格式与CPSR的格式完全相同。
cpsr当前程序状态寄存器的更多相关文章
- ARM学习笔记6——程序状态寄存器访问指令
这两条指令结合,可用于对CPSR或SPSR进行读/写操作. 当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传递到通用寄存器中 1.MRS指令(Move to Register ...
- ARM学习笔记5——程序状态寄存器
当前程序状态寄存器CPSR可以在任何位处理器模式下被访问,它包含条件码标志.中断控制.当前处理器模式以及其他状态和控制信息.CPSR的结构图如下: 一.条件标志位 CPSR最高4位:N(Negativ ...
- ARM处理器的寄存器
在ARM体系中通常有以下3种方式控制程序的执行流程: **在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节.整个过 ...
- (六)ARM状态寄存器-PSR
ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 【转】
转自:http://blog.chinaunix.net/uid-28458801-id-3494646.html ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常 ...
- ARM寄存器介绍
ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.以及6个32位状态寄存器.但目前只使用了其中12位.ARM处理器共有7种不同的处理器模 ...
- ARM_Core的处理器模式与寄存器,结构杂谈
ARM处理器的工作状态:ARM处理器有两种工作状态.在程序的执行过程中,处理器可以在两种工作状态之间切换,并且不影响 相应寄存器中的内容. ARM状态,此时处理器执行32位对齐的ARM指令:BX指令, ...
- ARM 寄存器
ARM总共有37个寄存器 ARM寄存器物理分类 通用寄存器:1:不分组寄存器(R0--R7) 2:分组寄存器(R8-R14) 3:程序计数器(R15)(注意:又名pc指针) 程序状态寄存器:1:CPS ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式
** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常执行模式 FIQ模式(Fast ...
随机推荐
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
- linux logrotate配置
对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以 ...
- 我的android学习脚步----------- 的第一个应用
刚刚开始学android开发,以前都是在别人调好的应用中修改JNI,现在需要自己一步步走 开发环境:Eclipse+ADT 配置不多讲了,引自:http://www.cnblogs.com/allen ...
- WINCE下进程间通信(二)
WINCE下进程间通信(二) 接着前面的文章<WINCE下进程间通信(一)>,现在介绍进程间通信的另一种方法. 三.管道(消息队列) WINCE并不支持类似于PC机上匿名管道.命名管道的通 ...
- 利用MFC编写计算器
端午节这两天没什么事,就用MFC写了一个简单的计算器,界面做的也比较简单,如下图1,可以进行简单的加.减.乘和除功能,小数点显示这块做的不是很好,比如输入1.2,不会一个个的显示,而是先显示“1”,后 ...
- 三列布局,读《css那些事儿》
1.两列定宽,中间自适应 要点:浮动.负边距效果.mainbox增加内容div并设置margin.:after清除浮动 原理:mainbox的浮动并将其宽度设置为100%,次要内容及侧边栏设置固定宽度 ...
- ural1521 War Games 2
War Games 2 Time limit: 1.0 secondMemory limit: 64 MB Background During the latest war games (this s ...
- JSTL c标签,fn标签,fmt标签 - 生活在爪洼岛上 - ITeye技术网站
jstl是sun定义的标准,由apache实现,所以要下载jar包的话去apache,要看api文档的话,去sun,API文档在此:http://java.sun.com/products/jsp/j ...
- SpringMVC轻松学习-其他常用(四)
Spring MVC 3.0 深入 核心原理 1. 用户发送请求给服务器.url:user.do 2. 服务器收到请求.发现DispatchServlet可以处理.于是调用Disp ...
- 函数(swift)
输入输出参数(In-Out Parameters) 如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Paramet ...