arm 常识

arm 32 可以在7中不同模式下运行,所有寄存器都是32位的。

arm有37个寄存器,最多可以有18个活动寄存器,分别是16个数据寄存器(r0~r15)和2个状态寄存器(cpsr和spsr),其中r13、r14、r15分别代表sp、lr、pc,arm使用cpsr监视和控制内部操作,cpsr是一个专用的32位寄存器,
31 30 29 28 27 ~ 24 ~ 7 6 5 4~0
N Z C V Q J I F T Mode
进位 溢出 饱和 java执行 禁止IRQ 禁止FIQ Thumb状态 当前处理器mode

//Q:表示增强的DSP指令是否发生了溢出或者饱和

处理器模式
1,用户模式 10000 //运行应用程序的普通模式
2,终止abort模式 10111 //数据终止,预取指终止
3,中断IRQ模式 10010   //处理发起中断的外设,设备有键盘、 VSync (在发生屏幕刷新的时候)、IOC 定时器、串行口、硬盘、软盘、等等...
4,快速中断FRQ模式 10001  //处理发起快速中断的外设,如软盘,串行端口
5,管理svc模式 10011  //主要用于 SWI(软件中断)和reset
6,系统模式 11111  //运行特权操作系统任务
7,未定义模式 11011

当一个异常导致模式改变时,内核自动第执行如下步骤:
1,cpsr保存到相应异常模式的spsr;
2,pc保存到相应异常模式的lr;
3,设置cpsr为相应异常模式;
4,设置pc为异常处理程序入口地址;

异常优先级,复位>abort>FRQ>IRQ>预取指终止>SWI>未定义

arm状态
arm处理器运行一般有三个状态,arm、thumb、jazelle,相应状态决定了执行相应的指令集,由cpsr相应的J位和T位控制,上电时默认T=0,执行arm指令集,每条指令长度32位,thumb指令长度16位,thumb指令集是ARM指令集的一个子集的编码,可以直接访问r0~r7,不能直接访问状态寄存器,想改变cpsr,必现切回arm状态。而jazelle是为加速java bytecode执行设计的指令集,是软件和硬件的混合,长度为8位。

ATPCS定义了ARM和thumb状态切换的标准。arm--->thumb,内核必现切换状态,状态的变化由cpsr的T位指示,BX和BLX分支指令用于arm和thumb状态的切换,而异常处理总是在arm状态下执行。


条件执行,助记符
EQ 相等 Z
NE 不相等 z
CS HS 进位置位/无符号数>= C
CC LO 进位清除/无符号数< c
MI 负数 N
PL 非负数 n
VS 溢出 V
VC 无溢出 v
HI 无符号数> zC
LS 无符号数<= Z或c
GE 有符号数>= NV或nv
LT 有符号数< Nv或nV
GT 有符号数> NzV或nzv
LE 有符号数<或= Z 或Nv或nV
AL 无条件执行


流水线
1,取指:加载一条指令;
2,译码:识别被执行的指令;
3,执行:处理指令并将结果写入寄存器;
但Arm9增加了存储和写,增加了两级流水深度。
当执行一个分支指令时,pc会跳转,会使arm清空流水线。而arm10也增加了跳转预测,以避免清空流水线的影响;如果产生一个中断,当前处于执行的流水线也会继续执行,而其后的流水线指令会被丢弃;

猜你喜欢

转载自blog.csdn.net/zkuili/article/details/80216966
今日推荐