四、状态寄存器专用指令
CPSR寄存器-N Z C V
T为0时 为ARM状态
F为0时 为开启FIQ状态
I为0时 为开启IRQ状态
图1
图2
一开始都是SVC指令,因为在操作系统启动的时候,在做一些初始化的操作,不允许被打断
图3
复位后CPSR寄存器为0xD3----10011(SVC)
只有状态寄存器传送指令可以修改CPSR寄存器
图4
0x10 为user模式
图5
0001 0000转成16进制为 0x10
并且开启了FIQ IRQ 状态为ARM状态
user模式为非特权模式(见图2),无法向其他模式进行转变 ,结果见图6
图6
注:1.状态寄存器传送指令在C语言中无对应语句
2.多用于操作系统内部,系统调用场合应用较多
作业:
编程实现通过状态寄存器传送指令,将ARM处理器的模式修改成USER模式并将FIQ与IRQ使能
MSR CPSR,#0x10
五、软中断指令
图7
软中断指令会使CPU进入 SVC模式
图 8
异常向量表里一种存放 异常处理程序的一条 跳转指令
受到软中断指令后,进入SVC模式,cpsr寄存器-> 100 10011->禁止了IRQ中断
main函数占用了 异常向量表的地址
ARM复位以后,pc的值就是0x00000000,执行B.
B . 表示死循环
修改为以下:将main函数放在异常向量表之后
B main 表示复位以后执行主程序
软中断指定pc跳转到0x08,原因见图八
428行 存储的是svc模式下的sp ,432行又触发后进入SVC模式,是正确的,若428和429互换,则sp存储的是user模式下的cpsr,则错误
什么模式下用什么模式下的cpsr
跳转程序需注意压栈和出栈
异常返回:
下图可直接实现:1.LR的值传给PC 2.SPSR_(SVC)存储的值返回给CPSR
完整代码: 39:00-42:00
软中断在C语言中无对应语句!
六、协处理器指令
主要用的两个:
FPU:用来处理浮点型、double型数据
cp15:帮助ARM进行存储处理(例。高速缓存,异常向量表,MMU处理物理内存和虚拟内存)