《北京联合大学计算机嵌入式实验报告123.doc》由会员分享,可在线阅读,更多相关《北京联合大学计算机嵌入式实验报告123.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、北京联合大学嵌入式系统设计与应用实验报告学 院: 信息学院 专 业:计算机科学与技术 课 程: 嵌入式系统 班 级: 姓 名: 学 号: 2015年10月14日目录实验二 汇编指令实验1一、实验目的和任务1二、实验原理1三、程序代码和结果分析2四、实验总结6实验三 C语言和ARM汇编混合编程7一、实验目的和任务7二、实验原理7三、程序代码和结果分析7四、实验总结12实验一 ADS1.2集成开发环境实验13一、实验目的和任务13二、 实验原理13三、程序代码和分析13四、实验总结17实验二 汇编指令实验一、实验目的和任务目的:(1)了解ADS 1.2 集成开发环境及ARMulator 软件仿真。
2、(2)掌握ARM7TDMI 汇编指令的用法,并能编写简单的汇编程序。(3)掌握指令的条件执行和使用LDR/STR 指令完成存储器的访问。任务:(1) 使用LDR 指令读取0x40003100上的数据,将数据加1,若结果小于10 则使用STR 指令把结果写回原地址,若结果大于等于10,则把0写回原地址。然后再次读取0x40003100 上的数据,将数据加1,判断结果是否小于10周而复此循环。 (2) 求从 1 开始连续 10 个奇数之和,并将结果存放在名字为 SUM 的字存储单元中。编写 ARM 汇编程序并加注释,调试并记录运行结果。程序要定义数据段存放结果二、实验原理ARM指令格式S , ,
3、operand2opcode:指令助记符,如ADD, LDR, STRcond:执行条件,如NE, EQS:是否影响CPSR的值Rd:目标寄存器Rn:第一操作数寄存器operand2:第二操作数条件执行当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行,当指令的执行条件满足时,指令被执行,否则忽略条件码每一条ARM指令包含4位的条件码,位于指令码的最高4位31:28。条件码共有15种,每种条件码可用两个字符表示,这两个字符可添加在指令助记符的后面实验中用到的ARM指令集1.跳转指令在ARM程序中有两种方法可以实现程序的跳转,直接向程序计数器PC写入
4、跳转地址值,可以实现在4GB的地址空间中的任意跳转跳转指令包括以下4条指令B跳转指令BL带返回的跳转指令BX带状态切换的跳转指令 BLX带返回和状态切换的跳转指令2.数据处理指令数据处理指令可分为数据传送指令、比较指令和算术逻辑运算指令。数据传送指令进行数据的传输。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。算术逻辑运算指令完成常用的算术与逻辑的运算。该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。3. 加载/存储指令ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据。常用的加载存储指令如下:LDR字数据加载指令LDRB字节数据加载指令
5、LDRH半字数据加载指令STR字数据存储指令STRB字节数据存储指令STRH半字数据存储指令 LDM批量数据加载指令STM批量数据存储指令4.异常指令ARM微处理器所支持的异常指令:SWI软件中断指令SWI 0x0 ; 调用0号软中断SWI 0x12 ; 调用12号软中断BKPT (break point)断点中断指令BKPT 0x00ff产生软件断点中断,用于程序的调试三、程序代码和结果分析任务(1)COUNT EQU 0x40003100 AREA Example2,CODE,READONLY ;定义代码段,名字为Example2,属性为READONLY ENTRY ;程序入口 CODE3
6、2;32位ARM指令START LDR R1,=COUNT ;R1=0x40003100 MOV R0,#0 ;R0=0 STR R0,R1 ;将地址单元40003100的内容改为0 LOOP LDR R1,=COUNT ;R1=0x40003000 LDR R0,R1 ;R1=0x40003000存储单元的内容 ADD R0,R0,#1 ;R0=R0+1 CMP R0,#10 ;比较R0和10 MOVHI R0,#0 ;若R010,R0=0 STR R0,R1 ;R0的内容存储到地址为0x40003000的存储单元 B LOOP ;跳转指令 END程序还未运行时,地址0x40003100的存
7、储单元的内容为10第一次循环前,R1的内容为存储单元地址,R0=0,STR RO,R1执行后0x40003000的内容变为0第一次循环,R1=0x40003000,为存储单元地址,该单元内容加载到R0,R0=0,R0=R0+1=1,R0的内容小于10,故R0不置零,将R0的值写回原地址,值为01第二次循环完后,R0的值为2,存储单元内容为02,继续循环。直到循环次数大于10,MOVHI R0,#0,R0=0,将存储单元内容置为00,如上图,然后在继续无限循环上述过程。任务(2) AREA BLOCKDATA,DATA,READWRITESUM DCD 0 ;分配一个连续的字存储单元,名字为SU
8、M,赋初值为0 AREA Example,CODE,READONLY ENTRY CODE32 MOV R0,#10 ;R0=10存放循环次数 MOV R1,#0 ;R1=0 存放累加和 MOV R2,#1 ;第一个加数为1NEXT ADD R1,R1,R2 ;R1=R1+R2 ADD R2,R2,#2 ;加数加2 SUBS R0,R0,#1 ;执行个数减1 BNE NEXT ;不为0跳转NEXT LDR R4,=SUM ;获取SUM的地址,存放在R4中 STR R1,R4 ;将R1中的结果存放到 MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456 END执行结
9、束后,R4中存放的是结果所在的地址,根据R4中的地址查询存储单元,结果为64,正确。四、实验总结本次实验编写了简单的汇编程序指令,对程序进行编译连接,最终生成执行文件,对程序进行单步执行,可看到在每一步执行过程中,寄存器内容的变化情况,和程序所分得的地址单元。通过本次试验,回顾了在学习组成原理和微机原理时候使用的集成开发软件使用方法,并了解ADS 1.2 集成开发环境,了解了汇编程序的开发过程,掌握了ARM7TDMI 汇编指令的用法,并能编写简单的汇编程序,学会了指令的条件执行和使用LDR/STR 指令完成存储器的访问。能够在ADS环境下进行编辑、编译、连接程序。但对于DOS环境下的汇编程序的
10、编辑、编译、连接使用还不是很熟悉。实验三 C语言和ARM汇编混合编程一、实验目的和任务目的:掌握C语言和ARM汇编混合编程方法。任务:C语言和汇编混合编程,实现字符串拷贝。二、实验原理ARM体系结构支持C与汇编语言的混合编程。汇编语言与C的混合编程通常有以下几种方式:在C代码中嵌入汇编指令C语言程序调用汇编函数汇编程序调用C函数在以上的几种混合编程技术中,必须遵守一定的调用规则:这里所指的是ATPCS规则,PCS即Procedure Call Standard(过程调用规范),ATPCS即ARM-THUMB procedure call standard。PCS规定了应用程序的函数可以如何分开
11、地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。各寄存器的使用规则(1)子程序通过寄存器R0R3来传递参数。 这时寄存器可以记作: A0A3 ,被调用的子程序在返回前无需恢复寄存器R0R3的内容。(2)在子程序中,使用R4R11来保存局部变量,这时寄存器R4R11可以记作:V1V8。如果在子程序中使用到V1V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。(3)寄存器R13用作数据栈指针,记做SP;在子程序中寄存器R13不能用做其他用途。 寄存器SP在进
12、入子程序时的值和退出子程序时的值必须相等。(4)寄存器R14用作连接寄存器,记作lr ;它用于保存子程序的返回地址。(5)寄存器R15是程序计数器,记作PC ;它不能用作其他用途。在C程序中调用汇编文件中的函数,主要工作有两个:一是在C中声明函数原型,并加extern关键字;二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,汇编最后用MOV PC,LR返回。在汇编中调用C的函数,需要在汇编中使用伪指令IMPORT 声明将要调用的C函数。三、程序代码和结果分析(一)调试运行“在C代码中嵌入汇编指令”程序,并记录运行结果:#include void my_strcpy(con
13、st char *src,char *dest) char ch; _asm ;以下为汇编指令 LOOP: LDRB ch,src,#1 ;将src所指向的存储单元内容放入ch,src=src+1 STRB ch,dest,#1 ;将ch复制到dest所指向的存储单元,dest=dest+1 CMP ch,#0 ;比较ch和0 BNE LOOP ;若不相等,继续执行循环 int main() char *a=hello! ; /源字符串 char b32; /目的字符串 my_strcpy(a,b); /调用复制函数 printf(copyed:%s,b); return 0;程序分析:该程序
14、为C代码中嵌入汇编指令。src为源字符串第一个字母在内存中的地址,dest则指向目的字符串在内存中的第一个存储单元,调用汇编程序时将源字符串的一个字符赋给ch,字符串中每个字符占一个字节的存储单元,所以将src加1,指向源字符串的第二个字符,然后将ch的值放在dest指向的存储单元中,并将dest的值加1,指向下一个存储单元。循环上述过程直到字符串中所有的字符都复制完成,此时src指向的单元为0,ch=0时跳出循环,复制完成。(二)调试运行“汇编程序调用C函数”,程序,并记录运行结果:汇编文件 AREA ASMFILE,CODE,READONLY IMPORT cFun ENTRY MOV R
15、0,#11 ;R0=11 MOV R1,#22 ;R1=22 MOV R2,#33 ;R2=33 BL cFun ;跳转调用C文件函数cFun ENDC文件int cFun(int a,int b,int c) return a+b+c;结果截图:单步执行,R0=11,R1=22,R2=33,BL cFun,调用C函数文件,跳转到执行C程序,如下返回结果,结果R0的值为和,0x42,对应十进制为66(三)在现有字符串拷贝(C 语言调用汇编程序)源程序的基础上,实现int类型数据的拷贝。编写ARM汇编程序并加注释,调试并记录运行结果。提示:源数字可用数组定义,如int s4;并对数组元素进行初始
16、化,s0=1;s1=2;s2=3;s4=0,同样定义目标数组d4并初始化为0。注:一个int型数字占4个存储单元。验证是否拷贝成功,利用for循环显示目标数组内容。汇编文件: AREA ASMFILE1,CODE,READONLY;定义代码段 EXPORT asm_strcpy ;导出汇编程序asm_strcpyLOOP LDRB R4,R0,#4 ;将以R0的内容为地址的存储空间内容送到R4, R0=R0+4 CMP R4,#0 ;比较R4和0 BEQ OVER ;若不相等则结束 STRB R4,R1,#4 ;将R4的内容放回存储单元 B LOOP ;循环OVER MOV PC,LR ;将连
17、接寄存器的地址赋给PC,程序返回原任务执行ENDC文件:#includeextern void asm_strcpy(const int *src,int *dest); /声明外部函数int main() int i=0; const int s4=1,2,3,4; /原数组 int d4=0; /目的数组 asm_strcpy(s,d); /调用汇编函数 for(i=0;i4;i+) /循环输出目的数组d printf(%d,di); return 0;结果截图:程序分析:该程序为C语言调用汇编文件。R0的内容为源数组第一个整数在内存中的地址,R1则指向目的数组在内存中的第一个存储单元,调
18、用汇编程序时将源数组的第一个整数赋给R4,整型占4个字节的存储单元,所以将R0加4,指向源数组的第二个整数,比较R4即源数组中取出的内容是否为0,为0则表示所有内容都已经复制完成,跳出循环。若不为0则将R4的值放在R1指向的存储单元中,并将R1的值加4,指向下一个存储单元。循环上述过程直到数组中所有的整数都复制完成,此时R4指向的单元为0,跳出循环,复制完成。(四)字符串拷贝汇编文件 AREA ASMFILE1,CODE,READONLY EXPORT asm_strcpyasm_strcpyLOOP LDRB R4,R0,#1 ;将以R0的内容为地址的存储空间内容送到R4, R0=R0+1
19、CMP R4,#0 ;比较R4和0 BEQ OVER ;若不相等则结束 STRB R4,R1,#1 ;将R4的内容放回存储单元 B LOOP ;循环OVER MOV PC,LR ;将连接寄存器的地址赋给PC,程序返回原任务执行ENDC文件#includeextern void asm_strcpy(const char *src,char *dest);int main() const char *a=hello!; /源字符串 char b10; /目的字符串 asm_strcpy(a,b); /调用函数复制 printf(copyed:%s,b); return 0;结果截图:程序分析:该
20、程序为C语言调用汇编文件。R0的内容为源字符串第一个字符在内存中的地址,R1则指向目的字符串在内存中的第一个存储单元,调用汇编程序时将源字符串的第一个字符赋给R4,字符串中每个字符占1个字节的存储单元,所以将R0加1,指向源字符串的第二个字符,比较R4即源字符串中取出的内容是否为0,为0则表示所有内容都已经复制完成,跳出循环。若不为0则将R4的值放在R1指向的存储单元中,并将R1的值加1,指向下一个存储单元。循环上述过程直到字符串中所有的字符都复制完成,此时R4指向的单元为0,跳出循环,复制完成。四、实验总结通过本次实验学习了ARM汇编语言程序设计中常见的通用伪指令及汇编语言的基本语句格式和基
21、本结构等,同时掌握了C和汇编语言的混合编程的语法格式及应用等。通过实验,感到理论课上的不少知识所学甚浅,在实际运用中会遇到一些意想不到的问题。但是,通过进一步学习与交流,我较好的完成了这次试验。这很好的补充了我在理论课上所学到的知识,同时让我有了很好的认识。由于我的水平有限和实验的时间较为紧张,有些细节还是了解的十分不是十分详细,对于较为复杂的编程以及汇编的很多技巧任然知之甚少,希望能多一些这样的实践性的教学环节,让我们更好的了解书本中知识的应用。实验一 ADS1.2集成开发环境实验一、实验目的和任务目的:(1) 了解 ADS 1.2 集成开发环境的使用方法(2) 理解实验所提供的程序的汇编语
22、句任务:(1) 建立一个新的工程。(2) 建立一个C 源文件,并添加到工程中,读懂程序代码(3) 设置文本编辑器支持中文。(4) 设置编译链接控制选项。(5) 编译链接工程。(6) 调试工程并分析结果。二、 实验原理ARM ADS是ARM平台集成开发环境,它包括两个部分,Code Warrior for ARM Developer Suit和AXD debugger,前者具有编辑,编译,链接等功能并可生成二进制文件(.bin)和可执行的映像文件(.axf)以及各源文件的目标代码(.o);后者可以装载映像文件或二进制文件到ARM平台,并可实现跟踪调试。三、程序代码和分析Test2XEQU11;
23、定义X的值为11YEQU8; 定义Y的值为8BIT23EQU(123); 定义BIT23的值为0x00800000AREAExample2,CODE,READONLY; 声明代码段Example2ENTRY; 标识程序入口CODE32; 声明32位ARM指令START; 使用MOV、ADD指令实现:R8 = R3 = X + YMOVR0,#X; R0 = XMOVR1,#Y; R1 = YADDR3,R0,R1; 即是R3 = X + YMOVR8,R3; R8 (2*X)吗?若大于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FFMOVR0,#YADDR0,R
24、0,R0,LSL #2; 计算R0 = Y + 4*Y = 5*YMOVR0,R0,LSR #1; 计算R0 = 5*Y/2MOVR1,#XMOVR1,R1,LSL #1; 计算R1 = 2*XCMPR0,R1; 比较R0和R1,即(5*Y/2)和(2*X)进行比较LDRHI R2,=0xFFFF0000; 若(5*Y/2)(2*X),则R2 (2*X),则R5 = R5&R2ORRLSR5,R5,#0x000000FF; 若(5*Y/2)(2*X),则R5 = R5|0x000000FF; 使用TST指令测试R5的bit23是否为1,并将bit6位清零TST R5,#BIT23BICR5,R
25、5,#0x00000040BSTARTENDTest3AREA TEST,CODE,READONLYENTRYCODE32;立即数寻址MOV R0,#0x1 ;立即数0x1存入寄存器R0ADD R0,R0,#0x4 ;寄存器R0中的内容加上立即数0x4 然后存入寄存器R0;寄存器寻址MOV R1,#0x2 ;立即数0x2存入寄存器R1ADD R2,R1,R0 ;寄存器R0中的内容和寄存器R1的内容相加存入寄存器R2ADD R2,R2,R0,LSL #1 ;寄存器R0中的内容逻辑左移1位加上寄存器R2的内容在存入寄存器R2;寄存器间接寻址MOV R1,#0x10 ;将立即数0x10存入寄存器R1
26、STR R2,R1 ;将寄存器R2的内容存入以寄存器R1的值为地址的存储器中SWP R0,R0,R1 ;完成寄存器R1所指向的存储器中的字数据与寄存器R0的内容交换;基址变址寻址MOV R3,#0x14 ;将立即数0x14存入寄存器R3MOV R0,#0x3 ;将立即数0x3存入寄存器R0STR R0,R3 ;将寄存器R0的内容存入寄存器R3所指向的存储器LDR R4,R1,#4 ;将寄存器R1的内容加上4所指向的存储器的字存入寄存器R4;多寄存器寻址LDMIA R1,R5,R6;相对寻址B NEXTNEXTNOPNOPNOPENDTest4:该程序完成将src为首地址的连续存储空间里的10个
27、整数复制到dst为首地址的连续20个存储空间中的功能AREABlock,CODE,READONLY;定义代码段numEQU10 ;定义num的值为10ENTRY startLDRR0,=src ;R0=src,R0存放原地址LDRR1,=dst ;R1=dst,R1存放目的地址MOVR2,#num ;R2=num=10存放循环次数blockcopyLDRR3,R0,#4 ;src指向的存储单元里的整数加载到R3,src+4指向下一个整数STRR3,R1,#4 ;R3里的整数复制到目的地址SUBSR2,R2,#1 ;R2=R2-1循环次数减一,并修改零志位BNEblockcopy ;R2不等于0
28、,表示未复制完,则继续循环B.AREABlockData,DATA,READWRITE ;数据段srcDCD 0,1,2,3,4,5,6,7,8,9 ;分配一片连续的字存储单元,并初始化为0,1,2,3,4,5,6,7,8,9dstSPACE10*4 ;分配连续的10*4个存储单元ENDTest5 数据块的复制,用LDM和STM指令做块拷贝AREABlock,CODE,READONLYnumEQU20 ;num=20,拷贝的字数ENTRYstartLDRR0,=src ;R0=srcLDRR1,=dst ;R1=dstMOVR2,#num ;R2=num=20 ,拷贝字数MOVSP,#0x40
29、0 ;设置堆栈指针blockcopyMOVSR3,R2,LSR#3 ;求八个字的倍数BEQcopywords ;少于8个字传送STMFDSP!,R4-R11 ;入栈,保存部分工作寄存器octcopyLDMIAR0!,R4-R11 ;从源装入8个字STMIAR1!,R4-R11 ;存到目的块SUBSR3,R3,#1 ;R3不为0,继续拷贝BNEoctcopy LDMFDSP!,R4-R11 ;出栈,恢复原来的值copywordsANDSR2,R2,#7 ;少于8的字拷贝BEQstop ;没有字需要拷贝wordcopyLDRR3,R0,#4 ;从源装入块STRR3,R1,#4 ;存到目的块SUBS
30、R2,R2,#1 ;计数器减一BNEwordcopy ;R2不为0,继续拷贝stopB.AREABlockData,DATA,READWRITE ;数据段srcDCD0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ;分配一片连续的字存储单元,并初始化dstSPACE20*4 ;分配一片20*4个存储区域并初始化为0END四、实验总结堆栈寻址是难点。一般使用递减堆栈。STMFD入栈指令:STMFD入栈指令:相当于STMDB(事前递减DB)FD含义:满栈降,满栈即SP要停留在最后一个进栈元素,降就是堆栈的方向是从高地址到低地址方向发展。例:STMFDSP!,R2-R
31、4,LR执行后:10H:-压栈前SP指向0CH:SP-4 -LR,先压LR08H:SP-8-R404H:SP-12-R300H:SP-16-R2,-压栈后SP指向LDMFD出栈指令:相当于LDMIA(事后递增IA)LDMFDSP!, R2-R4,LR 执行后:10H:-出栈后SP指向0CH:LR- SP+1208H:R4- SP+804H:R3- SP+400H:R2-SP-出栈前SP指向,出栈值先赋给R2第一次实验通过了创建,编写,调试运行简单的汇编程序熟悉了ADS1.2集成开发环境,学会了断点调试的方法和调试环境的基本设置。掌握了基本的汇编指令的含义,如数据处理指令,跳转指令等。掌握了ARM嵌入式处理器的基本寻址方式。