实验一:基于ADS的C语言程序实验一、实验环境PC机一台ADS1.2集成开发环境一套二、实验目的通过实验了解使用ADS1.2编写C语言程序,并进行调试。三、实验内容在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,具体的编程规则同标准C语言。编写一个汇编程序文件Startup.s和一个C程序文件Test.c。汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后调跳转到C程序运行,这就是一个简单的启动程序。C程序使用加法运算来计算1+2+3+...+(N-1)+N的值(N0)。四、实验预习要求(1)仔细阅读《ARM嵌入式系统》中第3和4章ARM指令系统的内容。(2)仔细阅读文档《ADS集成开发环境及仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的内容。(本实验使用软件仿真)五、实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramC。(2)建立源文件Startup.s和Test.c,编写实验程序,然后添加到工程中。(3)设置工程链接地址ROBase为0x40003f00,RWBase为0x40300000。设置调试入口地址Imageentrypoint为Ox40003f00。(4)设置位于开始位置的起始代码段,如图1-1,1-2所示。在Layout栏中,如图1-1,在Placeatbeginningofimage框内,需要填写项目的入口程序的目标文件名,如,整个工程项目的入口程序是Startup.s,那么应在Object/Symbol处填写其目标文件名Startup.o,在Section处填写程序入口的起始段标号Start。它的作用是通知编译器,整个项目的开始运行,是从该段开始的。图1-1设置位于开始位置的起始代码段(1)图1-2设置位于开始位置的起始代码段(2)(5)编译链接工程,选择Project—Debug,启动AXD进行软件仿真调试。(6)在Startup.s的“BMain”处设置断点,然后全速动行程序。(7)程序在断点处停止。单步运行程序,判断程序是否跳转到C程序中运行。(8)诜择Processorviews—variables打开变量观察窗口,观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。如图1-3所示。图1-3ARM实验3的运行观察结果六、思考题(1)在实验参考程序中,Startup.s文件的作用是什么?如果没有Startup.s文件,C程序运行会出错吗?(2)实验程序中的Main()函数名是否可以更改为其他名字?(提示:Main只是一个标号。)七、参考程序;startupfileIMPORT|Image$$RO$$Limit|IMPORT|Image$$RW$$Base|IMPORT|Image$$ZI$$Base|IMPORT|Image$$ZI$$Limit|IMPORTMAIN;declarethemain()intheCProgAREAStart,CODE,READONLYENTRYCODE32ResetLDRSP,=0x50003f00;initialtheCcaseLDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR3,=|Image$$ZI$$Base|CMPR0,R1BEQLOOP1LOOP0CMPR1,R3LDRCCR2,[R0],#4STRCCR2,[R1],#4BCCLOOP0LOOP1LDRR1,=|Image$$ZI$$Limit|MOVR2,#0LOOP2CMPR3,R1STRCCR2,[R3],#4BCCLOOP2BMAINEND//mainfile#defineuint8unsignedchar#defineuint32unsignedint#defineN100uint32sum;voidMAIN(void){uint32i;sum=0;for(i=0;i=100;i++)sum+=i;while(1);}实验二:C语言调用汇编程序实验一、实验环境PC机一台ADS1.2集成开发环境一套二、实验目的掌握在C语言程序中调用汇编程序,了解ATPCS的基本规则。三、实验内容在C程序调用汇编子程序,实现两个整数的加法运算。汇编子程序的原型为:uint32Add(uint32x,uint32y)其中uint32已定义为unsignedint。四、实验预习要求(1)仔细阅读ARM公司的ATPCS的相关文档。例如ATPCS.PDF。(2)仔细阅读产品配套光盘附带文档《ADS集成开发环境及仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的内容。(本实验使用软件仿真。)五、实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramCl。(2)建立源文件Startup.s、Add.s和Test.c,编写实验程序,然后添加到工程中。(3)设置工程链接地址ROBase为0x40003f00,RWBase为0x40300000。设置调试入口地址Imageentrypoint为Ox40003f00。(4)设置工程链接选项,位于开始位置的起始代码段设置为Startup.o的Start段。图2-1设置开始位置的起始代码段(5)编译链接工程,选择Project→Debug,启动AXD进行软件仿真调试。(6)在Test.c文件中调用Add()的代码处设置断点,然后全速运行程序。(7)程序在断点处停止。使用SetpIn单步运行程序,观察程序是否转到汇编程序Add.s。(8)选择ProcessorViews→Variables打开变量观察窗口.观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。如图2-2所示。图2-2ARM实验4的运行观察结果六、思考题在实验参考程序中,如何以指针形式传递参数?(即设计“uint32Add(uint32*x,uint32*y)”函数。);Add.sEXPORTAddAREAAddc,CODE,READONLYENTRYCODE32AddLDRR5,[R0]LDRR6,[R1]ADDR0,R5,R6MOVPC,LREND//Test.c#defineuint8unsignedchar#defineuint32unsignedintexternuint32Add(uint32*x,uint32*y);uint32sum;voidMAIN(void){uint32a=5,b=6;sum=Add(&a,&b);while(1);}七、参考程序startup.s文件程序见实验3//Test.c#defineuint8unsignedchar#defineuint32unsignedintexternuint32Add(uint32x,uint32y);uint32sum;voidMain(void){sum=Add(5,4);while(1);};Add.sEXPORTAddAREAAddc,CODE,READONLYENTRYCODE32AddADDR0,R0,R1MOVPC,LREND源代码组织见图源代码组织图八.回答问题下面是一个由源程序strtest.c和scopy.s组成的混合程序项目,通过调用strcopy完成字符串复制,程序代码如下。要求阅读程序,在程序中的注释符后,说明该句程序的作用,并说明extern和EXPORT伪指令的在程序中的作用。(8分)strtest.c#includestdio.hexternvoidstrcopy(char*d,constchar*s);intmain(){constchar*srcstr=Firststring-source;chardststr[]=Secondstring-destination;printf(Beforecopying:\n);printf('%s'\n'%s'\n,srcstr,dststr);//输出源串和目标串strcopy(dststr,srcstr);//调用strcopy函数printf(Aftercopying:\n);printf('%s'\n'%s'\n,srcstr,dststr);//输出复制后的源串和目标串return0;}scopy.sAREASCopy,CODE,READONLYEXPORTstrcopystrcopyLDRBr2,[r1],#1;r1指向源串,从源串载入一个字节的字符到r2,并更新r1=r1+1STRBr2,[r0],#1;r0指向目标串,从r2保存一个字节的字符到目标串,并更新r0=r0+1CMPr2,#0;测试串尾标志\0BNEstrcopy;非零转标号strcopyMOVpc,lr;返回END