嵌入式系统原理应用——实验三 ARM汇编指令实验2—ARM 处理器工作模式实验
【教学目标和要求】
通过实验了解嵌入式汇编语言程序结构,完成实验中要求的工作模式切换功能。
【主要仪器设备和药品】
(1)硬件:微机
(2)软件:ADS1.2
【实验要求】
(1)按照实验要求编写汇编语言源程序。
(2)对汇编源程序进行编译、汇编。
(3)对程序进行调试。
(4)观察程序运行结果。
【实验程序】
(1)汇编程序:
本程序将0-12依次移入R0-R12寄存器后,跳转到initstack标号执行模式切换,最后回到跳转点,最终将模式切换为用户模式。
1 | usr_stack_legth equ 64 |
【实验结果】
1. 程序复位之后系统处于什么模式?
答:
图 1 程序复位后寄存器状态
由上图可知,复位后系统处于管理模式。
2. 记录每种模式下的初始堆栈指针,以及执行 R1-R12 内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断 FIQ 模式与其他模式存入的 R1-R12 有什么不同。
答:
(1) 管理模式:
图 2 系统切换到管理模式
初始堆栈指针为0x8244
图 3 管理模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8214,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
(2) IRQ中断模式:
图 4 系统切换到IRQ模式
初始堆栈指针为0x8344
图 5 IRQ模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8314,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
(3) FIQ模式:
图 6 系统切换到FIQ模式
初始堆栈指针为0x8384
图 7 FIQ模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8354,较初始堆栈指针相距0x30字节,在32位系统即12个字,但FIQ模式下只压入了R1-R7的数据,这是因为在FIQ模式下,可访问的寄存器只有R1-R7,不能访问R8-R12,FIQ模式下有对应自己的R8-R12。
(4) 中止模式:
图 8 系统切换到中止模式
初始堆栈指针为0x83C4
图 9 中止模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8394,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
(5) 未定义模式:
图 10 系统切换到未定义模式
初始堆栈指针为0x8404
图 11 未定义模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x83D4,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
(6) 系统模式:
图 12 系统切换到系统模式
初始堆栈指针为0x81C4
图 13 系统模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8194,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
(7) 用户模式:
图 14 系统切换到用户模式
初始堆栈指针为0x8194
图 15 用户模式下将r0-r12数据入栈
R1-R12压栈后,堆栈指针为0x8164,较初始堆栈指针相距0x30字节,在32位系统即12个字,对应R1-R12的数据。
3. 切换成用户模式之后还能否从用户模式切换到其他模式(如系统模式)?
答:如下图当前模式为用户模式,在该模式下执行切换系统模式的代码:
图 16 系统切换到用户模式下
图 17 在用户模式下切换模式结果
可以看到模式仍为用户模式,因此切换成用户模式之后不能从用户模式切换到其他模式,除非异常发生。
4. 用户模式下能否执行堆栈压栈操作?如果能得话,观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。
答:由问题2的测试可知,用户模式下可以执行堆栈压栈操作,且以4个字节(1个字)为单位进行压栈操作。
5. 观察本程序模式切换过程中 SPSR 有无变化,并解释其原因
答:模式切换过程中SPSR无变化。因为SPSR是异常模式的程序状态保存寄存器,在本程序切换过程中没有异常发生,所以SPSR无变化。