做可转债好的网站,加强网站微信公众号平台建设,漳州网站建设优化,4399电脑版网页链接文章和代码已归档至【Github仓库#xff1a;hardware-tutorial】#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的
#xff08;1#xff09; 通过实验掌握学会使用msr/mrs 指令实现ARM 处理器工作模式的切换#xff0c;观察不… 文章和代码已归档至【Github仓库hardware-tutorial】需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的
1 通过实验掌握学会使用msr/mrs 指令实现ARM 处理器工作模式的切换观察不同模式下的寄存器加深对CPU 结构的理解
2 通过实验掌握ld 中如何使用命令行指定代码段起始地址。
二、实验环境
硬件PC机。
软件ADS1.2 集成开发环境
三、实验内容
通过 ARM 汇编指令在各种处理器模式下切换并观察各种模式下寄存器的区别掌握ARM 不同模式的进入与退出。
四、实验要求
(1)按照2.3节介绍的方法, 在ADS下创建一个工程asmmodelab完成各个模式下的堆栈初始化工作,并将R1-R12的内容存入当前模式下堆栈。通过AXD运用单步执行方式调试程序验证工作模式的切换注意观察CPSR寄存器中的变化。随着程序调试过程中在模式间的切换使用寄存器观察器切换到不同的工作模式下观察SPR13的变化情况。
(2)实验过程中请记录并思考以下内容
1程序复位之后系统处于什么模式
2记录每种模式下的初始堆栈指针以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。
3切换成用户模式之后还能否从用户模式切换到其他模式如系统模式
4用户模式下能否执行堆栈压栈操作如果能得话观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。
5观察本程序模式切换过程中SPSR有无变化并解释其原因。
五、实验情况
1、实验源代码含注释
usr_stack_legth equ 64 ;定义各个模式的栈空间长度
svc_stack_legth equ 32
fiq_stack_legth equ 16
irq_stack_legth equ 64
abt_stack_legth equ 16
und_stack_legth equ 16 area reset,code,readonly ;定义code片段reset只读entry ;设置程序入口伪指令code32 ;定义后面的指令为32位的ARM指令;设置各个寄存器中的内容
start mov r0,#0mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5mov r6,#6mov r7,#7mov r8,#8mov r9,#9mov r10,#10mov r11,#11mov r12,#12bl initstack ;跳转至initstack并且初始化各模式下的堆栈指针打开IRQ中断(将cpsr寄存器的i位清0)mrs r0,cpsr ;r0--cpsrbic r0,r0,#0x80 ;cpsr的I位置0开IRQ中断msr cpsr_cxsf,r0 ;cpsr--r0;切换到用户模式msr cpsr_c,#0xd0 ;设置11010000其中IF位置1禁止IRQ和FIQ中断T0ARM执行M[40]为10000切换到用户模式mrs r0,cpsr ;r0--cpsrstmfd sp!,{r1-r12} ;将R1-R12入栈
;观察用户模式能否切换到其他模式;切换到管理模式msr cpsr_c,#0xdf ;设置11011111其中IF位置1禁止IRQ和FIQ中断T0ARM执行M[40]为11111切换到系统模式mrs r0,cpsr ;r0--cpsrstmfd sp!,{r1-r12} ;将寄存器列表中的r1-r12寄存器存入堆栈halt b halt ;从halt跳转到halt循环initstack mov r0,lr ; r0--lr,因为各种模式下r0是相同的而各个模式不同 ;设置管理模式堆栈msr cpsr_c,#0xd3 ; 设置11010011 切换到管理模式ldr sp,stacksvc ;设置管理模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式;设置中断模式堆栈msr cpsr_c,#0xd2 ;设置11010010 切换到中断模式ldr sp,stackirq ;设置中断模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式;设置快速中断模式堆栈msr cpsr_c,#0xd1 ; 设置11010001 切换到快速中断模式ldr sp,stackfiq ;设置快速中断模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式;设置中止模式堆栈 msr cpsr_c,#0xd7 ; 设置11010111 切换到中止模式ldr sp,stackabt ;设置中止模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式;设置未定义模式堆栈 msr cpsr_c,#0xdb ; 设置11011011 切换到未定义模式ldr sp,stackund ;设置未定义模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式;设置系统模式堆栈 msr cpsr_c,#0xdf ; 设置11011111 切换到系统模式ldr sp,stackusr ;设置系统模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈满递减模式mov pc,r0 ;返回;为各模式堆栈开辟一段连续的字存储空间
stackusr dcd usrstackspace(usr_stack_legth-1)*4
stacksvc dcd svcstackspace(svc_stack_legth-1)*4
stackirq dcd irqstackspace(irq_stack_legth-1)*4
stackfiq dcd fiqstackspace(fiq_stack_legth-1)*4
stackabt dcd abtstackspace(abt_stack_legth-1)*4
stackund dcd undstackspace(und_stack_legth-1)*4;定义data段并命名area reset,data,noinit,align2
;为各模式堆栈分配存储区域
usrstackspace space usr_stack_legth*4
svcstackspace space svc_stack_legth*4
irqstackspace space irq_stack_legth*4
fiqstackspace space fiq_stack_legth*4
abtstackspace space abt_stack_legth*4
undstackspace space und_stack_legth*4end2、实验过程含结果截图及相应文字解释
实验过程中请记录并思考以下内容
1程序复位之后系统处于什么模式 由上可知系统复位后处于管理模式。
2记录每种模式下的初始堆栈指针以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。
①管理模式 由上图可知管理模式初始指针为0x8244。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8214离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
②中断模式 由上图可知中断模式初始指针为0x8344。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8314离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
③快速中断模式 由上图可知快速中断模式初始指针为0x8384。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8354离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R7存储的数值对应说明该模式下仅能压入R1-R7因为快速中断模式有自己的R8-R12。
④中止模式 由上图可知中止模式初始指针为0x83C4。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8394离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
⑤未定义模式 由上图可知未定义模式初始指针为0x8404。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x83D4离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
⑥系统模式 由上图可知系统模式初始指针为0x81C4。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8194离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
⑦用户模式 由上图可知用户模式初始指针为0x8194。 执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示可知压栈后堆栈指针变为0x8164离初始的堆栈指针0x30字节即12个字(32位系统)从内存单元的数值可以看到分别与R1-R12存储的数值对应。
3切换成用户模式之后还能否从用户模式切换到其他模式如系统模式 由上图可知当进行切换管理模式时模式仍是用户模式因此可知切换成用户模式之后不能操作CPSR返回到其他模式。
4用户模式下能否执行堆栈压栈操作如果能得话观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。
压栈前 压栈后 压栈后存储单元情况 答用户模式下可以执行堆栈压栈操作且以4个字节1个字为单位进行压栈操作压栈前堆栈区域情况如左图压栈后如右图所示对应的存储单元情况如上图。
5观察本程序模式切换过程中SPSR有无变化并解释其原因。
答除了用户模式和系统模式其余模式下都有一个私有SPSR保存状态寄存器. 用来保存切换到该模式之前的执行状态SPSR是异常模式的程序状态保存寄存器, 当特定的异常中断发生时这个寄存器存放CPSR的内容在异常中断退出时可以用SPSR来恢复CPSR但是通过观察可知整个切换过程中没有异常的发生因此SPSR没有变化。
六、总结
ARM处理器模式分别是usr用户模式fiq快速中断模式irq通用中断模式svc管理模式abt终止模式sys系统模式以及und未定义模式。也通过ARM指令实现了ARM不同模式的进入与退出切换各种处理器模式并观察各种模式下寄存器的区别。当特定的异常出现时进入相应的模式。每种模式都有某些附加的寄存器以避免异常出现时用户模式的状态不可靠。此外也使用状态寄存器到通用寄存器的传送指令MRS以及通用寄存器到状态寄存器的传送指令MSR修改状态寄存器通过“读取修改写回”三个步骤操作来实现。