ARM的异常与CPSR
来源:互联网 发布:手机怎样申请开淘宝店 编辑:程序博客网 时间:2024/06/05 14:13
【1】异常处理流程
异常向量表
当异常产生时, ARM core:
拷贝 CPSR 到 SPSR_<mode>
设置适当的 CPSR 位:
改变处理器状态进入 ARM 态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断 (如果需要)
保存返回地址到 LR_<mode>
设置 PC 为相应的异常向量
返回时, 异常处理需要:
从 SPSR_<mode>恢复CPSR
从LR_<mode>恢复PC
Note:这些操作只能在 ARM 态执行.
【2】为什么FIQ的响应速度比IRQ快
1. FIQs有高于IRQs的优先级
2. FIQ 向量位于异常向量表的最末. 异常处理程序可从异常量处连续执行
3. FIQ 模式有5个额外的私有寄存器 (r8-r12) 中断处理必须保护其使用的非私有寄存器
【3】程序状态寄存器(CPSR)
条件位:
N[31]: 负标记位,当ALU运算结果为负数,那么N = 1, 否则N = 0
Z[30]: 0标记位,当ALU运算结果为0,则Z = 1, 否则Z = 0
C[29]: 进位标记
当进行加法运算时:
产生进位(两个32位的数相加变成了33位的数)时:C = 1, 否则C = 0
0xffffffff + 0x1
当进行减法运算时:
产生借位时:C = 0, 否则C = 1
2 - 3
注意:对于非加减运算,不会影响C位
V[28]: 溢出标记(符号位溢出)
加法运算符号位溢出(0->1):
次高位进位,V = 1, 否则V = 0
减法运算符号位溢出(1->0):
次高位借位,V = 1, 否则V = 0
中断禁止位
I[7]: I = 1: 禁止 IRQ. I = 0 使能IRQ
F[6]: F = 1: 禁止 FIQ, F = 0 使能FIQ
处理器的状态位T[5]:
T = 0; 处理器处于 ARM 状态
T = 1; 处理器处于 Thumb 状态
处理器的模式位M[4:0]:
10000 User mode; 10001 FIQ mode; 10011 SVC mode;
10111 Abort mode; 11011 Undfined mode; 11111 System mode;
10110 Monitor mode; 10010 IRQ
【4】练习
1. 切换当前模式为IRQ模式
int a = CPSR //读
a = a & (~(0x1f<<0));
a = a | (0x12<<0);//改
CPSR = a //写
2. 禁止IRQ,进入arm状态
int a = CPSR //读
a = a | (0x1<<7) & (~(0x1<<5));
CPSR = a //写
3. 禁止FIQ,使能IRQ,进入arm状态,切换当前模式为IRQ模式
int a = CPSR //读
a = a | (0x1<<6) & (~(0x1<<7)) & (~(0x1<<5));
a = a & (~(0x1f<<0)) | (0x12<<0);
CPSR = a //写
【5】大小端
大端:高地址存放数据的低字节,低地址存放数据的高字节
小端:高地址存放数据的高字节,低地址存放数据的低字节
判读:
1, 先写4个字节的数据到某一内存下
2, 从这个地址读一个字节的数据,如果是高字节表示大端,如果是低地址表示小端
【6】流水线
无论多少级流水线,pc永远只想正在取指的那条指令的地址
- ARM的异常与CPSR
- [摘]ARM的CPSR
- ARM条件码与CPSR标志位的关系
- ARM条件码与CPSR标志位的关系
- ARM条件码与CPSR标志位的关系
- ARM里CPSR的介绍
- ARM CPSR/SPSR 的示意图
- ARM CPSR/SPSR 的示意图
- arm-cpsr
- ARM体系中的CPSR与SPSR
- arm中CPSR,SPSR功能与访问
- arm状态寄存器CPSR的一些知识
- 关于arm寄存器 CPSR域的解释
- arm CPSR/SPSR寄存器的访问、修改
- ARM条件码与CPSR标志位的关系——cmp MOVLS与MOVHI 指令
- cpsr与cpsr_c的区别
- cpsr与cpsr_c的区别
- cpsr与cpsr_c的区别
- 导入github的demo
- 怎样连接到docker容器内部
- Vue.js学习系列(十)---给页面增加动态数据
- Windows日常使用经验总结
- JS学习day3
- ARM的异常与CPSR
- SwiftJSON源码学习笔记
- java 环境变量最简单的配置
- 关于ORM的一些体会
- java.lang.NullPointerException E/AndroidRuntime(27395): at android.app.BackStackRecord.run(BackSt
- 接口的一个用法---将接口作为方法的参数
- mahout k-means
- POJ3752 字母旋转游戏【水题】
- C++ 智能指针详解