欢迎来到天天文库
浏览记录
ID:34600810
大小:745.83 KB
页数:12页
时间:2019-03-08
《实验指导书注释版exp1》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验一ARM汇编基础实验Reference:《ARM体系结构不编程》-杜春雷一、实验目的1.掌握ARM汇编指令2.学习掌握C与汇编混合编程基础3.熟练使用ARM调试工具RVDS进行调试操作二、实验内容1.熟悉ARM汇编2.用ARM汇编实现1+2+...+N3.C调用汇编实验(实现字符串拷贝功能)4.汇编调用C实验5.ARM汇编实现冒泡算法(选做)三、预备知识1.C语言、ARM汇编2.混合编程四.实验设备与工具硬件:ARM嵌入式开发平台,PC机Pentium100以上。软件:Windows操作系统,RVDS软件四、实验原理1、ARM中的C和汇编混合编程
2、在嵌入式系统开发中,目前使用的主要编程语言是C和汇编。在稍大规模的嵌入式软件中,例如操作系统,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库。尽管如此,很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编。另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器生成代码,而要手工编写汇编,达到优化的目的。而且,汇编语言是和CPU指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对
3、应汇编语言的使用也是必须的。单纯的C或者汇编编程请参考相关的书籍或者手册,这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论。1)在C语言中内嵌汇编在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过其使用与汇编文件中的指令有些不同,存在一些限制,主要有下面几个方面:a)不能直接向PC寄存器赋值,程序跳转要使用用B或者BL指令b)在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突c)R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要
4、避免直接使用这些物理寄存器d)一般不要直接指定物理寄存器,而让编译器进行分配内嵌汇编使用的标记是__asm或者asm关键字,用法如下:__asm{instruction[;instruction]…[instruction]}asm(“instruction[;instruction]”);下面通过一个例子来说明如何在C中内嵌汇编语言,#includevoidmy_strcpy(constchar*src,char*dest)/*自定义的字符串拷贝函数*/{charch;/*ch实际用来做中间(缓冲/临时)变量*/__asm/*内嵌
5、汇编的标志*/{loop:ldrbch,[src],#1/*LDRB:加载无符号字节数据;*//*src指针指向源字符串,#1表示拷贝一个字符后,src指针指向下一个字符;*/strbch,[dest],#1/*STRB:存储字节数据;*//*dest指向目的字符串,#1表示存到目的字符串后,dest指向下一个待存位置*/cmpch,#0/*将ch和立即数0迚行比较*/bneloop/*当上一步比较结果丌一样时,表示拷贝尚未结束,继续循环*/}/*当ch读到0时代表需要拷贝的字符串已读完,这时候在目的字符串末尾已经添加了0字符,这是C中字符串的结束标
6、志*/}intmain(){char*a="forgetitandmoveon!";/*C中初始化定义的字符串自动在末尾添加结束符/0*/charb[64];my_strcpy(a,b);/*传递的是指针!*/printf("original:%s",a);printf("copyed:%s",b);return0;}在这里C和汇编之间的值传递是用C的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。2)在汇编中使用C定义的全局变量内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有诸多限制,当汇编的代码较多时一般放在单独的汇编文件中。这时就需
7、要在汇编和C之间进行一些数据的传递,最简便的办法就是使用全局变量。/*cfile.c定义全局变量,并作为主调程序*/#includeintgVar_1=12;/*这实际上是一个全局变量,汇编语言文件中才能访问*/externasmDouble(void);/*声明函数原型,extern指定其函数定义在其他文件中*/intmain(){printf("originalvalueofgVar_1is:%d",gVar_1);asmDouble();printf("modifiedvalueofgVar_1is:%d",gVar_1);r
8、eturn0;}对应的汇编语言文件;calledbymain(inCfile),todoubleaninte
此文档下载收益归作者所有