ARM习题及答案.docx
《ARM习题及答案.docx》由会员分享,可在线阅读,更多相关《ARM习题及答案.docx(11页珍藏版)》请在冰点文库上搜索。
ARM习题及答案
ARM习题
什么是嵌入式系统
答:
嵌入式系统是以应用为中心,以计算机技术为基础,软/硬件可裁减,功能。
可靠性,成本,体积,功耗要求严格的专用计算机系统。
与通用计算机相比,嵌入式系统有哪些特点
答:
(1).嵌入式系统通常是面向特定应用的;
(2).嵌入式系统是将计算机技术,半导体技术和电子技术与各行各业的具体应用相结合的后的产物,是一门综合技术学科;
(3).嵌入式系统和具体应用有机的结合在一起,它的升级换代也是和具体产品同步进行的,因此嵌入式产品一旦进入市场,就有较长的生命周期;
(4).为了提高执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存储于磁盘等载体中;
(5).嵌入式系统本身不具有自主开发能力,即使设计完成以后用户通常也不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。
ARM处理器有几种寻址方式,说明各种寻址的方式。
…
答:
立即寻址:
操作数直接放在指令中。
例如:
ADDR0,R0,#0x3f;R0←R0+0x3f
寄存器寻址:
操作数放在寄存器中。
例如:
ADDR0,R1,R2;R0←R1+R2
寄存器间接寻址:
操作数在内存,以寄存器中的值作为操作数的地址。
例如:
LDRR0,[R1];R0←[R1]
基址加偏移量寻址(基址变址寻址):
基址寄存器的内容与指令中的偏移量相加形成操作数的有效地址例如:
LDRR0,[R1,#4];R0←[R1+4]
LDRR0,[R1,R2];R0←[R1+R2]
多寄存器寻址:
一条指令可以完成多个寄存器值的传送。
例如:
LDMIAR0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]
堆栈寻址:
堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
"
例如:
STMFDR13!
,{R0,R4-R12,LR}
LDMFDR13!
,{R0,R4-R12,PC}
举例介绍嵌入式处理器有哪几类
答:
1.嵌入式微处理器(EmbeddedMicroprocessorUnit,EMPU);
2.嵌入式微控制器;(EmbeddedMicrocontrollerUnit,EMCU)
3.嵌入式DSP处理器(EmbeddedDigitalSignalProcessor,EDSP);
4.嵌入式片上系统(EmbeddedSystemonChip,EsoC);
从硬件系统来看,嵌入式系统由哪几个部分组成画出简图。
编写1+2+3+***+100的汇编程序。
AREAEXAMPLE1,CODE,READONLY;定义一个代码段,名称为EXAMPLE1
[
ENTRY;入口
MOVR0,#0;给R0赋值为0
MOVR1,#0;用R1来存放1~100的总和,初始化为0
STARTADDR0,R0,#1;用来判断终止的,每次加1
ADDR1,R1,R0;从1加到100
CMPR0,#100;执行R0-100的操作,但不保存,只影响CPSR的值
BLTSTART;带符号数小于时跳转到START处执行
STOPBSTOP;死循环
END
如何实现128位数的减法,请举例说明。
(
AREAEXAMPLE2,CODE,READONLY
ENTRY
START
SUBSR5,R5,R9
SBCSR4,R4,R8
SBCSR3,R3,R7
SBCSR2,R2,R6
STOP
BSTOP
END
?
将存储器中起始地址地址0X10处的4个字数据移动到地址0X20处。
AREAEXAMPLE2,CODE,READONLY
ENTRY
LDRR0,=0X10;把地址0X10赋给R0
LDRR5,=0X20;把地址0X20赋给R5
START
LDMIAR0,{R1-R4};把R0为首地址的内存单元中的值依次赋给,
;R1到R4,每次赋完一次值,R0自动加1
STMIAR5,{R1-R4};把R1到R4的值依次赋给以R5为首地址的内存单元中,R5每次自动加1
STOP
》
BSTOP;死循环
END
参考CPSR寄存器中各标志位的含义,使处理器处于系统模式。
AREAEXAMPLE2,CODE,READONLY
ENTRY
START
MOVR0,#0X1F;给R0赋值,2进制为11111
MSRCPSR_c,R0;把CPSR的条件位置1
STOP
BSTOP;死循环
?
END
用跳转指令实现两段程序间的来回切换。
AREAEXAMPLE5,CODE,READONLY
ENTRY
BLX;跳到a对R0,R1,赋值
START
CMPR0,R1;比较R0,R1的值
BNEY;不等跳转到b
BEQSTOP;相等时跳转到STOP
X
@
MOVR0,#3;对R0,R1赋值
MOVR1,#2
MOVR15,R14;返回
Y
ADDR1,R1,#1;R1自加1
BSTART;跳转到START
STOP
BSTOP;死循环
END
ARM调用Thumb子程序例子
;
AREAThumbSub,CODE,READONLY;Namethisblockofcode
ENTRY;Markfirstinstructiontoexecute
CODE32;SubsequentinstructionsareARM
header
ADRr0,start+1;ProcessorstartsinARMstate,
BXr0;sosmallARMcodeheaderused
;tocallThumbmainprogram.
CODE16;SubsequentinstructionsareThumb.
start
MOVr0,#10;Setupparameters
(
MOVr1,#3
BLdoadd;Callsubroutine
stop
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0xAB;ThumbsemihostingSWI
doadd
ADDr0,r0,r1;Subroutinecode
MOVpc,lr;Returnfromsubroutine.
END;Markendoffile
]
字符串拷贝子程序,将r1指向的字符串拷贝到r0指向的地方,字符串以0作结束标志
AREASCopy,CODE,READONLY
EXPORTstrcopy
strcopy
;r0pointstodestinationstring
;r1pointstosourcestring
LDRBr2,[r1],#1;loadbyteandupdateaddress
STRBr2,[r0],#1;storebyteandupdateaddress;
CMPr2,#0;checkforzeroterminator
BNEstrcopy;keepgoingifnot
。
MOVpc,lr;Return
END
、求两个数的最大值,并将最大值放R0寄存器
AREAMAX,CODE,READONLY
ENTRY
START
MOVR1,#0x16
M0VR2,#0x17
CMPR1,R2
MOVMIR0,R2
!
MOVPLR0,R1
STOP
BSTOP
END
、循环实现数的递减,即每次减1。
最终结果为0时退出循环。
AREAMAX,CODE,READONLY
ENTRY
START
MOVR0,#10
LOOP
!
SUBSR0,R0,#1
BNELOOP
STOP
BSTOP
END
、改下列C程序段代码为ARM汇编程序段代码。
voidgcd(inta,intb
{
while(a!
=b
if(a>b
]
a=a-b;
else
b=b-a;
}
AREAMAX,CODE,READONLY
ENTRY
gcd
CMPR0,R1
BEQSTOP
BLTLess
》
SUBR0,R0,R1
BSTOP
Less
SUBR1,R1,R0
STOP
BSTOP
End
什么是伪指令和伪操作在ARM汇编中有哪几种伪指令
答:
在ARM汇编语言程序中有些特殊助记符,这些助记符与一般指令的助记符的不同之处在于没有相对应的操作码或者机器码,通常称这些特殊指令助记符卫伪指令,他们多完成的操作成为伪操作;
在ARM汇编中,有如下几种伪指令:
;
(1符号定义伪指令;
(2数据定义伪指令;
(3汇编控制伪指令;
(4信息报告伪指令;
(5宏指令及其他伪指令。
如何定义寄存器列表,试举一个使用寄存器列表的例子,要求实现4个字的内存复制。
答:
AREAEXAMPLE1,CODE,READONLY
ENTRY
LDRR0,=0XFF;把地址0XFF赋给R0
{
LDRR5,=0X0F;把地址0X0F赋给R5
START
PBLOCKRLIST{R1-R4};把R1-R4定义为PBLOCK
LDMIAR0,PBLOCK;把R0为首地址的内存4个字单元装载至R1到R4中
STMIAR5,PBLOCK;把R1到R4的值依次存至R5为首地址的内存字单元
STOPBSTOP;死循环
END
如何定义一个宏,宏与子程序的区别是什么
答:
宏的格式为:
MARCO和MEND
[$标号]宏名[$参数1,$参数2…..]
指令序列
MEND
MARCO表示一个宏定义的开始,MEND表示一个宏的结束,MARCO和MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后在程序中就可以在程序中通过宏的名称及参数调用该段代码。
宏指令可以重复使用,这一点的使用方式与子程序有些相似,子程序可以节省存储空间,提供模块化的程序设计。
但使用子程序机构时需要保存/恢复现场,从而增加了系统的开销,因此,在代码传递的参数较多并且比较短时,可以使用宏代替子程序,宏在被调用的地方展开。
ARM汇编中如何定义一个段,段有几种属性
答:
AREA用于定义一个代码段,数据段,或者特定属性的段。
段的几种属性如下:
READONLY表示只读属性;
READWRITE表示本段可读写;
?
CODE定义代码段;
DATA定义数据段;
ALIGN=表达式的对齐方式为2的表达式次方;;
COMMON:
定义一个通用段,这个段不包含用户代码和数据。
在一个汇编源文件中如何包含另一个文件中的内容
答:
通常可以使用GET/INCLUDE指令,在某源文件中定义一些宏指令,用MAP和FIELD定义结构化数据结构类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他源文件中。
分别编写一个函数和一个宏,实现字符串的复制。
MACRO
COPY$P1,$P2;定义一个宏
$P1DCB"HELLO";分配一个字节的空间,并初始化为一个字符串
$P2DCB"WORLD!
";同上
LDRR0,=$P1;把P1的首地址加载到R0
LDRR6,=$P2;把P2的首地址加载到R1
LDRIAR0,[R1-R5];
STRIAR6,[R1-R5];
MEND
AREACOPY,CODE,READONLY
ENTRY
START
COPYSTR1,STR2;调用宏
BSTART;死循环
END
说明在高速缓存命中率低时对程序性能的影响。
答:
高速缓存的命中率随缓冲区的增加而提高。
高速缓存的命中减少了对磁盘的访问,并因此提高了系统的整体性能。
如果高速缓存的命中率降低,高速缓存对CPU的有效访问就会减弱,系统运行就会变慢,程序的运行就会变慢。