start.S分析及arm的CPSR寄存器

一、CPSR概述

      ARM处理器共有37个寄存器。这37个寄存器按其在用户编程中的功能划分,可分为2类寄存器,即31个通用寄存器和6个状态寄存器。这6个状态寄存器在ARM公司文件中其名称分别为:CPSR、SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fig。这12的作用分别如图1所示:

 

      所有处理器模式下都可访问当前程序状态寄存器CPSR。CPSR中包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。在每种异常模式下都有一个对用的程序状态寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。

(1)条件码标志

N、Z、C、V,最高4位称为条件码标志。ARM的大多数指令可以条件执行的,即通过检测这些条件码标志来决定程序指令如何执行。

各个条件码的含义如下:

N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0。

Z:如果结果为0,则Z=1;如果结果为非零,则Z=0。

C:其设置分一下几种情况:

               对于加法指令(包含比较指令CMN),如果产生进位,则C=1;否则C=0。

               对于减法指令(包括比较指令CMP),如果产生借位,则C=0;否则C=1。

               对于有移位操作的非法指令,C为移位操作中最后移出位的值。

               对于其他指令,C通常不变。

V:对于加减法指令,在操作数和结果是有符号的整数时,如果发生溢出,则V=1;如果无溢出发生,则V=0;对于其他指令,V通常不发生变化。

(2)控制位的作用在图1中可以看出,在这里就不阐述了。

二:CPSR与CPSR_c的区别

      CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)

      MSR - Load specified fields of the CPSR or SPSR with an immediate constant, or from the contents of a general-purpose register.

     Syntax:

     MSR{cond} <psr>_<fields>, #immed_8r MSR{cond} <psr>_<fields>, Rm where: cond is an optional condition code. <psr> is either CPSR or SPSR. <fields> specifies the field or fields to be moved. <fields> can be one or more of:

c control field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) s status field mask byte (PSR[23:16) f flags field mask byte (PSR[31:24]). immed_8r is an expression evaluating to a numeric constant. The constant must correspond to an 8-bit pattern rotated by an even number of bits within a 32-bit word. Rm is the source register.

      C 控制域屏蔽字节(psr[7:0])
      X 扩展域屏蔽字节(psr[15:8])
      S 状态域屏蔽字节(psr[23:16])
      F 标志域屏蔽字节(psr[31:24])
常用于MRS或MSR指令,用于psr中的值转移到寄存器或把寄存器的内容加载到psr中.
如:

MSR CPSR_c,#0xd3

 

u-boot的start.s内:

	mrs	r0, cpsr
	bic	r0, r0, #0x3f
	orr	r0, r0, #0xd3
	msr	cpsr, r0

mrs r0,cpsr //将当前cpsr的状态为保存到r0中。
bic r0,r0,#0x1f //bic,位清零指令。0x1f=00011111,相当于清除低5位。
刚好是模式位。
orr r0,r0,#0xd3 //或指令。置模式位。0xd3=11010011以及设置5,6,7位的
状态位。禁止FIQ,IRQ,处于arm状态。低5位为10011,则对应超级用户态。msr cpsr,r0 //在将r0中的值赋给状态寄存器cpsr

 

过去,对中断的使能和除能是通过修改 CPSR 的,在 CM3 中没有 CPSR,而是使用 PRIMASK
或 FAULTMASK 来实现全局中断的开关。
NMI 正如其名,是不能被除能的。而 ARM7 的 FIQ 则可以通过把 CPSR.F 置位来
除能。因此,在 CM3 中何时进入 NMI 完全不可控——有可能在引导期间就进入
NMI。而在 ARM7 中,复位后 FIQ 是除能的,因此不会意外地进入。
中断的使能与除能:在 ARM7 中,中断的使能与除能是通过对 CPSR.I 来控制的。在
CM3 中则改用 PRIMASK 或 FAULTMASK。更进一步地, CM3 中没有 FIQ 的概念,因
此也没有 F 位。
对 CPSR 和 SPSR 的访问: ARM7 中的 CPSR 在 CM3 变成了 xPSR,而 SPSR 则被去掉
了。对于访问标志的应用程序代码,可以改为对 APSR 的访问。如果异常服务例程
想要访问异常发生之前的 xPSR,则要读取压入堆栈中的值——这也是 ARM7 中 SPSR
的功能,因此 CM3 中不再需要 SPSR。
 


原文:https://blog.csdn.net/david_luyang/article/details/6276533 
https://zhidao.baidu.com/question/195831605.html

《cotex-M3权威指南》

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值