第六章习题

2020-03-27 20:14

“微处理器系统原理与嵌入式系统设计”第六章习题解答

6.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,READONLY EXPORT Sub1 CMP

R0, R1

;(R0)=a,(R1)=b ;相等则返回

;带符号数大于条件码为GT,无符号数为HI ;带符号数小于条件码为LT,无符号数为LO ;R2指向a ;更新变量a ;返回

MOVEQ PC,LR SUBGT R0, R0, R1 SUBLT R1, R1, R0 LDR STR MOV END

R2,=a R0,[R2] PC,LR

6.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

6.6编写一个程序段,判断寄存器R5中数据是否为12, 18, 22, 29, 45或67,如果是则将R0中数据加1,否则将R0设置为0xF,并把这个程序段定义成一个代码段。

AREA Comp,CODE,READONLY ENTRY

LDR MOV MOV SUB Loop

SUB BEQ BNE Handle

CMP Stop END

?? dat

DCD

12,18,22,29,45,67

;需要比较的数据列表

AREA DataT,DATA,READWRITE

R2,#0

ADDNE R0, R0, #1 MOVEQ R0,#0xF

R1,R1,#1 Handle Loop

;调整比较次数

R0,R0,#4

;调整比较指针

R0,=dat R1,#6 R2,#0

;寄存器R0指向DataT表中的数据列表dat ; dat表中的数据个数

;标志寄存器(R2)=0则R5中数据不在dat表中

CMP R5,[R0,#4]! MOVEQ R2,#1

6.8 试编写一个循环程序,实现从0开始10个偶数的累加。

AREA Foud,CODE,READONLY ENTRY Loop

MOV R0,#0 MOV R1,#0 MOV

R2,#9

;存放累加和 ;存放加数 ;累加次数

ADD R1,R1,#2 ADD R0,R0,R1 SUB

R1,R1,#1

;调整累加次数

Stop END

BNE Loop ??

6.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 MOV END (2)

AREA SubXY ,CODE,READONLY EXPORT SubXY SUB LDR STR MOV END

R2,R0,R1 R3,=z R2,[R3] PC,LR

;R3执行变量z ;更新变量z ;返回

R0,R0,R1 PC,LR

;结果通过R0返回 ;返回

6.14 把如下汇编语言函数改写成C函数。

CMP R0, #1 CMPNE R1, #1 ADDEQ R2, R3, R4

void mydo(int a, int b, int c, int d, int e) {

if (a!=1) }

if (b= =1) c=d+e;

; (R0)=a,(R1)=b,(R2)=c, (R3)=d, (R4)=e,

6.15 阅读程序,说明如下程序完成的功能。

llsearch

CMP R0, #0 LDRNEB R2, [R0] CMPNE R1, R2 LDRNE R0, [R0, #4] BNE llsearch MOV PC, LR

若R0≠0,则将R0指向的字节数据读入R2;

若R0≠0且R1≠R2,则将R0+4指向的双字数据存入R0中; 循环,直至R0=R2退出子程序。

6.16 阅读程序,说明如下程序完成的功能。

strcmp

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并返回;

6.17 阅读程序,说明如下程序完成的功能。

CMP R0, #maxindex

LDRLO PC, [PC, R0, LSL #2] B IndexOutOfRange DCD Handler0 DCD Handler1 DCD Handler2 DCD Handler3 ?

实现子程序散转:若R0在有效范围内(小于#maxindex)则跳转到Hander0~3所指的子程序之一。

6.18 阅读程序,说明如下程序完成的功能。

loop

LDMIA R12!, (R0-R11) STMIA R13!, (R0-R11) CMP R12, R14 BLO loop

将R12开始向大地址方向所指的12个数据压入向上生成的堆栈(R13开始向大地址方向所指的12个单元)中;

比较R12和R14的值,若R12小于R14则循环,否则退出程序;

6.19 分别编写一个主程序和子程序,实现主程序对子程序的调用。要求子程序完成两个数的加法运算功能;主程序完成对变量的初始化赋值后调用子程序,实现两个数的加法运算。按照如下两种方式来完成程序设计。 (1) 主程序采用C语言程序,子程序采用汇编语言程序设计; (2) 主程序采用汇编语言程序,子程序采用C语言程序设计。

(1)

extern int myadd(int a , int b) int main() {

}

AREA myadd , CODE , READONLY EXPORT myadd myadd

ADD R0,R0,R1

int a=1,b=2,c; c=myadd(a,b);

MOV PC,LR END (2)

IMPROT myadd

AERA Example, CODE, READONLY ENTRY MOV R0, #1 MOV R1,#2 BL myadd MOV R3,R0 END

int myadd(int a, int b) {return(a+b);}


第六章习题.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:合肥工业大学数据结构试验报告3

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: