1、电子科技大学电子科技大学 实 验 报 告课程名称 微处理器系统结构与嵌入式系统设计实验名称 ARM汇编基础实验任课教师实验教师姓名学号实验地点分组号时间年月日一、实验目的1. 熟悉并掌握常用ARM汇编指令2. 熟悉并掌握“C汇编”混合编程技术3. 熟练使用ARM软件开发调试工具Keil二、实验内容1. 学习使用Keil开发工具2. 实现累加运算功能(汇编编程,必做)3. 实现字符串拷贝功能(C汇编,必做)4. 实现求和运算功能(C汇编,必做)5. 实现冒泡排序算法(汇编编程,选做)微处理器系统结构与嵌入式系统设计实验报告三、实验步骤1.学习使用keil开发工具1. 点击“Keil uVisio
2、n5”打开软件主窗口。2. 点击Project-New uVision Project建立新工程。3. 为新工程命名。4. 为工程选择目标器件:三星S3C2440A。5. 选择是否添加S3C2440.s启动文件:C源程序工程选“是”,汇编源程序工程选“否”。6. 在工程Source Group上点右键选择添加新工程文件。7. 选择源文件类型。8. 录入源代码并保存。9. 对工程进行build或rebuild。10. 点击debug按钮进入/退出调试,忽略代码大小限制。使用单步调试, 仔细观察过程中 关键寄存器值的变化。2.各个实验步骤实验1.1: 用汇编语言实现1+2+.+N的累加(必做)1.
3、 建立新工程,加入实验1.2文件夹中的sum.s2. 用汇编补充算法核心部分,代码参考流程图如下图所示。3. 使用单步调试,仔细观察过程中关键寄存器值的变化。实验1.2 : C调用汇编实现字符串拷贝功能(必做)1. 建立新工程,加入实验1.3文件夹中的main.c和testfile.s(同一个工程下添加两个文件一起编译)。2. 补充完成源代码中缺失的部分,实现字符串拷贝功能3. 运行Debug进行调试实验1.3: 汇编调用C实现实现求和1+2+.+N(必做)1. 建立新工程,加入实验1.4文件夹中的sum.c和testfile.s(同一个工程下添加两个文件一起编译)。2. 补充完成源代码中缺失
4、的部分,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。3. 运行Debug进行调试实验1.4:ARM汇编实现冒泡算法(选做)1. 建立新工程,加入实验1.5文件夹中的maopao.s。2. 补充完成源代码中缺失的部分,实现冒泡排序功能。3. 运行Debug进行调试四、实验结果实验1.1用ARM汇编实现1+2+n的运算。在sum.s文件中,添加如下核心代码:-SUN_L1ADD R0,R1 ;R0,R1求和BVS SUM_END ;判断是否溢出,溢出则执行SUM_END程序,求和结束CMP R1,R2 ;R1、R2作差与0进行比较 BHS SUM_END ;R1=R2,则执行
5、SUM_END程序,否则向下继续执行ADD R1,#1 ;R1增1B SUN_L1 ;循环运行SUN_L1调试过程:1. 设置N的值并赋值给R02. 将R0=N的值复制给R23. 判断N是否为0或者,改变标志位C4. 将R0,R1分别初始化为0与15. 将R0+R1赋值给R06. 判断是否溢出与R1是否大于等于R2=N,改变标志位N7. 令R1+1赋值给R18. 通过B语句返回SUN_L1函数,实现循环相加9. 此时判断到R1大于等于R2=100,改变标志位10. 跳转到SUM_END函数,并将R0的结果保存在R8中11. 出栈并返回函数,完成1到N=100的累加,结果保存在R8中实验1.2
6、: C调用汇编实现字符串拷贝功能(必做)在testfile.s文件中,添加如下核心代码:-StrcopyLDRB R2,R1,#1 ;R1对应源字符串首地址,利用寄存器间接寻址读取字符串到R2STRB R2,R0,#1 ;R0对应目的字符串首地址,利用寄存器间接寻址保存字符 CMP R2,#0BNE strcopyMOV PC,LREND ;文件结束 调试过程1. 定义源字符串数组“aaaa”2. 定义目标字符串“bbbb”3. 进入汇编程序strcopy4. 将源字符串的首地址R1赋值给R2,并让R1加一位,指示源字符串下一位的地址5. 将R2地址代表的字符赋值给目标字符串组首地址R0的内容
7、,并将R0加一位,指示目标字符串的下一位地址6. 判断R2即源字符串地址内容是否为0,即是否复制完毕,并改变标志位7. 判断标志位是否复制完毕,未复制完毕,继续返回函数循环8. 复制完四次后改变标志位9. R2=0表示已复制完毕,返回主函数,可见已将源字符串复制到目标字符串中实验1.3: 汇编调用C实现实现求和1+2+.+N(必做)在testfile2.s文件中,添加如下核心代码:通过调用C函数g()实现1+2+3+glovbl,结果存在R8中。- MOV R0,#1 ;R0赋值为1 MOV R1,#2 ;R1赋值为2 MOV R2,#3 ;R2赋值为3 MOV R3,#10 ;R3赋值为10
8、 BL g ;调用C语言中的函数g()MOV R8,R0 ;将结果存在R8中B START- 调试过程:1. 将R0赋值为12. 将R1赋值为23. 将R2赋值为34. 将R3赋值为105. 通过BL指令调用C程序g6. 执行C程序中的a+b+c+d,并将结果赋值给R07. C程序执行完,回到主程序,并将R0的值赋值给R81) 在实验1中,通过伪指令EQU,定义N的值。编译运行后,通过跟踪、调试,实现了对1+2+n的累加运算。2) 在实验二中,编译运行后,经过跟踪调试,实现在C语言中调用函数strcopy.3) 在实验中,编译运行后,经过跟踪调试,实现了在汇编语言中调用C语言中的全局变量和全局
9、函数。微处理器系统结构与嵌入式系统设计实验报告六、实验总结在本次实验中,通过汇编程序直接对ARM处理器中的寄存器进行操作,掌握了汇编程序设计的基础知识。更全面、更深入地理解了ASM处理器的工作原理,为基于ARM处理器的嵌入式硬件开发奠定良好的基础。在嵌入式软件开发过程中,通常会使用ARM汇编语言和C语言在内的多种语言,通过本次实验,初步认识了ARM汇编语言与高级程序设计语言混合编程的原理和基本方法。七、实验思考题1.ADD替换成ADDS,SUB替换成SUBS有什么影响?答:ADD指令与ADDS指令的区别在于,ADDS指令运算过程中是带进位的,运算过程中将会根据结果来更新N、Z、C和V标记位,所
10、以如果计算过程中需要进位,则二者不可交换,若不涉及进位,则无影响。SUB与SUBS类似,是用来做减法计算的。2.MOV替换成MOVNE有什么影响?答:MOV是单纯的传送指令,而MOVNE需要先判断条件NE,即要上一步计算结果不相等才执行。3.STMIA换成STMIB,STMIA换成STMDA有什么区别?答:STMIA指令完成操作后地址递增,而STMIB是指令完成前递增。STMIA指令是完成后地址递增,STMDA指令完成操作而后地址递减。 4.思考用ARM汇编实现1+3+5+(2n+1)或者2+4+6+2n。答:奇数求和:设置初始值R0=0,R1=1,令R0=R0+R1,判断是否溢出,若是,结束程序,若否再判断R1是否大于等于2n+1,若是,结束程序,若否则令R1=R1+2,再回到程序开始出执行。偶数求和:只需要令初始R0=0,R1=2即可.5.实验3中如果去除汇编代码中的“EXPORT strcopy”会有什么现象,为什么?答:编译无法通过,如果去除则C语言程序无法调用strcopy函数,EXPORT伪指令用于在程序中声明一个全局的标号,让该标号可以在其他的文件中被引用。6.实验4中如果去除汇编代码中的“IMPORT .”会有什么现象,为什么?答:如果去除则汇编语言程序无法调用C语言的main函数,IMPORT伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义了。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1