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、多,需要先将源程序通过编译成机器语言才能执行,执行效率不如汇编高。,3/52,9.3 试用汇编代码完成如下C语言代码完成的功能。 int gcd(int a, int b) while (a != b)if (a b)a = a-b;elseb = b-a; return a; 汇编实现:AREA Sub1,CODE,READ ONLY EXPORT Sub1 CMP R0, R1 ;(R0)=a,(R1)=bMOVEQ PC,LR ;相等则返回 SUBGT R0, R0, R1 ;带符号数大于条件码为GT,无符号数为HISUBLT R1, R1, R0 ;带符号数小于条件码为LT,无符号数为
3、LO LDR R2,=a ;R2指向aSTR R0,R2 ;更新变量aMOV PC,LR ;返回 END,9.4 宏的定义如下面的代码所示: MICRO $aa example $bb, $cc, $dd $aa CMP $cc, #0 B$dd $bb MEND 若在汇编程序中需要调用上面定义的宏example,则其程序代码如下。试写出下面程序被汇编后,宏展开后的结果。 lable example next, R3, NE next 宏展开后的代码为:label CMP R3 , #0BNE next,9.5 编写一个程序段,当寄存器R3中数据大于R2中的数据时,将R2中的数据加10存入寄存
4、器R3;否则将R2中的数据加100存入寄存器R3,并把这个程序段定义成一个代码段。AREA ADDITION,CODE,READONLYENTRYLoopCMP R3 , R2BHI GREATERADD R3 , R2 , #100B STOPGREATERADD R3 , R2 , #10STOPEND,9.6编写一个程序段,判断寄存器R5中数据是否为12, 18, 22, 29, 45或67,如果是则将R0中数据加1,否则将R0设置为0xF,并把这个程序段定义成一个代码段AREA Comp,CODE,READONLYENTRYLDR R0,=dat ;寄存器R0指向DataT表中的数据列
5、表datMOV R1, #7 ; dat表中的数据个数MOV R2, #0 ;标志寄存器(R2)=0则R5中数据不在dat表中SUB R0, R0, #4 ;调整比较指针LoopSUB R1, R1, #1 ;调整比较次数BEQ HandleCMP R5,R0,#4!BNE LoopMOVEQ R2,#1HandleCMP R2,#0ADDNE R0, R0, #1MOVEQ R0,#0xFStopAREA DataT,DATA,READWRITEdat DCD 12,18,22,29,45,67;需要比较的数据列表END,8/52,9.8 试编写一个循环程序,实现从0开始10个偶数的累加。A
6、REA Foud,CODE,READONLY ENTRYMOV R0,#0 ;存放累加和MOV R1,#0 ;存放加数MOV R2,#9 ;累加次数 LoopADD R1, R1, #2ADD R0, R0, R1SUB R2, R2, #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,READONLYEXPORT SubXYSUB R0
7、,R0,R1 ;结果通过R0返回MOV PC,LR ;返回END (2) AREA SubXY ,CODE,READONLYEXPORT SubXYSUB R2,R0,R1LDR R3,=z ;R3执行变量zSTR R2,R3 ;更新变量zMOV PC,LR ;返回END,9.14 把如下汇编语言函数改写成C函数。 CMP R0, #1 CMPNE R1, #1 ADDEQ R2, R3, R4C函数为: 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)if
8、(b= =1)c=d+e; ,9.15 阅读程序,说明如下程序完成的功能。llsearchCMP R0, #0LDRNEB R2, R0CMPNE R1, R2LDRNE R0, R0, #4BNE llsearchMOV PC, LR该程序功能为:若R00,则将R0指向的字节数据读入R2;若R00且R1R2,则将R0+4指向的双字数据存入R0中;循环,直至R0=R1退出子程序。,9.16 阅读程序,说明如下程序完成的功能。strcmpLDRB R2, R0, #1LDRB R3, R1, #1CMP R2, #0CMPNE R3, #0BEQ returnCMP R2, R3BEQ strc
9、mpreturnSUB R0, R2, R3MOV PC, LR 程序功能为:R0指向数据串S1(的前一个字节单元),R1指向数据串S2(的前一个字节单元);依次比较字符串S1、S2中的字符,直至任一字符串结束;将S1,S2第一个不同字符(或最后一个字符)的差存入R0并返回;,9.17 阅读程序,说明如下程序完成的功能。CMP R0, #maxindexLDRLO PC, PC, R0, LSL #2B IndexOutOfRangeDCD Handler0DCD Handler1DCD Handler2DCD Handler3程序功能为:实现子程序散转:若R0在有效范围内(小于#maxindex)则跳转到Hander03所指的子程序之一。,9.18 阅读程序,说明如下程序完成的功能。loop LDMIA R12!, (R0-R11)STMIA R13!, (R0-R11)CMP R12, R14BLO loop程序功能为:将R12开始向大地址方向所指的12个数据压入向上生成的堆栈(R13开始向大地址方向所指的12个单元)中;比较R12和R14的值,若R12小于R14则循环,否则退出程序;,