arm实验报告最终版文档格式.docx
《arm实验报告最终版文档格式.docx》由会员分享,可在线阅读,更多相关《arm实验报告最终版文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
2、掌握简单的ARM汇编语言的程序设计;
3、了解集成开发环境EmbestIDE及其开发软件的应用;
2、实验环境
EmbestIDE应用于嵌入式软件开发的新一代图形化的集成开发环境,它包括一套完备的面向嵌入式系统的开发和调试工具。
其开发软件EmbestIDEforARM是集编辑器、编译器、调试器、工程管理器(projectmanager)于一体的高度集成的窗口环境,用户可以在EmbestIDE集成开发环境中创建工程、编辑文件、编译、链接、运行,以及调试嵌入式应用程序。
3、实验步骤
1)新建工程:
运行EmbestIDE集成开发环境,选择菜单项File→NewWorkspace,如图一,系统弹出一个对话框,键入文件名“wj”,如图二,点击OK按钮。
将创建一个新工程,并同时创建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程.。
(老师提醒:
不要放入Bin文件夹中)
图一图二
2)建立源文件:
点击菜单项File→New,如图三,系统弹出一个新的文本编辑窗,输入源文件代码。
编辑完后,保存文件“wj.s”后缀,如图三,四。
图三图四
3)添加源文件:
选择菜单项Project→AddToProject→Files,在工程目录下选择刚才建立的源文件.s后缀文件,如图五,图六,图七。
图五图六
图七
4)基本配置:
选择菜单项Project→Settings,弹出工程设置对话框。
在工程设置对话框中。
1选择Processor设置对话框,按照图八所示,进行配置:
图八
2选择Remote设置对话框,按照下图九所示,进行配置:
图九
3选择
最右边一个进行编译,显示如图十,则编译成功。
图十
4选择Project→Settings→Debug设置对话框,按图十一,十二,十三所示,进行配置:
图十一
图十二
图十三
5选择
最右边一个进行编译,显示如图十四,则编译成功。
5)选择菜单项Debug→RemoteConnect进行连接软件仿真器,将存储器地址改为0x1000,如图十五,执行Debug→Download命令下载程序,并打开寄存器窗口。
打开memory窗口,按F10进行单步跟踪,观察寄存器的数据变化并分析。
按照老师所说的,将源程序的addr0,r0,r1中的add改为adds,并设置R0,R1分别为0xffffff88和0x000000aa再次观察,得到如下结果:
图十五
4、实验内容:
1.(原题目第二题)编写程序将R2的高8位传送到R3的低8位(不考虑R3的其他位)
源程序:
.global_start
.text
_start:
movr2,#0x66000000/*把第一个立即数送进r2*/
movr3,#0x88000000/*把第二个立即数送进r3*/
andr0,r2,#0xff000000/*取r2高8位到r0*/
andr3,r3,#0xffffff00/*r3低8位清零*/
orrr3,r3,r0,lsr#24/*r0逻辑右移24位后与r3相或,结果送进r3*/
stop:
bstop
.end
调试结果:
1Download下载:
2取r2高8位到r0:
3r3低8位清零:
4r0逻辑右移24位后与r3相或,结果送进r3:
2.(原题目第三题)编程实现64位的加法运算,要求【R1:
R0】+【R3:
R2】结果放回【R1:
R0】。
.global_start
movR0,#24/*R0=24*/
movR1,#12/*R1=12*/
movR2,#16/*R2=16*/
movR3,#18/*R3=18*/
ADDSR0,R0,R2/*R0等于低32位相加,并影响标志位*/
ADCR1,R1,R3/*R1等于高32位相加,并加上低位进位*/
1.Download下载:
1单步跟踪后的结果:
2存储器的结果显示:
③寄存器的结果显示:
R0←RO+R2;
R1←R1+R3:
3.(原题目第七题)编写一段程序计算10!
.equnum,10
movr0,#num
movr1,r0
s1:
subsr1,r1,#1/*把r1-1放入r1*/
mulr0,r1,r0/*r0*r1放入r0*/
cmpr1,#1/*比较R1与1的大小*/
beqstop
bnes1
分析调试:
1第一次执行S1,r1=10-1=9,10*9=90,换成16进制是5a。
2第二次执行S1,r1=9-1=8,10*9*8=720,换成16进制是2d0。
③依次执行S1,到r1=1,停止,10*9*8……*1=3628800,换成16进制是375f00。
4.(原题目第八题)串拷贝(R0指向源数据的首地址,R1指向目的数据串的首地址)
.EQUNUM,8
LDRR0,=srcstr/*指向源数据串R0*/
LDRR1,=dststr/*指向目标数据串R1*/
movR3,#NUM/*R3=8*/
movLR,PC/*返回*/
Bstrcopy/*调用串拷贝子程序*/
bstop
strcopy:
/*字符串的复制*/
LDRBR2,[R0],#1/*装载字节同时更新地址*/
STRBR2,[R1],#1/*存储字节同时更新地址*/
SUBSR3,R3,#1
CMPR3,#0/*判断是否结束*/
BNEstrcopy/*不是,则继续*/
MOVPC,LR/*返回*/
.data
srcstr:
.long1,2,3,4,5,6,7,8/*定义源数据串*/
dststr:
.long8,7,6,5,4,3,2,1/*定义目的字符串*/
1单步跟踪后的结果及存储器的结果显示:
2.存储器结果显示
寄存器的结果显示:
5、实验体会心得:
这是第一次接触ARM与嵌入式实验,在此次实验过程里,我发现实验课比理论学习课有趣得多,因为老师一边讲解怎么使用软件,一边询问我们相关知识点,不仅使我们记得模糊的理论知识变更加清晰确切了,而且也在对软件的学习实践中,增加了浓厚的兴趣,真正实现了手把手教的详细教学。
认真听老师讲,积极主动去思考,我发现学习起来,并没有想象中的那么难。
不懂的问题,不断去尝试调试,并请教老师,可以有很多收获。
以下是本次试验中的学习收获:
1.为何要将存储器地址改为0x1000,而不是从0x0000开始(这是老师问到我的问题)
2.00系列可以存放程序的范围,分为四个空间内部程序存储器地址范围0000H-0FFFH共4KB,外部程序存储器0FFFH-0FFFFH共64KB;
内部数据存储器00H-FFH共256个字节(其中包括低128字节和特殊功能寄存器SFR128个字节),外部数据存储器可扩展至64KB。
由于异常向量放在0~64字节中,系统要用到,所以为了避免冲突,选用从0x1000开始的地址,即从4K开始的地址。
2.littleEndian/BigEndain
littleEndian就是低位字节排放在内存的低端,高位字节排放在内存的高端。
而BigEndain正好相反。
3.Add/Adds的区别
Add是不影响标志位的加法算数运算指令,即操作结果不更新CPSR中的相应条件标识位;
而Adds是影响标志位加法算数运算指令,即操作结果会更新CPSR中的相应条件标识位。
4.进位和溢出是两个不同的概念
溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;
溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
5.程序书写中注意.global_start中间是有空格的,而不是相连的。
6.因为是单步调试的,所以要注意先连续按键F10三次,再去修改Rigester中的数据。
7.不仅可以用F10,也可以用F11进行单步调试。
8.调试过程中遇到的问题如:
@1:
于是我把程序代码改写为stop:
bstop,即写为一行,然后保存,结果如下:
@2.程序中偶尔还会遇到问题如下:
于是我重新建立项目文件,分类安放文件夹的位置,就慢慢改正完成好了。
@3
这是由于没有将文件添加到项目文件中引起的。
@4
而这往往是由于配置过程中过快,不细心,最后一行的Builttools忘了进行配置为GNUTOOLSFORARM引起的。
改正后结果:
@5.
这是由于没有将symbol和download文件加入导致的,一方面是由于自己的粗心,一方面也是由于对软件使用的熟练程度不够,以致于不能清晰的去做每一步,总是看着错误提示,才知道哪里错了,再去加以改正。
当然此次实验中的程序源文件,是在同学们的帮助下,书上,以及网络资源的查阅中慢慢写出的,历时长久,但还是很欣慰,因为感觉自己对一向生涩难懂的ARM有了些许的收获和进一步的提高。