资源描述:
《习题答案ARM程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、微处理器系统结构与嵌入式系统设计第九章ARM程序设计作业必做:9.2-9.5、9.8、9.15-9.18选做:9.6、9.7、9.12、9.14注意,除题目明确要求外,所有的程序均采用汇编语言编写9.2汇编语言和C语言相比,各具有什么特点?答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。汇编语言依赖于机器硬件,不同CPU提供的汇编指令可能有很大的不同,因此汇编源程序几乎不具有移植性;但汇编语言程序主要优点是速度快、效率高,更能发挥机器硬件的长处;C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用
2、的一种语言。缺点是占用资源较多,需要先将源程序通过编译成机器语言才能执行,执行效率不如汇编高。汇编语言源程序机器语言程序(目标代码)汇编(汇编程序)C语言源程序编译或解释(编译程序)3/529.3试用汇编代码完成如下C语言代码完成的功能。intgcd(inta,intb){while(a!=b)if(a>b)a=a-b;elseb=b-a;returna;}汇编实现:AREASub1,CODE,READONLYEXPORTSub1CMPR0,R1;(R0)=a,(R1)=bMOVEQPC,LR;相等则返回SUBGTR0,R0,R1;带符号数大于条
3、件码为GT,无符号数为HISUBLTR1,R1,R0;带符号数小于条件码为LT,无符号数为LOLDRR2,=a;R2指向aSTRR0,[R2];更新变量aMOVPC,LR;返回END9.4宏的定义如下面的代码所示:MICRO$aaexample$bb,$cc,$dd$aaCMP$cc,#0B$dd$bbMEND若在汇编程序中需要调用上面定义的宏example,则其程序代码如下。试写出下面程序被汇编后,宏展开后的结果。lableexamplenext,R3,NE…next…宏展开后的代码为:labelCMPR3,#0BNEnext9.5编写一个程序
4、段,当寄存器R3中数据大于R2中的数据时,将R2中的数据加10存入寄存器R3;否则将R2中的数据加100存入寄存器R3,并把这个程序段定义成一个代码段。AREAADDITION,CODE,READONLYENTRYLoopCMPR3,R2BHIGREATERADDR3,R2,#100BSTOPGREATERADDR3,R2,#10STOP…END9.6编写一个程序段,判断寄存器R5中数据是否为12,18,22,29,45或67,如果是则将R0中数据加1,否则将R0设置为0xF,并把这个程序段定义成一个代码段AREAComp,CODE,READON
5、LYENTRYLDRR0,=dat;寄存器R0指向DataT表中的数据列表datMOVR1,#7;dat表中的数据个数MOVR2,#0;标志寄存器(R2)=0则R5中数据不在dat表中SUBR0,R0,#4;调整比较指针LoopSUBR1,R1,#1;调整比较次数BEQHandleCMPR5,[R0,#4]!BNELoopMOVEQR2,#1HandleCMPR2,#0ADDNER0,R0,#1MOVEQR0,#0xFStop……AREADataT,DATA,READWRITEdatDCD12,18,22,29,45,67;需要比较的数据列表EN
6、D8/529.8试编写一个循环程序,实现从0开始10个偶数的累加。AREAFoud,CODE,READONLYENTRYMOVR0,#0;存放累加和MOVR1,#0;存放加数MOVR2,#9;累加次数LoopADDR1,R1,#2ADDR0,R0,R1SUBR2,R2,#1;调整累加次数BNELoopStop……END9.12试把如下C函数改写成汇编语言函数。(1)intSubXY(intx,inty){returnx-y;}(2)voidSubXY(intx,inty,intz){z=x-y;}(1)AREASubXY,CODE,READONL
7、YEXPORTSubXYSUBR0,R0,R1;结果通过R0返回MOVPC,LR;返回END(2)AREASubXY,CODE,READONLYEXPORTSubXYSUBR2,R0,R1LDRR3,=z;R3执行变量zSTRR2,[R3];更新变量zMOVPC,LR;返回END9.14把如下汇编语言函数改写成C函数。CMPR0,#1CMPNER1,#1ADDEQR2,R3,R4C函数为:voidmydo(inta,intb,intc,intd,inte);(R0)=a,(R1)=b,(R2)=c;(R3)=d,R4)=e{if(a!=1)if(
8、b==1)c=d+e;}9.15阅读程序,说明如下程序完成的功能。llsearchCMPR0,#0LDRNEBR2,[R0]CMPNER