嵌入式实验报告.docx
- 文档编号:9577685
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:739.93KB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
实验一ARM汇编语言程序设计
一、实验目的
1.了解IAREmbeddedWorkbench集成开发环境
2.掌握ARM汇编指令程序的设计与调试
二、实验设备
1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序
三、实验容
1.熟悉IAREmbeddedWorkbench集成开发环境
2.理解以下程序,新建工程,参加下面的程序,并观察实验结果,解释程序实现的功能
分析:
该程序实现的功能是程序功能:
Y=A*B+C*D+E*F
程序代码:
AREAExaml,CODE,READONLY;定义一个代码段
ENTRY;程序入口
MOVR0,#0;设置R0存放器的值为0
MOVR8,#0;设置R8存放器的值为0
ADRR2,N;将R2存放器的值设为数据域N的地址
LDRR1,[R2];将以R2的值为地址的数据读入R1
MOVR2,#0;设置R2的值为0
ADRR3,C;将R3存放器的值设为数据域C的地址
ADRR5,X;将R5存放器的值设为数据域X的地址
LOOP
LDRR4,[R3,R8];将R3+R8的数据读入R4
LDRR6,[R5,R8];将R5+R8的数据读入R6
MULR9,R4,R6;R9=R4*R6
ADDR2,R2,R9;R2=R2+R9
ADDR8,R8,#4;R8=R8+4
ADDR0,R0,#1;R0=R0+1
CMPR0,R1;比拟R0和R1的值
BLTLOOP;R0 NDCD0X03; CDCD0X01,0X02,0X03,0X04,0X05,0X06; XDCD0X01,0X02,0X03,0X04,0X05,0X06; END 程序结果: 各个存放器的结果 执行结果如下: 3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面 程序代码: MOVR0,#100;设置R0存放器的值为100 LDRR2,=0X90018;设置R2存放器指向地址0x90018 MOVR1,#0;设置R1的值为0 MOVR3,#0;设置R3的值为0 LOOP ADDR3,R3,R0;R3=R3+R0 SUBR0,R0,#1;R0=R0-1 CMPR0,R1;将R0和R1的值比拟 BNELOOP;不相等的话继续执行循环 STRR3,[R2];将R3的值装入到R2指向的地址块中。 END 程序执行结果: 程序执行完在0x90018存入的数据是0x13ba即5050 实验二ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的根本框架,学会使用ARM的汇编语言编程; 2.掌握ARM汇编指令中的堆栈指令的操作,以与存储器的装载指令操作。 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2.集成开发环境,仿真器驱动程序。 三、实验容 1.理解以下程序,新建工程,参加下面的程序,并观察实验结果 程序代码: xEQU15;定义常量x=15 yEQU61;定义常量y=61 stack_topEQU0X1000;定义堆栈栈顶地址为0x1000 ENTRY;程序入口处 MOVsp,#stack_top;将堆栈指针指向栈顶 MOVr0,#x;将x的值放入r0 STRr0,[sp];将r0的值压入堆栈 MOVr0,#y;将y的值放入r0 LDRr1,[sp];将x的值放入r1 ADDr0,r0,r1;r0=r0+r1 STRr0,[sp];将r0的值装入堆栈 Stop; Bstop; 程序结果为: r1=x+y=0x6D 2.编写程序循环R4~R11进展累加8次赋值,R4~R11初始值是1~8,每次操作后把R4~R11的容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD指令清空为0 程序代码如下: XEQU1;定义常量x=1 stack_topEQU0X800;定义栈顶地址 ENTRY; MOVSP,#stack_top;将栈顶地址指向0x800 MOVR4,#1;设置R4=1 MOVR5,#2;设置R5=2 MOVR6,#3;设置R6=3 MOVR7,#4;设置R7=4 MOVR8,#5;设置R8=5 MOVR9,#6;设置R9=6 MOVR10,#7;设置R10=7 MOVR11,#8;设置R11=8 LOOP ADDR4,R4,#x;R4累加1 ADDR5,R5,#x;R5累加1 ADDR6,R6,#x;R6累加1 ADDR7,R7,#x;R7累加1 ADDR8,R8,#x;R8累加1 ADDR9,R9,#x;R9累加1 ADDR10,R10,#x;R10累加1 ADDR11,R11,#x;R11累加1 STMIASP! {R4-R11};将R4-R11的值压入堆栈 CMPR4,#9;比拟R4和9的大小 BLTLOOP;R4<9继续执行循环 LDMFDSP! {R4-R11};将R4-R11清零 END; 实验结果: 主要实现将数据2-9,3-10,4-11……9-16压入堆栈〔初始地址是0x800处开始〕,最后将R4-R11全部清零。 3.更改实验中1中的X,Y的值,观察期结果 程序代码: xEQU20 yEQU120 stack_topEQU0X1000 ENTRY MOVsp,#stack_top MOVr0,#x STRr0,[sp] MOVr0,#y LDRr1,[sp] ADDr0,r0,r1 STRr0,[sp] Stop BStop END 程序结果为: r0=x+y=140=0X8C 实验三ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的根本框架,学会使用ARM的汇编语言编程 2.掌握ARM汇编的存储器加载/存储指令,与if条件、循环、循环与循环的汇编实现 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序 三、实验容 1.理解以下程序,新建工程,参加下面的程序,并观察实验结果 程序代码: NumEQU20;定义常量Num=20 START; LDRr0,=src;将src数据块的开始地址存入r0中 LDRr1,=dst;将dst数据块的开始地址存入r1中 MOVr2,#Num;设置r2的值为20 MOVsp,#0x400;堆栈指针sp指向0x400 blockcopy; MOVSr3,r2,LSR#3;将r2左移3位移入r3并且影响标志位 BEQcopywords;结果为0的话跳转到copywords STMFDSP! {r4-r11};将r4-r11的值入栈 octcopy; LDMIAr0! {r4-r11};将src的前8个字数据存入让r4-r11 STMIAr1! {r4-r11};将r4-r11中的数据放入dst数据块中 SUBSr3,r3,#1;r3=r3-1 BNEoctcopy;结果不为0跳转到octcopy LDMFDSP! {R4-R11};恢复原来的r4-r11 copywords; ANDSr2,r2,#7;r2=r2&7 BEQstop;结果为0跳转到stop wordcopy; LDRr3,[r0],#4;将r0指向的字数据放入r3中,r0=r0+4 STRr3,[r1],#4;将r3中的数据存入到dst数据块中,r1=r1+4 SUBSr2,r2,#1;r2=r2-1 BNEwordcopy;不为0跳转到wordcopy处 stop; Bstop; srcDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4; dstDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; END; 程序结果: 将src的数据全部存入到dst中 2.新建工程,并自行编写程序,分别使用LDR,STR,LDMIA,STMIA操作,实现对某段连续存储单元写入数据,并观察结果 程序代码: MOVR4,#1;设置r4=1; MOVR5,#2;设置r5=1; MOVR6,#3;设置r4=1; LDRR0,=dst;R0保存dst的首地址 STRR4,[R0];将r4的值装入r0执行的存中 STRR5,[R0,#4];将r5的值装入r0+4执行的存中 STRR6,[R0,#8];将r6的值装入r0+8执行的存中 LDRR7,=src;R0保存src的首地址 LDMIAR7,{R8-R10};将r7执行的地址的数据读入r8=r10 LDRR3,=N;r3保存N的首地址 STMIAR3! {R8-R10};将r8-r10装入r3指向的存 NDCD0,0,0 srcDCD1,2,3 dstDCD0,0,0 END 程序结果: 熟悉使用LDMIA,STMIA和LDR,STR指令 3.使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行, 使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。 程序代码: 实现if条件: MOVR0,#1 MOVR1,#2 CMPR0,R1 BGTLOOP1 BLTLOOP2 LOOP1 MOVR3,R0 LOOP2 MOVR3,R1 END 程序结果: 实现for和while条件: MOVR1,#1 MOVR3,#0 MOVR2,#101; LOOP ADDR3,R1,R3 ADDR1,R1,#1 CMPR1,R2 BLTLOOP END 程序结果: 实现do…while条件: MOVR0,#1 MOVR1,#100 MOVR3,#0 LOOP CMPR0,R1 BGTSTOP ADDR3,R0,R3 ADDR0,R0,#1 BLOOP STOP END 程序结果: 实验四基于ARM的C语言程序设计 一、实验目的 1.了解ARMC语言的根本框架,学会使用ARM的C语言编程。 2.掌握C语言和汇编语言编程的相互调用。 二、实验设备 1.EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。 三、ARMC语言简介与使用规那么 1.ARM使用C语言编程是大势所趋 在应用系统的程序设计中,假设所有的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。 由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。 因此,C语言的在ARM编程中具有重要地位。 2.ARMC语言程序的根本规那么 在ARM程序的开发中,需要大量读写硬件存放器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。 C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件严密相关。 在使用C语言时,要用到和汇编语言的混合编程。 当汇编代码较为简洁,那么可使用直接嵌汇编的方法,否那么,使用将汇编文件以文件的形式参加项目当中,通过ATPCS的规定与C程序相互调用与访问。 ATPCS,就是ARM、Thumb的过程调用标准〔ARM/ThumbProcedureCallStandard〕,它规定了一些子程序间调用的根本规那么。 如存放器的使用规那么,堆栈的使用规那么,参数的传递规那么等。 在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。 而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规那么。 但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规那么。 具体来说,汇编语言的子程序应满足下面3个条件: ●在子程序编写时,必须遵守相应的ATPCS规那么; ●堆栈的使用要遵守相应的ATPCS规那么; ●在汇编编译器中使用-atpcs选项。 根本的ATPCS规定,请详见相关技术文档。 汇编程序调用C程序 汇编程序的设置要遵循ATPCS规那么,保证程序调用时参数正确传递。 在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。 在调用C程序时,要正确设置入口参数,然后使用BL调用。 C程序调用汇编程序 汇编程序的设置要遵循ATPCS规那么,保证程序调用时参数正确传递。 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。 在C语言中使用extern关键字声明外部函数〔声明要调用的汇编子程序〕。 在C语言的环境开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的存放器,一般是通过宏调用,在每个项目文件的Startup44b0/INC目录下都有一个44b.h的头文件,那里面定义了所有关于44B0的硬件存放器的宏,对宏的读写,就能操作44B0的硬件。 具体的编程规那么同标准C语言。 四、实验容 1、理解以下程序,新建工程,参加下面的程序,并观察实验结果。 程序代码: /*实现5个数的相加*/ intsum5(inta,intb,intc,intd,inte){ return(a+b+c+d+e); } ;汇编语言 IMPORTsum5;声明调用c函数 CALLSUMS STMFDSP! {LR};将LR存放器入栈 MOVR0,#1;r0=1 ADDR1,R0,R0;r1=2 ADDR2,R1,R0;r2=3 ADDR3,R1,R2;r3=5 STRR3,[SP,#-4]! ;将r3的值入栈当做第五个参数 ADDR3,R1,R1;R3=R3+R1=4 BLsum5;调用sum5 ADDSP,SP,#4;sp=sp+4 LDMFDSP,{PC} 程序结果: 实现了i+2i+3i+4i+5i的汇编语言调用c语言 2、用汇编语言实现1到100累加的函数,用C言语编写主程序,在主程序中调用所编写的汇编函数 程序代码: NAMEasmfile PUBLICsum5 SECTION.intvec: CODE (2) CODE32 sum5 ENTRY MOVR1,#1 MOVR2,#0 sum6 ADDR2,R1,R2 ADDR1,R1,#1 CMPR1,R0 BLEsum6 MOVPC,LR END #include externvoidsum5(intx); intmain(void){ constintn=100; sum5(n); return(0); } 程序结果: 总结 本次实验主要是通过对ARM的各种指令进展操作,通过对这些指令的应用,让我们学会了如何使用汇编来进展编程,掌握汇编编程和C语言编程的技巧,并且能够熟练的使用汇编语言,深刻理解ARM的工作。 并且培养了我们写代码的能力以与对代码的阅读能力和修改能力。 为我们在以后的学习和生活中更实用ARM,利用汇编进展编程奠定了一定的根底!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)