《嵌入式系统实践上机实践报告--Thumb汇编指令和ARM工作模式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实践上机实践报告--Thumb汇编指令和ARM工作模式.docx(6页珍藏版)》请在课桌文档上搜索。
1、上机实践成绩: 创新实践成绩: 上机实践日期:上机实践时间:2学时计算机科学技术系上机实践报告课程名称:嵌入式系统实践年级:指导教师:姓名:上机实践名称:ThUmb汇编指令和学号:ARM工作模式上机实践编号:组号:1一、实验目的1. 掌握ARM处理器的ThUmb指令使用方法;2. 学会使用msr/mrs指令实现ARM处理器工作模式的切换;3. 掌握Id中如何使用命令行指定代码段起始地址;二、实验设备1. 硬件:EmbestEDUKIT-IIIPC机2. 软件:EmbestIDEforARM三、实验内容1. 使用THUMB汇编语言,完成基本reg/mem访问,以及简单的算术/逻辑运算。2. 使用
2、THUMB汇编语言,完成较为复杂的程序分支,push/pop,领会立即数大小的限制,并体会ARM-THMB的区别。3. 编写程序从ARM状态切换到ThUnlb,在ARU状态下把R2赋值为0x12345678,在ThUnlb状态下把R2赋值为0x87654321,分别观察两个状态下的CPSR、SPSR的值和各个标志位。4. 通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握ARM不同模式的进入与推出。四、实验原理1 .ARM处理器工作状态ARM处理器共有两种工作状态: ARM:32位,这种状态下执行字对准的ARM指令; Thumb:16位,这种状态下执行半字对准的ThU
3、mb指令在Thumb状态下,程序计数器PC使用位1选择另一个半字。注意:ARMThumb之间状态的切换不影响处理器的模式或寄存器的内容。ARM处理器在两种工作状态之间可以切换。1)进入ThUmb状态。当操作数寄存器的状态位0为1时,执行BX指令进入ThUmb状态。如果处理器在Thilmb状态进入异常,则当异常处理(IRQ,FIQ,ndef,Abort和SWI)返回时,自动切换到ThUmb状态。2)进入ARM状态。当操作数寄存器的状态位0为0时,执行BX指令进入ARM状态。处理器进行异常处理(IRQ,FIQ,Undef,Abort和SWI)。在此情况下,把PC放入异常模式链接寄存器中。从异常向量
4、地址开始执行也可以进入ARM状态。2 Thumb状态的寄存器集Thumb状态下的寄存器集是ARM状态下寄存器集的子集。程序员可以直接访问8个通用的寄存器(ROR7),PCzSPzLR和CPSP。每一种特权模式都有一组SP,LR和SPSR。 Thumb状态的R0R7与ARM状态的R0R7是一致的。 Thumb状态的CPSR和SPSR与ARM状态的CPSR和SPSR是一致的。 Thumb状态的SP映射到ARM状态的Rl3。Thumb状态的LR映射到ARM状态的RI4。Thumb状态的PC映射到ARM状态的PC(R15)Thumb寄存器与ARM寄存器的关系如图3-7所示。Tlnunb状态ARM状态R
5、ORO;低寄存器,高寄存器ARlRlR2R2R3R3R4R4R5R5R6R6R7R7R8R9RlORllR12SPSP(R13)LR4LR(RM)PCPC(R15)CPSRCPSRSPSRSPSR图3-7寄存器状态图3本实验涉及到的as伪操作.code1632code伪操作用于选择当前汇编指令的指令集。参数16选择ThUmb指令集,参数32选择ARM指令集。语法格式.code1632.thumb同.code16o.arm同.code32o.align对齐方式:通过添加填充字节使当前位置满足一定的对齐方式。语法格式.alignalignment)rfill,max其中alignment用于指定对
6、齐方式,可能的取值为2的次累,缺省为4。ARM7基础实验教程fill是填充内容,缺省用O填充。max是填充字节数最大值,如果填充字节超过max,就不进行对齐.示例.align4 .ARM处理器模式除用户模式外的其他模式称为特权模式。它们可以自由的访问系统资源和改变模式。其中的5种称为异常模式,即 FIQ(FastInterruptrequest); IRQ(InterruptReQuest); 管理(SUPerViSor); 中止(AbOrt); 未定义(Undefined)。当特定的异常出现时,进入相应的模式。每种模式都有某些附加的寄存器,以避免异常出现时用户模式的状态不可靠。剩下的模式是系
7、统模式。仅ARM体系结构V4以及以上的版本有该模式。不能由于任何异常而进入该模式。它与用户模式有完全相同的寄存器,然而它是特权模式,不受用户模式的限制。它供需要访问系统资源的操作系统任务使用,但希望避免使用与异常模式有关的附加寄存器。避免使用附加寄存器保证了当任何异常出现时,都不会使任务的状态不可靠。5 .程序状态寄存器前一节提到的程序状态寄存器CPSR和SPSR包含了条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保密CPSR的状态。CPSR和SPSR的格式如下:313029282726876543210
8、NZCVQDNM(RAZ)IFTMMMMM工)条件码标志:N,Z,C,V大多数指令可以检测这些条件码标志以决定程序指令如何执行2)控制位:最低8位I,F,T和M位用作控制位。当异常出现时改变控制位。当处理器在特权模式下也可以由软件改变。 中断禁止位:1置1则禁止IRQ中断;F置1则禁止FIQ中断。 T位:T=O指示ARM执行;T=I指示ThUmb执行。在这些体系结构的系统中,可自由的使用能在ARM和ThUmb状态之间切换的指令。 模式位:MO,Ml,M2,M3和M4(M4:0)是模式位.这些位决定处理器的工作模式。3)其他位程序状态寄存器的其他位保留,用作以后的扩展。6.本实验涉及到的Id命令
9、行参数-Ttextorg使用Org作为输出文件的text段的起始地址。Org必须是一个十六进制的数。五、实验步骤1 .实验A1)参考3.1.5小节实验实验A步骤1建立一个新的工程,命名为ThUmbCode:2)参考3.1.5小节实验实验A步骤2和实验参考程序编辑输入源代码,编辑完毕后,保存文件为ThUmbCode.s;3)选择PrOjeCt菜单中AddTOProjectFiles命令,或单击工程管理窗口中的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件ThUmbCOde.s;4)参考3.1.5小节实验A的步骤4进行相应设置;5)参考3.1.5小节实验A的步骤5生成目标代
10、码;6)参考3.1.5小节实验A的步骤6进行相应的设置,需要注意的是:Debug设置对话框Symbolfile设置应该修改为和工程名对应的ThUmbCOde.elf;7)选择DebUg菜单RemoteConnect进行连接软件仿真器,执行DOWnIOad命令下载程序,并打开寄存器窗口;8)记录代码执行区中每条指令的地址,注意指令最后尾数的区别;9)注意观察寄存器RO和Rl的值的变化;10)结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令和ThIJmb指令的不同;11)理解和掌握实验后,完成实验练习题。2 .实验B1)在工作区窗口工作区右键菜单,点击“AddNewProjectt
11、oWorkspace.,;参考实验A的和实验参考程序,建立工程ThUmbCOde2;2)参照实验A的步骤完成目标代码的生成与调试;注意并记录ARM指令下和ThUmb指令状态下Stmfd,Idmfd,Idmia和Stmia指令执行的结果,指令的空间地址数值,数据存储的空间大小等等3)理解和掌握实验后,完成实验练习题。3 .实验C1)参考3.1.5小节实验A的步骤1建立一个新的工程,命名为ARMMode;2)参考3.1.5小节实验A的步骤2和实验参考程序编辑输入源代码,编辑完毕后,保存文件为ARMMode.s;3)选择PrOjeCt-AddTOProjeCttfFiIeS命令,或单击工程管理窗口中
12、的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件ARMMode.s;4)参考3.1.5小节实验A的步骤4进行相应设置。5)参考3.1.5小节实验A的步骤5生成目标代码;6)在DoWnk)adaddress框内,输入下载地址应该与链接器设置中,指定的代码段起始地址相同,以保证程序能够正常执行:7)选择DebUg-RemoteConnect连接软件仿真器,执行DOWnIOad命令下载程序,并打开寄存器窗口;8)单步执行,观察并记录寄存器RO和CPSR的值的变化和每次变化后执行寄存器赋值后的36个寄存器的值的变化情况,尤其注意各个模式下R13和R14的值;9)结合实验内容和相
13、关资料,观察程序运行,通过实验加深理解ARM各种状态下寄存器的使用;10)理解和掌握实验后,完成实验练习题。六、调试过程、结果和分析1. 本次上机的内容是ThUnlb汇编指令以及ArnI的工作模式,在题目一ThUnlb状态转换以及调用子程序中,我通过观察寄存器r,门的值来进行理解,在子程序doadd中我们使用add指令对r和rl进行相加,在TSlart中调用doadd使得r的值发生变化(由10变为13)。2. 实验二比较复杂,其中涉及了多个子程序的调用。为了调试实验的结果,观察SrC中的值是否覆盖了dst中的值,我使用单步运行程序,然后分别观察内存中r和rl所指向地址的值的变化(其中r是SrC
14、所在的地址,rl是dst所在的地址),调试过程中我发现程序是一次复制4个数,本次题目中数字总数是20,刚好能被4整除,但是程序中也有对总数不能被4整除的处理。3. 对于实验三中的问题,起初我本来是想用InoV指令直接去把数字复制到r2中,可是在调试的过程中发现了溢出的错误,后来在同学的帮助下发现ThUnlb指令不能直接复制0x12345678这样大的数字。然后,我就使用了Idr指令去完成了改任务。七、总结1. 本次实验基本达到了预习所没解决的问题。问题如下:LSrC所对应的地址在预习时一直不知道是多少,上机后才发现原来这是电脑根据当时随机分配的。2对于压栈和弹栈也有了更加深刻的理解。总之,实验
15、的目的基本都达到了,如对ThUnlb指令的使用以及Arm处理工作模式的基本有了一个了解2. 对于本次上机的总体感觉基本满意,达到了所预期的目标。尤其是对于ThUnlb指令的理解更加深亥J,真正做到了把老师上课所讲的理论知识具体化。八、附件1. .global_start.text_start:,armheader:adrr,Tstart+1brnop.thumbTstart:movr,#10movr1,#3bldoaddstop:bstopdoadd:addr,r,r1movpc,Ir.end2. .global_start.text.equnum,20Setnumberofwordstobe
16、copied7_start:.armmovsp,#0x400adrr,Tstart+1bxr.thumbTstart:Idrr1=srcIdrr1,=dstmovr2,#numblkcopy:Isrr3,r2,#2beqcopywordspushr4-r7quadcopy:Idmiar!,r4-r7stmiar1!,r4-r7subr3,#1bnequadcopypopr4-r7copywords:movr3,#3andr2,r3beqstopwordcopy:Idmiar!,r3Stmiar1,r3subr2,#1bnewordcopystop:bstop.alignsrc:.long1,2
17、,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst:.long0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.end3. .global_start.textstart:.armIdrrl,=srcIdmiarl!,r2adrrOJstart+lbxr.ThumbTstart:Idmiarl!zr2stop:bstop.alignsrc:.long012345678z0x87654321.end4. .global_start.text_start:bReset_HandlerUndefined_Handler:bUndefined_
18、HandlerbSWLHandIerPrefetch_Handler:bPrefetch_HandlerAbort_Handler:bAbort_HandlernopIRQ_Handler:bIRQ_HandlerFIQ_Handler:bFIQ_HandlerSWI_Handler:movpc,IrReset_Handler:visitmen:Idrr1,=0xf0000000Idrr2,r1mrsr,spsrmovr13,#1movr14,#2mrsr,cpsrbicrO,rO,#Ox1forrrO,rO,#Ox1Omsrcpsr,rmovr13,#3movr14,#4stop:bstop.end