电子科技大学微嵌实验版.docx
- 文档编号:28775339
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:10
- 大小:103.96KB
电子科技大学微嵌实验版.docx
《电子科技大学微嵌实验版.docx》由会员分享,可在线阅读,更多相关《电子科技大学微嵌实验版.docx(10页珍藏版)》请在冰豆网上搜索。
电子科技大学微嵌实验版
电子科技大学微嵌实验最新版
————————————————————————————————作者:
————————————————————————————————日期:
电子科技大学
实验报告
修正了MOOC和旧版答案的错误,代码使用KeiluVision5均已调试通过。
课程名称微处理器系统结构与嵌入式系统设计
实验名称ARM基础编程实验
任课教师
实验教师
姓名
学号
实验地点
分组号
时间
年
月
日
一、实验目的
1.熟悉并掌握常用ARM汇编指令
2.熟悉并掌握“C+汇编”混合编程技术
3.熟练使用ARM软件开发调试工具Keil
二、实验内容
1.学习使用Keil开发工具
2.使用ARM汇编语言,编程实现1+2+……+N累加运算功能
3.使用C调用汇编函数,实现字符串拷贝功能
4.使用汇编调用C函数,实现求和运算功能
5.使用ARM汇编语言,实现冒泡排序算法(选做)
三、实验步骤
1.实验1.1:
运行Keil,建立工程文件,单步运行调试演示示例程序,深刻理解每一条指令,观察寄存器,内存空间的变化。
2.实验1.2:
用汇编语言实现1+2+...+N的累加:
a)建立新工程,加入实验1.2文件夹中的sum.s。
b)用汇编补充算法核心部分,代码参考流程图如下图1.1所示。
c)使用单步调试,仔细观察过程中关键寄存器值的变化。
图1.1
3.实验1.3:
C调用汇编实现字符串拷贝功能:
a)建立新工程,加入实验1.3文件夹中的main.c和testfile.s(同一个工程下添加两个文件一起编译)。
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)补充完成源代码中缺失的部分,实现冒泡排序功能。
c)运行Debug进行调试
四、实验结果
1.实验1.2:
用汇编语言实现1+2+...+N的累加
核心代码如下:
ADDR0,R1
BVSSUM_END
CMPR1,R2
BHSSUM_END
ADDR1,#1
BSUN_L1
图1.2
可以看见最终结果显示在寄存器R8处,十六进制为13BA,转换成十进制为5050,实现了累加功能。
2.实验1.3:
C调用汇编实现字符串拷贝功能
核心代码如下:
LDRBR2,[R1],#1;拷贝源字符串的一个字节
STRBR2,[R0],#1;将拷贝的字节复制到目标空间
图1.3
图1.4
可以看出拷贝前srcstr是”aaaa”,dststr是”bbbb”,拷贝后srcstr是”aaaa”,dststr是”aaaa”,实现了字符串拷贝功能。
3.实验1.4:
汇编调用C实现求和1+2+...+10
核心代码如下:
MOVR0,#1
MOVR1,#2
MOVR2,#3
MOVR3,#10
BLg
MOVR8,R0
图1.5
可以看出最终结果显示在寄存器R8处,十六进制表示为0010,转换为十进制为0x10
4.实验1.5:
ARM汇编实现冒泡算法
代码如下:
AREASort,CODE,READONLY
ENTRY
start
MOVR4,#0
LDRR6,=src
ADDR6,R6,#len
LDRR7,=src
;初始化R4作为循环计数器
inner2
MOVR1,R7
CMPR6,R7
BLEouter
;将每次循环开始,正确设置R1的值为数组开始地址
;如果所有数字均已排序,即R6<=R7输出跳转到outer函数
inner
LDRR2,[R1]
LDRR3,[R1,#4]
CMPR2,R3
BGTexchange
;判断相邻数字是否符合规律,不符合跳转到exchange函数
inner1
ADDR1,R1,#4
CMPR1,R6
BLTinner
ADDR4,R4,#4
CMPR4,#len
BLEsubtraction
exchange
STRR3,[R1]
STRR2,[R1,#4]
Binner1
subtraction
SUBR6,R6,#4
Binner2
outer
LDRR1,=src
srcDCD2,4,10,8,14,1,20
AREAArray,DATA,READWRITE
lenEQU7*4
END
图1.6排序前
在star函数中获得R6地址后,首先如上图,设置权限才能正确执行程序。
图1.7排序前
图1.8排序后
地址0x0000005C-0x00000078中保存的排序后的结果正确,程序实现了冒泡法排序功能。
五、实验总结
1.此次实验用汇编和C语言实现了1~N的累加、字符串的拷贝、数字求和以及冒泡法排序这几项功能,了解了汇编语言的基础指令及其意义,学会了使用了Keil编译器编写和调试程序。
2.知道了C程序与汇编语言相互调用的规则:
∙寄存器的使用规则:
“子程序间”通过寄存器R0~R3来传递参数。
如果更多参数需要传递,则需要使用堆栈。
(这也是第二题字符串复制中使用R0和R1的原因)在“子程序中”,使用寄存器R4~R11来保存局部变量。
∙寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。
∙寄存器R13用于数据栈指针,记作SP。
寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
∙寄存器R14称为链接寄存器,记作LR。
它用于保存子程序的返回地址。
∙寄存器R15是程序计数器,记作PC。
六、实验思考题
1.Q:
ADD替换成ADDS,SUB替换成SUBS有什么影响?
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),将ADDR1,#1改为ADDR1,#2,设置R1初始值为1。
实现2+4+6+…..+2n,将ADDR1,#1改为ADDR1,#2,设置R1初始值为2.
5.Q:
实验3中如果去除汇编代码中的“EXPORTstrcopy”会有什么现象,为什么?
A:
若去除汇编代码中的“EXPORTstrcopy”,则在c语言中无法调用该函数,因为EXPORT用于声明strcopy为全局标号。
6.Q:
实验4中如果去除汇编代码中的“IMPORT…..”会有什么现象,为什么?
A:
无法调用C语言的main函数,因为该伪指令用于通知编译器要使用的标号或者变量在其他的源文件定义。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子科技大学 实验