1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,微处理器系统结构与嵌入式系统设计,第九章,ARM,程序设计,作业,必做:,9.2-9.5,、,9.8,、,9.15-9.18,选做:,9.6,、,9.7,、,9.12,、,9.14,注意,除题目明确要求外,所有的程序均采用汇编语言编写,9.2,汇编语言和,C,语言相比,各具有什么特点?,答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。汇编语言依赖于机器硬件,不同,CPU,提供的汇编指令可能有很
2、大的不同,因此汇编源程序几乎不具有移植性;但汇编语言程序主要优点是速度快、效率高,更能发挥机器硬件的长处;,C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种语言。缺点是占用资源较多,需要先将源程序通过编译成机器语言才能执行,执行效率不如汇编高。,汇编语言源程序,机器语言程序,(目标代码),汇编(汇编程序),C语言源程序,编译或解释(编译程序),3,/52,9.3,试用汇编代码完成如下,C,语言代码完成的功能。,int,gcd(int,a,int,b),while(a!=b),if(a b),a=a-b;,else,b=b-a;,return a;,汇编实现:,AREA
3、 Sub1,CODE,READ ONLY,EXPORT Sub1,CMP R0,R1,;(,R0,),=a,,(,R1,),=b,MOVEQ PC,,,LR,;相等则返回,SUBGT R0,R0,R1,;带符号数大于条件码为,GT,,无符号数为,HI,SUBLT R1,R1,R0,;带符号数小于条件码为,LT,,无符号数为,LO,LDR R2,,,=a,;,R2,指向,a,STRR0,,,R2,;更新变量,a,MOV PC,,,LR,;返回,END,9.4,宏的定义如下面的代码所示:,MICRO,$,aa,example$bb,$cc,$,dd,$,aa,CMP$cc,#0,B$dd,$bb,
4、MEND,若在汇编程序中需要调用上面定义的宏,example,,则其程序代码如下。试写出下面程序被汇编后,宏展开后的结果。,lable,example next,R3,NE,next,宏展开后的代码为:,label,CMP R3,#0,BNE next,9.5,编写一个程序段,当寄存器,R3,中数据大于,R2,中的数据时,将,R2,中的数据加,10,存入寄存器,R3,;否则将,R2,中的数据加,100,存入寄存器,R3,,并把这个程序段定义成一个代码段。,AREA ADDITION,,,CODE,,,READONLY,ENTRY,Loop,CMPR3,R2,BHIGREATER,ADDR3,R
5、2,#100,BSTOP,GREATER,ADD R3,R2,#10,STOP,END,9.6,编写一个程序段,判断寄存器,R5,中数据是否为,12,18,22,29,45,或,67,,如果是则将,R0,中数据加,1,,否则将,R0,设置为,0 xF,,并把这个程序段定义成一个代码段,AREA Comp,,,CODE,,,READONLY,ENTRY,LDR R0,,,=,dat,;寄存器,R0,指向,DataT,表中的数据列表,dat,MOV R1,#,7,;,dat,表中的数据个数,MOV R2,#0,;标志寄存器(,R2,),=0,则,R5,中数据不在,dat,表中,SUB R0,R0,
6、4,;调整比较指针,Loop,SUB R1,R1,#1,;调整比较次数,BEQ Handle,CMP R5,,,R0,#4,!,BNELoop,MOVEQ R2,,,#1,Handle,CMP R2,,,#0,ADDNE R0,R0,#1,MOVEQ R0,,,#0 xF,Stop,AREA,DataT,,,DATA,,,READWRITE,dat,DCD 12,,,18,,,22,,,29,,,45,,,67,;需要比较的数据列表,END,8,/52,9.8,试编写一个循环程序,实现从,0,开始,10,个偶数的累加。,AREA,Foud,,,CODE,,,READONLY,ENTRY,MO
7、V,R0,,,#0,;存放累加和,MOV,R1,,,#0,;存放加数,MOVR2,,,#9,;累加次数,Loop,ADD R1,R1,#2,ADD R0,R0,R1,SUBR,2,R,2,#1,;调整累加次数,BNE Loop,Stop,END,9.12,试把如下,C,函数改写成汇编语言函数。,(1),int SubXY(int x,int y),return x-y;,(2),void SubXY(int x,int y,int z),z=x-y;,(,1,),AREA,SubXY,CODE,READONLY,EXPORT,SubXY,SUB R0,,,R0,,,R1,;结果通过,R0,返回
8、MOV PC,,,LR,;返回,END,(,2,),AREA,SubXY,CODE,READONLY,EXPORT,SubXY,SUB R2,,,R0,,,R1,LDRR3,,,=z,;,R3,执行变量,z,STR R2,,,R3,;更新变量,z,MOV PC,,,LR,;返回,END,9.14,把如下汇编语言函数改写成,C,函数。,CMP R0,#1,CMPNE R1,#1,ADDEQ R2,R3,R4,C,函数为:,void,mydo(int,a,int,b,int,c,int,d,int,e),;,(R0)=a,(R1)=b,(R2)=c,;,(R3)=d,R4)=e,if(a!=1)
9、if(b=1),c=,d+e,;,9.15,阅读程序,说明如下程序完成的功能。,llsearch,CMP,R0,#0,LDRNEB,R2,R0,CMPNE,R1,R2,LDRNE,R0,R0,#4,BNE,llsearch,MOV,PC,LR,该程序功能为:,若,R00,,则将,R0,指向的字节数据读入,R2,;,若,R00,且,R1R2,,则将,R0+4,指向的双字数据存入,R0,中;,循环,直至,R0=R,1,退出子程序。,9.16,阅读程序,说明如下程序完成的功能。,strcmp,LDRB R2,R0,#1,LDRB R3,R1,#1,CMP R2,#0,CMPNE R3,#0,BEQ
10、 return,CMP R2,R3,BEQ strcmp,return,SUB R0,R2,R3,MOV PC,LR,程序功能为:,R0,指向数据串,S1,(的前一个字节单元),,R1,指向数据串,S2,(的前一个字节单元);依次比较字符串,S1,、,S2,中的字符,直至任一字符串结束;将,S1,S2,第一个不同字符(或最后一个字符)的差存入,R0,并返回;,9.17,阅读程序,说明如下程序完成的功能。,CMP R0,#maxindex,LDRLO PC,PC,R0,LSL#2,B,IndexOutOfRange,DCD Handler0,DCD Handler1,DCD Handler2,DCD Handler3,程序功能为:,实现子程序散转:若,R0,在有效范围内(小于,#,maxindex,)则跳转到,Hander0,3,所指的子程序之一。,9.18,阅读程序,说明如下程序完成的功能。,loop,LDMIA,R12!,(R0-R11),STMIA,R13!,(R0-R11),CMP,R12,R14,BLO,loop,程序功能为:,将,R12,开始向大地址方向所指的,12,个数据压入向上生成的堆栈(,R13,开始向大地址方向所指的,12,个单元)中;比较,R12,和,R14,的值,若,R12,小于,R14,则循环,否则退出程序;,






