试把如下c函数改写成汇编语言函数,习题答案ARM程序设计.ppt

《习题答案ARM程序设计.ppt》由会员分享,可在线阅读,更多相关《习题答案ARM程序设计.ppt(14页珍藏版)》请在装配图网上搜索。

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; else b = b-a; return a; 汇编实现: AREA 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 ;带符号数小于条件码。

3、为LT,无符号数为LO LDR R2,=a ;R2指向a STR R0,R2 ;更新变量a MOV 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 , #0 BNE next,9.5 编写一个程序段,当寄存器R3中数据大于R2中的数据时,将。

4、R2中的数据加10存入寄存器R3;否则将R2中的数据加100存入寄存器R3,并把这个程序段定义成一个代码段。 AREA ADDITION,CODE,READONLY ENTRY Loop CMP R3 , R2 BHI GREATER ADD R3 , R2 , #100 B STOP 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。

5、 R0,=dat ;寄存器R0指向DataT表中的数据列表dat MOV R1, #7 ; dat表中的数据个数 MOV R2, #0 ;标志寄存器(R2)=0则R5中数据不在dat表中 SUB R0, R0, #4 ;调整比较指针 Loop SUB R1, R1, #1 ;调整比较次数 BEQ Handle CMP R5,R0,#4! BNE Loop 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;需要比。

6、较的数据列表 END,8/52,9.8 试编写一个循环程序,实现从0开始10个偶数的累加。 AREA Foud,CODE,READONLY ENTRY MOV R0,#0 ;存放累加和 MOV R1,#0 ;存放加数 MOV R2,#9 ;累加次数 Loop ADD R1, R1, #2 ADD R0, R0, R1 SUB 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) 。

7、z = x-y; (1) AREA SubXY ,CODE,READONLY EXPORT SubXY SUB R0,R0,R1 ;结果通过R0返回 MOV PC,LR ;返回 END (2) AREA SubXY ,CODE,READONLY EXPORT SubXY SUB R2,R0,R1 LDR R3,=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 。

8、c, int d, int e) ; (R0)=a,(R1)=b,(R2)=c ; (R3)=d, R4)=e if (a!=1) 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=R1退出子程序。,9.16 阅读程序,说明如下程序完成的功能。 strc。

9、mp LDRB R2, R0, #1 LDRB R3, R1, #1 CMP R2, #0 CMPNE R3, #0 BEQ 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 。

10、IndexOutOfRange DCD Handler0 DCD Handler1 DCD Handler2 DCD Handler3 程序功能为: 实现子程序散转:若R0在有效范围内(小于#maxindex)则跳转到Hander03所指的子程序之一。,9.18 阅读程序,说明如下程序完成的功能。 loop LDMIA R12!, (R0-R11) STMIA R13!, (R0-R11) CMP R12, R14 BLO loop 程序功能为: 将R12开始向大地址方向所指的12个数据压入向上生成的堆栈(R13开始向大地址方向所指的12个单元)中;比较R12和R14的值,若R12小于R14则循环,否则退出程序。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值