实验一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寄存器的值为0MOVR8,#0;设置R8寄存器的值为0ADRR2,N;将R2寄存器的值设为数据域N的地址LDRR1,[R2];将以R2的值为地址的数据读入R1MOVR2,#0;设置R2的值为0ADRR3,C;将R3寄存器的值设为数据域C的地址ADRR5,X;将R5寄存器的值设为数据域X的地址LOOPLDRR4,[R3,R8];将R3+R8的数据读入R4LDRR6,[R5,R8];将R5+R8的数据读入R6MULR9,R4,R6;R9=R4*R6ADDR2,R2,R9;R2=R2+R9ADDR8,R8,#4;R8=R8+4ADDR0,R0,#1;R0=R0+1CMPR0,R1;比较R0和R1的值BLTLOOP;R0R1的话执行循环NDCD0X03;CDCD0X01,0X02,0X03,0X04,0X05,0X06;XDCD0X01,0X02,0X03,0X04,0X05,0X06;END程序结果:各个寄存器的结果执行结果如下:3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面程序代码:MOVR0,#100;设置R0寄存器的值为100LDRR2,=0X90018;设置R2寄存器指向地址0x90018MOVR1,#0;设置R1的值为0MOVR3,#0;设置R3的值为0LOOPADDR3,R3,R0;R3=R3+R0SUBR0,R0,#1;R0=R0-1CMPR0,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=15yEQU61;定义常量y=61stack_topEQU0X1000;定义堆栈栈顶地址为0x1000ENTRY;程序入口处MOVsp,#stack_top;将堆栈指针指向栈顶MOVr0,#x;将x的值放入r0STRr0,[sp];将r0的值压入堆栈MOVr0,#y;将y的值放入r0LDRr1,[sp];将x的值放入r1ADDr0,r0,r1;r0=r0+r1STRr0,[sp];将r0的值装入堆栈Stop;Bstop;程序结果为:r1=x+y=0x6D2.编写程序循环R4~R11进行累加8次赋值,R4~R11初始值是1~8,每次操作后把R4~R11的内容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD指令清空为0程序代码如下:XEQU1;定义常量x=1stack_topEQU0X800;定义栈顶地址ENTRY;MOVSP,#stack_top;将栈顶地址指向0x800MOVR4,#1;设置R4=1MOVR5,#2;设置R5=2MOVR6,#3;设置R6=3MOVR7,#4;设置R7=4MOVR8,#5;设置R8=5MOVR9,#6;设置R9=6MOVR10,#7;设置R10=7MOVR11,#8;设置R11=8LOOPADDR4,R4,#x;R4累加1ADDR5,R5,#x;R5累加1ADDR6,R6,#x;R6累加1ADDR7,R7,#x;R7累加1ADDR8,R8,#x;R8累加1ADDR9,R9,#x;R9累加1ADDR10,R10,#x;R10累加1ADDR11,R11,#x;R11累加1STMIASP!,{R4-R11};将R4-R11的值压入堆栈CMPR4,#9;比较R4和9的大小BLTLOOP;R49继续执行循环LDMFDSP!,{R4-R11};将R4-R11清零END;实验结果:主要实现将数据2-9,3-10,4-11……9-16压入堆栈(初始地址是0x800处开始),最后将R4-R11全部清零。3.更改实验中1中的X,Y的值,观察期结果程序代码:xEQU20yEQU120stack_topEQU0X1000ENTRYMOVsp,#stack_topMOVr0,#xSTRr0,[sp]MOVr0,#yLDRr1,[sp]ADDr0,r0,r1STRr0,[sp]StopBStopEND程序结果为:r0=x+y=140=0X8C实验三ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编的存储器加载/存储指令,及if条件、循环、循环及循环的汇编实现二、实验设备1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序三、实验内容1.理解下列程序,新建工程,加入下面的程序,并观察实验结果程序代码:NumEQU20;定义常量Num=20START;LDRr0,=src;将src数据块的开始地址存入r0中LDRr1,=dst;将dst数据块的开始地址存入r1中MOVr2,#Num;设置r2的值为20MOVsp,#0x400;堆栈指针sp指向0x400blockcopy;MOVSr3,r2,LSR#3;将r2左移3位移入r3并且影响标志位BEQcopywords;结果为0的话跳转到copywordsSTMFDSP!,{r4-r11};将r4-r11的值入栈octcopy;LDMIAr0!,{r4-r11};将src的前8个字数据存入让r4-r11STMIAr1!,{r4-r11};将r4-r11中的数据放入dst数据块中SUBSr3,r3,#1;r3=r3-1BNEoctcopy;结果不为0跳转到octcopyLDMFDSP!,{R4-R11};恢复原来的r4-r11copywords;ANDSr2,r2,#7;r2=r2&7BEQstop;结果为0跳转到stopwordcopy;LDRr3,[r0],#4;将r0指向的字数据放入r3中,r0=r0+4STRr3,[r1],#4;将r3中的数据存入到dst数据块中,r1=r1+4SUBSr2,r2,#1;r2=r2-1BNEwordcopy;不为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=r10LDRR3,=N;r3保存N的首地址STMIAR3!,{R8-R10};将r8-r10装入r3指向的内存NDCD0,0,0srcDCD1,2,3dstDCD0,0,0END程序结果:熟悉使用LDMIA,STMIA和LDR,STR指令3.使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行,使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。程序代码:实现if条件:MOVR0,#1MOVR1,#2CMPR0,R1BGTLOOP1BLTLOOP2LOOP1MOVR3,R0LOOP2MOVR3,R1END程序结果:实现for和while条件:MOVR1,#1MOVR3,#0MOVR2,#101;LOOPADDR3,R1,R3ADDR1,R1,#1CMPR1,R2BLTLOOPEND程序结果:实现do…while条件:MOVR0,#1MOVR1,#100MOVR3,#0LOOPCMPR0,R1BGTSTOPADDR3,R0,R3ADDR0,R0,#1BLOOPSTOPEND程序结果:实验四基于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程序,在