Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1074844
  • 博文数量: 155
  • 博客积分: 2525
  • 博客等级: 大尉
  • 技术积分: 2242
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-05 20:52
文章分类

全部博文(155)

文章存档

2013年(1)

2012年(149)

2011年(5)

分类: 嵌入式

2012-04-23 21:06:22

1.ARM 2种状态 +  7种模式
2种状态:ARM状态 + Thumb状态
   ARM状态:32位字对齐的ARM指令;
   Thumb:16位半字对齐的Thumb指令。
 CPU一上电就进入ARM状态,可以通过BX指令进行状态切换。进入ARM状态,通过BX指令,并将操作数寄存器(R0)状态位(0位)清零。进入Thumb状态,通过BX指令,将操作数寄存器状态位置一。
 BX指令:在程序跳转的同时进行状态切换。
  在程序发生跳转时流水线会被清空。使用BX进行状态切换后,流水线中按原来处理器状态进行取值和译码的指令(与当前处理器状态不符的指令)会被清除。

7种模式:用户(usr)、系统(sys)、管理(svc)、中断(irq)、快中断(fiq)、数据访问终止(abort)、未定义(undefine).
可以通过软件在7种模式间切换,或者发生各类中断、异常时进入相应的模式。
7种模式 = 1 用户模式+ 6 特权模式;

2.ARM9的寄存器。
7种模式有各自的寄存器副本。共有37个(31个通用的,6个程序状态寄存器)。

(1)ARM状态:

在ARM状态,每个工作模式下都有16个通用寄存器+1个或2个程序状态寄存器

R0到R15可以直接访问。
R13(Stack Pointer Register,栈指针寄存器) R14(subroutine Link Register,程序链接寄存器)  R15(Programming Count Reg,程序计数器)

CPSR(Current Program Status Reg,当前程序状态寄存器)
(1)状态码标记位(又叫条件代码标记)
  大多数数值处理指令可以选择是否修改状态码标记位。如果指令带S后缀,则指令会修改该标记位。也有一些指令总是改变标记位。
PS:在ARM状态下,所有指令都可以按条件执行。但在Thumb下,只有分支指令可以按条件执行。
(2)控制位
 I:中断禁止标志位
 F:快中断禁止标志位(这两位被置位时,IRQ,FIQ分别被禁止)
 T:处理器状态位(1,CPU处于Thumb,0,CPU处于ARM)
(3) M0-M4:处理器模式位,表明CPU当前处于什么工作模式。可以设置这些位,使CPU进入指定的工作模式。
  10000:用户模式
  10001:快中断模式
  10010:中断模式
  10011:管理模式
  10111:数据访问中止
  11011:未定义指令中止模式
  11111:系统模式

SPSR(Saved Process Status Reg).
当切换进入除系统/用户模式外的其余5种模式时,CPSR的值将被保存到SPSR,这五种模式都有独立的SPSR。返回前一个模式时,CPSR值被恢复。


 (2)Thumb状态


(3)ARM状态与Thumb状态之间的关系
Thumb与ARM状态的R0-R7相同。
Thumb CPSR 与ARM CPSR也相同。
由于Thumb指令集不包含MSR和MRS指令,如果用户要修改CPSR的任何标志位,必须回到ARM模式。
通过BX指令和BLX指令来改变指令集模式。
当完成复位(Reset)或进入到异常模式时,将会中切换到ARM模式。

 


阅读(1101) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~