资源描述
ARM微控制器工作模式实验
一、 实验内容
《1》 使用MRS/MSR指令切换工作模式,并初始化各种模式下的堆栈指针
《2》 观察ARM微控制器在各种模式下寄存器的区别
二、 实验程序
三、 实验步骤
《1》启动ADS1.2,使用ARM Executable Image 工程模版建立一个工程MODE。
《2》建立汇编源文件TEST7.S,编写实验程序,然后添加到工程中。
《3》根据上一次实验的步骤设置工程连接地址
《4》写程序,编写完程序后,进行错误检查,若无误,则进行软件仿真调试。
《5》点击,打开寄存器窗口,选择Current项监视各寄存器的值。
《6》单步运行程序,观察寄存器值的变化
观察的过程中显示大写字母表示该位为1;显示小写字母表示该位为0
条件码标志位MZCVQ;
中断禁止标志位IF;
状态标志位T;
工作模式:User(用户模式)、FIQ(FIQ中断模式)、IRQ(IRQ中断)、SVC(管理模式)、Abort(中止模式)、Undef(未定义模式)和SYS(系统模式)
四、 思考
(1) 在用户模式或系统模式下读取SPSR寄存器会有何结果?
由于用户模式和系统模式不是异常中断,所以它们没有SPSR.因此在用户模式和系统模式中不要访问SPSR,否则将会产生不可预知的结果。
(2) 在非特权模式下能否对CPSR寄存器设置?能否读取CPSR寄存器的值?
只有在特权模式下才允许对当前程序状态寄存器CPSR的所有控制位直接进行读/写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问,但可以读取CPSR的值。
(3) 在非特权模式下如何使能/禁止IRQ或FIQ中断?
使用SWI指令切换到管理模式
(4) 程序中能不能通过MSR指令直接修改CPSR中的T位来实现ARM状态/Thumb状态的切换?
不能。如果这样做的话不会清空流水线,是不安全的。可以使用BX指令进行状态切换,程序跳转的同时进行状态切换,当程序发生跳转时流水线会被清空,流水线中按原来处理器状态进行取指和译码的指令(与当前处理器状态不符的指令)会被清除,也就不会引起处理器的错误。
五、 反思
1、BIC Rd,Rn,operand2 ;位清除指令,即Rd←Rn&(~operand2)
2、MRS R0,CPSR ;读状态寄存器指令,将CPSR状态寄存器读取,保存到R0中
MSR CPSR_c,#0xd0 ;写状态寄存器指令,CPSR[7:0]=0xd0,即切换到管理模式
MSR{cond} psr_fields,#immed_8r
Psr CPSR或SPSR
fields 指定传送的区域(字母必须为小写)。
c 控制域屏蔽字节(psr【7:0】);
x 扩展域屏蔽字节(psr【15:8】);
s 状态域屏蔽字节(psr【23:16】);
f 标志域屏蔽字节(psr【31:24】);
展开阅读全文