电子科技大学微嵌实验版

上传人:千****8 文档编号:115306360 上传时间:2019-11-13 格式:DOC 页数:10 大小:205.50KB
返回 下载 相关 举报
电子科技大学微嵌实验版_第1页
第1页 / 共10页
电子科技大学微嵌实验版_第2页
第2页 / 共10页
电子科技大学微嵌实验版_第3页
第3页 / 共10页
电子科技大学微嵌实验版_第4页
第4页 / 共10页
电子科技大学微嵌实验版_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《电子科技大学微嵌实验版》由会员分享,可在线阅读,更多相关《电子科技大学微嵌实验版(10页珍藏版)》请在金锄头文库上搜索。

1、电子科技大学微嵌实验最新版 作者: 日期:10 微处理器系统结构与嵌入式系统设计实验报告电子科技大学实 验 报 告修正了MOOC和旧版答案的错误,代码使用Keil uVision5均已调试通过。课程名称 微处理器系统结构与嵌入式系统设计实验名称 ARM基础编程实验任课教师实验教师姓名学号实验地点分组号时间年月日一、 实验目的1. 熟悉并掌握常用ARM汇编指令2. 熟悉并掌握“C汇编”混合编程技术3. 熟练使用ARM软件开发调试工具Keil二、 实验内容1. 学习使用Keil开发工具2. 使用ARM汇编语言,编程实现1+2+N累加运算功能3. 使用C调用汇编函数,实现字符串拷贝功能4. 使用汇编

2、调用C函数,实现求和运算功能5. 使用ARM汇编语言,实现冒泡排序算法(选做)三、 实验步骤1. 实验1.1:运行Keil,建立工程文件,单步运行调试演示示例程序,深刻理解每一条指令,观察寄存器,内存空间的变化。2. 实验1.2:用汇编语言实现1+2+.+N的累加:a) 建立新工程,加入实验1.2文件夹中的sum.s。b) 用汇编补充算法核心部分,代码参考流程图如下图1.1所示。c) 使用单步调试,仔细观察过程中关键寄存器值的变化。R0暂存累加和R1自增1 图1.13. 实验1.3:C调用汇编实现字符串拷贝功能:a) 建立新工程,加入实验1.3文件夹中的main.c和testfile.s(同一

3、个工程下添加两个文件一起编译)。b) 补充完成源代码中缺失的部分,分别实现1. 拷贝源字符串的一个字节到R2中;2. 将拷贝的字节复制到目标空间。c) 运行Debug进行调试。4. 实验1.4:汇编调用C实现求和1+2+.+10:a) 建立新工程,加入实验1.4文件夹中的sum.c和testfile.s(同一个工程下添加两个文件一起编译)。b) 补充完成源代码中缺失的部分,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。c) 运行Debug进行调试5. 实验1.5:ARM汇编实现冒泡算法:a) 建立新工程,加入实验1.5文件夹中的maopao.s。b) 补充完成源代码中缺失的

4、部分,实现冒泡排序功能。c) 运行Debug进行调试四、 实验结果1. 实验1.2:用汇编语言实现1+2+.+N的累加核心代码如下:ADD R0,R1BVS SUM_ENDCMP R1,R2BHS SUM_ENDADD R1,#1B SUN_L1图1.2可以看见最终结果显示在寄存器R8处,十六进制为13BA,转换成十进制为5050,实现了累加功能。2. 实验1.3:C调用汇编实现字符串拷贝功能核心代码如下: LDRB R2,R1,#1 ;拷贝源字符串的一个字节STRB R2,R0,#1 ;将拷贝的字节复制到目标空间 图 1.3 图 1.4可以看出拷贝前srcstr是”aaaa”,dststr是

5、”bbbb”,拷贝后srcstr是”aaaa”,dststr是”aaaa”,实现了字符串拷贝功能。3. 实验1.4:汇编调用C实现求和1+2+.+10核心代码如下:MOV R0,#1MOV R1,#2MOV R2,#3MOV R3,#10BL gMOV R8,R0图1.5可以看出最终结果显示在寄存器R8处,十六进制表示为0010,转换为十进制为0x104. 实验1.5:ARM汇编实现冒泡算法代码如下: AREA Sort,CODE,READONLYENTRY startMOV R4,#0LDR R6,=srcADD R6,R6,#lenLDR R7,=src;初始化R4作为循环计数器inner

6、2MOV R1,R7 CMP R6,R7BLE outer;将每次循环开始,正确设置R1的值为数组开始地址;如果所有数字均已排序,即R6=R7输出跳转到outer函数innerLDR R2,R1LDR R3,R1,#4CMP R2,R3BGT exchange;判断相邻数字是否符合规律,不符合跳转到exchange函数inner1 ADD R1,R1,#4CMP R1,R6BLT innerADD R4,R4,#4CMP R4,#lenBLE subtractionexchange STR R3,R1STR R2,R1,#4B inner1subtraction SUB R6,R6,#4B i

7、nner2outerLDR R1,=srcsrc DCD 2,4,10,8,14,1,20 AREA Array,DATA,READWRITElen EQU 7*4END图1.6 排序前在star函数中获得R6地址后,首先如上图,设置权限才能正确执行程序。图1.7 排序前图1.8 排序后地址0x0000005C-0x00000078中保存的排序后的结果正确,程序实现了冒泡法排序功能。五、 实验总结1. 此次实验用汇编和C语言实现了1N的累加、字符串的拷贝、数字求和以及冒泡法排序这几项功能,了解了汇编语言的基础指令及其意义,学会了使用了Keil编译器编写和调试程序。2. 知道了C程序与汇编语言相

8、互调用的规则: 寄存器的使用规则:“子程序间”通过寄存器R0R3来传递参数。如果更多参数需要传递,则需要使用堆栈。(这也是第二题字符串复制中使用R0和R1的原因)在“子程序中”,使用寄存器R4R11来保存局部变量。 寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。 寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。 寄存器R15是程序计数器,记作PC。六、 实验思考题1. Q:ADD替换成ADDS,SUB替换成SUBS有什么影响?

9、A:替换后,运算结果会影响标志寄存器。因为ADD、SUB不带进位与借位,ADDS、SUBS带有进位与借位,运算完成要置符号位。2. Q:MOV替换成MOVNE有什么影响?A:替换后只有在上一步比较结果为不相等的时候才会执行该指令。(“NE”属于“cond”,意义为不相等)3. Q:STMIA换成STMIB,STMIA换成STMDA有什么区别?A:换成STMIB是将每次传送后地址+4变成每次传送前地址+4,换成STMDA是将每次传送后地址+4变成每次传送后地址-4。4. Q:思考用ARM汇编实现1+3+5+(2n+1)或者2+4+6+2n。A:实现1+3+5+.+(2n+1),将ADD R1,#1改为ADD R1,#2,设置R1初始值为1。实现2+4+6+.+2n,将ADD R1,#1改为ADD R1,#2,设置R1初始值为2.5. Q:实验3中如果去除汇编代码中的“EXPORT strcopy”会有什么现象,为什么?A:若去除汇编代码中的“EXPORT strcopy”,则在c语言中无法调用该函数,因为EXPORT用于声明strcopy为全局标号。6. Q:实验4中如果去除汇编代码中的“IMPORT .”会有什么现象,为什么?A:无法调用C语言的main函数,因为该伪指令用于通知编译器要使用的标号或者变量在其他的源文件定义。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 市政工程

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号