湖南工业大学ARM实验报告.docx
- 文档编号:10443413
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:15
- 大小:271.54KB
湖南工业大学ARM实验报告.docx
《湖南工业大学ARM实验报告.docx》由会员分享,可在线阅读,更多相关《湖南工业大学ARM实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
湖南工业大学ARM实验报告
ARM嵌入式系统原理及应用开发
实验报告
学院:
电气与信息工程学院
班级:
电子信息1204
指导老师:
谭会生
姓名:
学号:
实验一:
ARM汇编指令使用实验——基本数学/逻辑运算
一、实验目的
1.初步学会使用ARMADS/EmbestIDEforARM开发环境及ARM软件模拟器。
2.通过实验掌握数据传送和基本数学/逻辑运算的ARM汇编指令的使用方法。
二、实验设备
1.硬件:
PC机。
2.软件:
ADS1.2/EmbestIDE200X集成开发环境。
三、实验内容
熟悉ADS1.2/EmbestIDE200X开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。
具体实验参考程序如下:
四.实验操作步骤
1.新建工程。
先建立一个实验文件夹,如E\ARMSY\armasm1;然后运行EmbestIDE集成开发环境,选择File→NewWorkspace菜单项,弹出一个对话框,输入工程名armasm1a/armasmlb等相关内容;最后单击OK按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。
此时在工作区窗口将能打开该工作区和工程。
2.建立源文件。
选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。
编辑完后,保存文件armasmla.s。
1)armasmla.s源程序:
/*armasm1a.s*/
.EQUX,45/*定义变量X,并赋值为45*/
.EQUY,64/*定义变量Y,并赋值为64*/
.EQUSTACK_TOP,0X1000/*定义栈顶0X1000*/
.GLOBAL_START
.TEXT
_START:
/*程序代码开始标志*/
MOVSP,#STACK_TOP
MOVR0,#X/*X的值放入R0*/
STRR0,[SP]/*R0的值保存到堆栈*/
MOVR0,#Y/*Y的值放入R0*/
LDRR1,[SP]/*取堆栈中的数到R1*/
ADDR0,R0,R1
STRR0,[SP]
STOP:
BSTOP/*程序结束,进入死循环*/
.END
2).使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。
具体实验参考程序如下:
/*armasm1b.s*/
.EQUX,45/*定义变量X,并赋值为45*/
.EQUY,64/*定义变量Y,并赋值为64*/
.EQUZ,87/*定义变量Z,并赋值为87*/
.EQUSTACK_TOP,0X1000/*定义栈顶0X1000*/
.GLOBAL_START
.TEXT
_START:
/*程序代码开始标志*/
MOVR0,#X/*X的值放入R0*/
MOVR0,R0,LSL#8/*R0的值乘以2的8次方*/
MOVR1,#Y/*Y的值放入R1*/
ADDR2,R0,R1,LSR#1/*R1的值除以2再加上R0后的值放入R2*/
MOVSP,#0X1000
STRR2,[SP]
MOVR0,#Z/*Z的值放入R0*/
ANDR0,R0,#0XFF/*取R0的低八位*/
MOVR1,#Y/*Y的值放入R1*/
ADDR2,R0,R1,LSR#1/*R1的值除以2再加上R0后的值放入R2*/
LDRR0,[SP]/*Y的值放入R1*/
MOVR1,#0X01
ORRR0,R0,R1
MOVR1,R2/*Y的值放入R1*/
ADDR2,R0,R1,LSR#1/*R1的值除以2加上R0的值放入R2*/
STOP:
BSTOP/*程序结束,进入死循环*/
.END
3.添加源文件。
选择Project→AddToProject→File项或单击工程管理窗口中的相应右键快捷菜单命令,打开文件选择对话框,在工程目录下选择刚才建立的源文件armasmla.s/armasmlb.s。
4.基本设置。
选择Project→Settings…菜单项或按下快捷键Alt + F7,弹出工程设置对话框;在工程设置对话框中选择Processor属性页,按照使用要求对目标板所用处理器进行设置。
5.生成目标代码。
选择Build→Buildarmasmla菜单项或按下快捷键F7,生成目标代码。
此步骤也可以通过单击工具栏上相应按钮来完成。
6.调试设置。
选择选择Project→Settings…菜单项或按下快捷键Alt + F7,弹出工程设置对话框;在工程设置对话框中,若选择Remote页面则对调试设备模块进行设置;若选择Debug页面则对调试模块进行设置。
7.选择Debug→RemoteConnect连接软件仿真器,执行Download命令下载程序,并打开寄存器窗口。
8.打开存储器窗口,观察地址0x8000~0x801F的内容以及地址0xFF0~0xFFF的内容。
9.单步执行程序,并观察和记录寄存器与存储器值的变化。
五、实验报告
执行-START前将45赋值给X,将64赋值给Y,并定义栈顶为0X00001000,执行MOVsp,#stack_top后sp:
0x00001000,
执行MOVr0,#x后r0:
0x0000002d
执行MOVr0,#y后r0:
0x00000040
LDRr1,[sp]取堆栈中的数到R1
ADDr0,r0,r1执行前r0:
0x0000002dr1:
0x00000040
执行后:
r0:
0x0000006d
最终实现了两个数字的相加。
六.实验总结
本次实验主要是熟悉ARM汇编指令和学习使用ARMADS/EmbestIDEforARM开发环境及ARM软件模拟器。
本次为验证试验,通过本次实验掌握了基本的汇编语句,实现了基本的加法运算和基本的数学/逻辑运算。
在实验过程中记录了在但不运行时有关寄存器和存储器的值,经过查询分析,查看寄存器和存储器的值,检查结果是否正确;通过这次实验熟练掌握了软件的操作和使用,学到了很多。
实验二ARM汇编指令使用实验——存储区数据块的传送
一、实验目的
1.熟悉ARMADS1.2/EmbestIDEforARM开发环境及ARM软件模拟器的使用。
2.通过实验掌握使用LDM/STM、B、BL等指令完成较为复杂的存储区访问和分支程序的方法,学习使用条件码,加强对CPSR的认识。
二、实验设备
1.硬件:
PC机。
2.软件:
ADS1.2/EmbestIDE200X集成开发环境。
三、实验内容
设计并调试一个存储区数据块的传送程序,具体数据块的传送要求为:
将数据从源数据区snum复制到目标数据区dnum,数据的个数num假定为20,复制时以8个字为单位进行,对于最后不足8个字的数据,以字为单位进行复制。
用ARM汇编语言设计该数据块复制程序的设计思想如下:
先将源数据区的起始地址、目标数据区的起始地址以及数据个数赋给选定的寄存器R0、R1、R2,再根据每次批量/单个复制数据的个数R3确定用于数据复制的中间寄存器R4~R11,之后先将源数据区的若干个数据批量装载到中间寄存器中,再将中间寄存器的数据批量存储到目的数据存储区,随后进行数据是否复制完毕的判断,若未复制完毕,则修改有关操作数据地址,并重复前面的数据复制操作,否则,终止操作,程序结束。
四、实验操作步骤
1.新建工程。
先建立一个实验文件夹,如E\ARMSY\armasm2;然后运行EmbestIDE集成开发环境,选择File→NewWorkspace菜单项,弹出一个对话框,输入工程名ARMcode等相关内容;最后单击OK按钮,将创建一个新工程,同时创建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程。
2.建立源文件。
选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。
编辑完后,保存文件armasm2.s。
.GLOBAL_START
.TEXT
.EQUNUM,20/*定义需要复制的字数据个数NUM为20*/
_START:
LDRR0,=SRC/*将R0指向源数据区的起始地址*/
LDRR1,=DST/*将R1指向源数据区的起始地址*/
MOVR2,#NUM/*将需要复制的字数据个数存放在R2中*/
MOVSP,#0X400/*将堆栈指针SP指向#0X400*/
BLKCOPY:
MOVSR3,R2,LSR#3/*R2的值除以8的结果存入R3*/
BEQCOPYWORDS/*若Z=1,则转COPYWORDS*/
STMFDSP!
{R4-R11}/*将R4~R11的内容存入堆栈进行保护*/
OCTCOPY:
LDMIAR0!
{R4-R11}/*从源数据区装载8个字数据到R4~R11*/
STMIAR1!
{R4-R11}/*将R4~R11中的8个字数据存入目的数据区*/
SUBSR3,R3,#1/*每复制一次R3减1*/
BNEOCTCOPY/*若R3不等于0,则转移到OCTCOPY*/
LDMFDSP!
{R4-R11}/*将堆栈内容恢复到R4~R11*/
COPYWORDS:
ANDSR2,R2,#7/*计算需复制的奇数个字的个数*/
BEQSTOP/*若R2=0则停止*/
WORDCOPY:
LDRR3,[R0],#4/*将源数据区的一个字装载至R3*/
STRR3,[R1],#4/*将R3中的数据存到目的数据区*/
SUBSR2,R2,#1/*数据传输控制计数器减1*/
BNEWORDCOPY/*若R2不等于0,则转移到WORDCOPY*/
STOP:
BSTOP
.LTORG
SRC:
/*源数据区起始地址标号*/
.LONG1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
DST:
/*目的数据区起始地址标号*/
.LONG0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.END
3.添加源文件。
选择Project→AddToProject→File项,或单击工程管理窗口中的相应右键快捷菜单命令,打开文件选择对话框,在工程目录下选择刚才建立的源文件armasm2.s。
4.基本设置。
选择Project→Settings…菜单项或按下快捷键Alt+F7,弹出工程设置对话框;然后在工程设置对话框中,选择Processor属性页,对目标板所用处理器进行设置。
5.生成目标代码。
选择Build→Buildarmasm2菜单项或按下快捷键F7,生成目标代码。
也可以单击工具栏上的相应按钮来完成。
6.调试设置。
选择Project→Settings…菜单项或按下快捷键Alt+F7,弹出工程设置对话框;在工程设置对话框中,若选择Remote页面则对调试设备模块进行设置;若选择Debug页面,则对调试模块进行设置。
7.选择Debug→RemoteConnect连接软件仿真器,执行Download命令下载程序,并打开寄存器窗口。
8.打开存储器窗口,观察地址0x8054~0x80A0的内容以及地址0x80A4~0X80F0的内容。
五、实验报告
执行-START之后:
R0:
0X00008054R1:
0X000080a4R2:
0X00000014SP:
0X00004000
执行STMIAR1!
{R4~R11}后:
R0:
0X00008074R1:
0X000080a4R4~R11:
0X00000001~0X00000008
执行LDMFD之后:
SP:
0X000004000R4~R11:
0X00000000~0X000000000
实验最终完成了将数据从源数据区snum复制到目标数据区dnum。
六、实验总结
进一步熟悉了ARMADS1.2/EmbestIDEforARM开发环境及ARM软件模拟器的使用。
通过本次实验掌握使用LDM/STM、B、BL等指令完成较为复杂的存储区访问和分支程序的方法,学习使用条件码,加强对CPSR的认识,掌握了存储数据块的传送,加强了对操作命令符的认识,以及选择wire型和reg型的区别,更加熟悉和编写程序,对程序的理解也进一步加深,同时也发现了许多不足,有很多指令需进一步弄懂和多向其他人请教学习。
实验三汇编语言与C语言的相互调用实验
——随机数发生器
一、实验目的
1.阅读实验程序,观察处理器启动过程,学会使用ADS1.2/EmbestIDE辅助信息窗口来分析判断调试过程和结果。
2.学会在ADS1.2/EmbestIDE中编写、编译与调试汇编语言和C语言相互调用的程序。
二、实验设备
1.硬件:
PC机。
2.软件:
ADS1.2/EmbestIDE200X集成开发环境。
三、实验内容
使用汇编语言设计一个产生随机数的函数,然后通过C语言来调用该函数产生一系列随机数,并存放到数组中。
四、实验步骤
1.创建新的工程,工程名为armcasm。
2.按照参考程序编写源代码文件,并分别保存为randtest.c、init.s、random.s和ldscript,然后把它们加入工程中。
1).randtest.c参考源代码
/*随机数产生测试例子,程序通过调用random..s中的函数randomnumber来生成随机数*/
//#include
externunsignedintrandomnumber(void);
intmain()
{
inti;
intnTemp;
unsignedintrandom[10];
for(i=0;i<10;i++)
{
nTemp=randomnumber();
random[i]=nTemp;
}
return(0);
}
2).init.s参考源代码
/*系统初始化程序,用于硬件初始化设置,并转入外部的随机数产生主函数main()*/
#程序入口,ARM汇编
#.ARM
.GLOBAL_START
.TEXT
_START:
BRESET_HANDLER
UNDEFINED_HANDLER:
BUNDEFINED_HANDLER
SWI_HANDLER:
BSWI_HANDLER
PREFETCH_HANDLER:
BPREFETCH_HANDLER
ABORT_HANDLER:
BABORT_HANDLER
NOP/*RESERVEDVECTOR*/
IRQ_HANDLER:
BIRQ_HANDLER
FIQ_HANDLER:
BFIQ_HANDLER
RESET_HANDLER:
LDRSP,=0X00002000
.EXTERNMAIN
LDRR0,=MAIN
MOVLR,PC
BXR0
#-LOOPFOREVER
END:
BEND
.GLOBAL__GCCMAIN
__GCCMAIN:
MOVPC,LR
.END
3).random.s参考源代码
#这是一个使用33位反馈移位寄存器产生伪随机数的函数产生器RANDOMNUMBER
#AREA|Random$$code|,CODE,READONLY
.GLOBALRANDOMNUMBER
RANDOMNUMBER:
#ONEXIT:
#A1=32伪随机数的低位数据
#A2=32伪随机数的高位数据
LDRIP,SEEDPOINTER
LDMIAIP,{A1,A2}
TSTA2,A2,LSR#1
MOVSA3,A1,RRX
ADCA2,A2,A2
EORA3,A3,A1,LSL#12
EORA1,A3,A3,LSR#20
STMIAIP,{A1,A2}
MOVPC,LR
SEEDPOINTER:
.LONGSEED
.DATA
.GLOBALSEED
SEED:
.LONG0X55555555
.LONG0X55555555
#END
4).链接脚本文件ldscript参考源代码
SECTIONS
{ .=0x0;
.text:
{*(.text)}
.data:
{*(.data)}
.rodata:
{*(.rodata)}
.bss:
{*(.bss)}
}
3.编译→汇编器设置→链接器设置→调试器,并编译、链接工程。
五、实验报告
第一个randtest.c程序主要是实现生成随机数,第二个init.s程序主要实现硬件的初始化,第三个random.s程序是主程序,主要实现使用一个33位反馈移位寄存器产生伪随机数的函数产生器。
最后一个为连接脚本文件参考代码。
链接脚本程序主要是描述编写的文件中的各个部分如何摆放在输出文件中,并控制这些文件如何定位这些输出文件。
链接脚本文件必须以关键词SECTIONS开始,紧接着式大括号,后面是所有需要输出地描述部分,最后是闭括号收尾,并且全部使用半角符号。
本ldscript文件中各语句的含义是:
“.=0x0”为将当前地址计数器指向0x0,“.text:
{*(.text)}”为程序代码必须放在当前的地址计数器指向的0x0处,“.data:
{*(.data)}”为已经初始化的数据必须放在当前的地址计数器指向的地方(紧接text区域后),“.rodata:
{*(.rodata)}”为只读数据必须放在当前的地址计数器指向的地方(紧接data区域后),“.bss:
{*(.bss)}”为未初始化的数据必须放在当前的地址计数器指向的地方(紧接rodata区域后)。
六、实验总结
通过本次实验,观察处理器启动过程,学会了使用ADS1.2/EmbestIDE辅助信息窗口来分析判断调试过程和结果。
学会了在ADS1.2/EmbestIDE中编写、编译与调试汇编语言和C语言相互调用的程序,通过这次实验发现了很多的不足,还需要更加的努力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 湖南 工业大学 ARM 实验 报告