(ARM嵌入式基础篇)第9讲.ppt_第1页
(ARM嵌入式基础篇)第9讲.ppt_第2页
(ARM嵌入式基础篇)第9讲.ppt_第3页
(ARM嵌入式基础篇)第9讲.ppt_第4页
(ARM嵌入式基础篇)第9讲.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9讲 汇编程序设计,源享嵌入式教学论坛 出品,主讲人 刘凯,程序结构,1、顺序程序设计,例:通过查表操作实现数组中的第1项数据和第5项数据相加,结果保存到数组中 。,AREA Buf,DATA,READWRITE ;定义数据段Buf Array DCD 0x11,0x22,0x33,0x44 ;定义12个字的数组Array DCD 0x55,0x66,0x77,0x88 DCD 0x00,0x00,0x00,0x00 AREA Example,CODE,READONLY ENTRY CODE32 LDR R0,=Array ;取得数组Array首地址 LDR R2,R0 ;装载数组第1项字数据给R2 MOV R1,#4 LDR R3,R0,R1,LSL #2 ;装载数组第5项字数据给R3 ADD R2,R2,R3 ;R2 + R3R2 MOV R1,#8 ;R1=8 STR R2,R0,R1,LSL #2 ;保存结果到数组第9项 END,程序清单4.1,2、分支程序设计,例判读X、Y两个变量的大小,从而给变量Z赋予不同的值, MOV R0 , #76 MOV R1 , #88 CMP R0 , R1 MOVHI R2 , #100 MOVLS R2 , #50 ,/if-else结构 int x=76,y=88; if(xy) z=100; else z=50;, MOV R0 , #76 MOV R1 , #88 CMP R0 , R1 BHI Next MOV R2 , #50 B Next2 Next1 MOV R2 , #100 Next2 ,2、分支程序设计,循环结构由以下两部分组成: 1、循环体:要求重复执行的程序段部分; 2、循环结束条件:在循环程序中必须给出循环结束条件,否则程序就会进入死循环。,3、循环程序设计,在程序中,往往要求某一段程序重复执行多次,这时候就可以利用循环程序结构。,在C语言中,有for和while语句实现这两种循环。,在汇编语言中,用跳转指令实现这两种循环。, MOV R0,#0 ;初始化R0=0 MOV R2,#1 ;设置R2=0;R2控制循环次数 FOR CMP R2,#100 ;判断R2100? BHS FOR_E ;若条件失败,退出循环 ADD R0,R0,R2 ;循环体,R0=R0 + R2 ADD R2,R2,#1 ;R2=R2 + 1 B FOR FOR_E ,3、循环程序设计,例:计算1+2+3+.+100的结果,sum=0; for(i=0; i100; i+ ) sum=sum+i;,例:编写循环语句实现数据块复制。,LDR R0, =DATA_DST ;指向数据目标地址 LDR R1,=DATA_SRC ;指向数据源地址 MOV R10,#20 ;复制数据个数20N个字 ;N为LDM指令操作数据个数 LOOP LDMIA R1!,R2-R9 ;从数据源读取8个字到R2R9 STMIA R0!,R2-R9 ;将R2R9的数据保存到目标地址 SUBS R10,R10,#1 ;R10-1 BNE LOOP,3、循环程序设计,4、子程序设计,int MAX( int i,int j) ;声明子函数MAX if(ij) return(i); else return(j); void main(void) ;主函数 int a,b,c; a=19;b=20; ;给变量a、b赋初值 c=MAX(a,b); ;调用MAX子函数,把最大值给c ,例子 程序实现比较两个数,取出其最大值。,调用程序与子程序之间传送的信息为参数时称为参数传送。 参数传送有两种方法: 当参数比较少时,可以通过寄存器传送参数; 当参数比较多时,可以通过内存块或堆栈传送参数。 子程序中采用的返回语句:,4、子程序设计,MOV PC,LR ;恢复PC的值 或 STMFD SP!,R0-R7,PC ;将PC值从堆栈中返回,使用堆栈来恢复处理器的状态时,注意STMFD与LDMFD要配合使用。,编程规范,良好的书写风格具有的效果: 1、容易看懂,干净整齐,可理解性好,可维护性好; 2、具备良好的兼容性,可移植性好。(uC/OS-II),增强程序的可理解性、可维护性的方法: 1、恰当完备的注释、 2、统一合理的命名规则、 3、美观良好的编辑风格、 4、组织有序的文件结构。,1.恰当完备的注释,注释的遵循规则: 1、注释应当准确。 注释的位置应与被描述的代码相邻,并尽量避免在注释中使用缩写,不要让人对代码产生误解。 2、注释应当简明扼要。 重要复杂的代码段或代码行一定要有简明扼要的注释。 3、注释不可喧宾夺主。 注释是对代码的“提示”,但是过多的、花哨的注释会让人眼花缭乱,反而妨碍了理解。, 命名直观明了,标识符应当直观且可以拼读,可望文知意。 标识符最好采用英文单词或其组合,便于记忆和阅读。 标识符通常采用“大小写”混排的方式,如AddView。 标识符的长度应当符合“最小长度 & 最大信息”原则。变量的名字应当使用“名词”或者“形容词 + 名词”。 float count; float oldCount; float newCount; 全局函数的名字应当使用“动词”或者“动词 + 名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。 DrawBox(); / 全局函数 Box-Draw(); / 类的成员函数,2.统一合理的命名规则, 避免命名冲突,常量全用大写的字母,用下划线分割单词; #define MAX_COUNT = 100; const int MAX_LENGTH = 100; 局部变量和参数用小写字母开头的单词组合而成; BOOL flag; int drawMode; 全局变量用大写字母开头的单词组合而成; BOOL Flag; int DrawMode; 公有的函数接口定义在软件架构分析之后由分析师统一命名规则,命名可根据函数所处的软件模块领域或文件名来添加相应的前缀。 Void guiReadPiont(); /gui 图形,2.统一合理的命名规则, 命名风格一致,一旦确定了命名规则,整个软件开发的过程都应该遵循该规则,确保命名风格一致。在确定命名规则之前,尽量参考所采用的操作系统或开发工具的命名风格。 为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL 的所有库函数均以gl 开头,所有常量(或宏定义)均以GL 开头。,2.统一合理的命名规则, 程序段落风格,空行起着分隔程序段落的作用。空行得体将使程序的布局更加清晰。,例:函数之间的空行 例:函数体内的空行,3.美观良好的编辑风格,void Function1() / 空行,分隔两个函数 void Function2() ,while (condition) if (条件为真) else , 代码行风格,void Function(int x) if (condition1) if(condition2) else ,3.美观良好的编辑风格,4.组织有序的文件结构,头文件在我们组织软件结构时相当有用。公共的数据结构定义和函数声明都可以放入头文件(*.h)中,然后用一个定义文件(*.c/*.cpp)实现该头文件声明的函数,其他文件如果想使用头文件中声明的函数,只要include该头文件即可使用。,汇编语言与C/C+语言的混合编程,C/C+ +与汇编混合编程处理策略:,若汇编代码较长,可以单独写成汇编文件,最后以汇编文件的形式加入项目中,通过ATPCS规定与C程序相互调用及访问。,若汇编代码较短,则可在C/C+源文件中直接内嵌汇编语言实现混合编程;,1、内嵌汇编指令的语法格式,在ARM的C语言程序中我们可以使用关键字_asm来加入一段汇编语言的程序,格式如下:,_asm 指令;指令 /*注释*/ 指令 ,2、内嵌汇编指令的应用举例,void enable_IRQ(void) /使能中断程序 int tmp; /定义临时变量,后面使用 _asm /内嵌汇编程序的关键词 MRS tmp,CPSR /把状态寄存器加载给tmp BIC tmp,tmp,#80 /将IRQ控制位清0 MSR CPSR_c,tmp /加载程序状态寄存器 void dianable_IRQ(void) /禁止中断程序 int tmp; /定义临时变量,后面使用 _asm /内嵌汇编程序的关键词 MRS tmp,CPSR /把状态寄存器加载给tmp ORR tmp,tmp,#80 /将IRQ控制位置1 MSR CPSR_c,tmp /加载程序状态寄存器 ,1、汇编程序访问C/C+ 程序变量,在C/C+ 程序中声明全局变量; 在汇编程序使用IMPORT/EXTERN伪指令声明引用该全局变量; 使用LDR伪指令读取该全局变量的内存地址; 根据该数据的类型,使用相应的LDR指令读取该全局变量;使用相应的STR指令存储该全局变量的值。,汇编语言与C的相互调用与访问,在汇编程序中用EXPORT/GLOBAL伪指令声明该符号为全局标号, 可以被其他文件应用; C/C+ 程序中定义相应数据类型的指针变量; 对该指针变量赋值为汇编程序中的全局标号,利用该指针访问汇编 程序中的数据。,2、C/C+ 程序访问汇编程序数据,汇编语言与C的相互调用与访问,3、C程序调用汇编程序,汇编语言与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论