微处理器系统结构与嵌入式系统设计(第2版) 第9章答案
第9章习题答案
9.5编写一个程序段,当寄存器r3中数据大于r2中的数据时,将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.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,R1,#1 ;调整累加次数
BNE Loop
Stop
……
END
9.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退出子程序。
9.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并返回;
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则循环,否则退出程序;
9.19分别编写一个主程序和子程序,实现主程序对子程序的调用。要求子程序完成两个数的加法运算功能;主程序完成对变量的初始化赋值后调用子程序,实现两个数的加法运算。按照如下两种方式来完成程序设计。
(1) 主程序采用C语言程序,子程序采用汇编语言程序设计;
(2) 主程序采用汇编语言程序,子程序采用C语言程序设计。
(1)
extern int myadd(int a , int b)
int main()
{ int a=1,b=2,c;
c=myadd(a,b);
}
AREA myadd , CODE , READONLY
EXPORT myadd
myadd
ADD R0,R0,R1
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);}