嵌入式复习思考题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式复习思考题答案
嵌入式复习思考题及答案(1)
一、简短回答问题
1、arm9有哪几种工作模式?其中哪几种属于特权模式?哪几种属于几种异常模式?
答:有用户、系统、管理、中止、未定义、普通中断和快速中断。
系统、管理、中止、未定义、正常中断和快速中断属于特权模式。
管理、中止、未定义、正常中断和快速中断
属于几种异常模式。
2.ARM9的两种工作状态是什么?各自的特点?实现状态切换指令的方法是什么?
答:arm状态与thumb状态。
arm状态指令是32位;thumb状态指令是16位。
切换指令是bx。
3、简述arm9在不同工作模式下寄存器分布情况(用图表说明)。
r13、r14、
r15的固定用途;cprs和sprs名称及功能。
答:R13通常用作堆栈指针SP,R14用作链接寄存器LR,R15用作程序计数器PC。
CPRs是当前程序状态寄存器,包含条件代码、中断抑制位、当前处理器模式以及其他状态和控制信息。
SPRS是一个程序状态保存寄存器,用于在发生异常时保存CPR的状态。
4、arm920t处理器有哪7种异常?各自对应中断矢量、优先级如何排列?复位未定义指令软件中断指令预取中止数据中止普通中断快速中断
0x000000000x000000040x000000080x0000000c0x000000100x000000180x0000001c16652435、arm处理器对异常中断的响应及返回过程。
答:响应过程:1、将引起异常指令的下一条指
令的地址保存到新的异常工作模式的r14中;
2.将CPSR的内容保存到要执行的异常中断对应的SPSR中;
3.根据异常类型,CPSR中的操作模式位;
4、将相应的矢量地址赋值给pc,开始执行异常处理程序。
还可设中断禁止位。
退货流程:1。
从连接寄存器LR的值中减去相应的偏移量,并将其发送到PC;
2、将spsr内容送回cpsr;
3.如果在进入异常处理时设置了中断抑制位,请在此处清除它。
6、写出arm9支持的寻址方式,各举一例。
答:略
7.写出指令ldrb/ldrh/LDR之间的差异。
答:ldrb将内存单元一个字节的数据扩展到32位装载到寄存器;
Ldrh将存储单元的半个字(两个字节)的数据扩展到32位,并将其加载到寄存器中;LDR将存储单元中一个字的数据加载到寄存器中。
8、写出ldm、stm指令用于数据块拷贝时对应的4种后缀以及用于堆栈操作对应的4
种后缀。
解释各自的执行过程。
答:数据块复制后缀:ia操作后指针增加;Da操作后指针下降;IB操作前指针增加;DB操作前的指针减量。
堆栈操作后缀:fd满递减;ed空递减;fa满递增;ea空递增。
9.arm和thumb的堆栈生成方法有什么不同?编写相应的堆栈输入和堆栈输出指令。
答:arm堆栈有四种生成方法:全增量、全减量、空增量和空减量;
入栈指令:stm(fd\\ed\\fa\\ea4种后缀之一)出栈指令:ldm(fd\\ed\\fa\\ea4
种后缀之一)thumb堆栈采用满递减的生成方式。
入栈指令:push.出栈指令:pop10、写
出条件代码ne、eq的判断条件。
答:nez=0(不相等);eqz=1(相等)
11.B、BL和BX指令之间的区别是什么?编写非嵌套子例程调用和返回指令。
A:B是
一个简单的传输指令,用于实现到目标地址的简单跳转;
bl是带链接的转移指令,将转移指令后的下一条指令抵制保存到链接寄存器lr;bx
是带状态切换的转移指令。
子程序调用指令:bldelay;非嵌套子程序返回指令movpc、lr12。
给出一个例子来说明伪指令LDR的两个主要用途。
答:ldrr1,=0x30408020加载32位立即数到寄存器;ldrr1,=src加载一个地址值到
寄存器。
13、什么是atpcs?它有哪些规则?
答:atpcs是ARM程序和thumb程序子程序调用的基本规则,它使单独编译的C程序
和汇编程序能够相互调用。
调用子程序时,有数据堆栈规则、参数传输规则和寄存器使用
规则。
二、程序阅读题(重点检测寻址方式及指令)
1.在每条语句后做简短的注释,并在程序执行后写出R0、R1、R2和C的值。
(知识点:算术、逻辑运算、影响标志位)
areasumm,code,readonlyxequ8yequ16entry
movr0、#xmovr1、#yaddr2、r0、r1和r0、r2、#0x0fmovr2、#y
addsr2,r0,r1,lsr#1
执行停止程序后,R0=8、R1=16、R2=16和C=0。
终止
2、分析程序,按照加“//”语句的要求解答。
(知识点:堆栈操作)
areastk,code,readonlyentry
movr1,#0x30movr2,#0x08
movsp,#0x400
stmfdsp!,{r1,r2};//① 执行语句后写出SP和R2的值,SP=0x3f8;r2=0x08
ldmfdsp!,{r5,r6};//②写出语句执行后sp、r5和r6的值
sp=0x400;r5=0x30;r6=0x08loopbloopend
3.写出程序实现的功能,并在每条语句后做简短的评论。
(知识点:寻址模式[RN]、#立即、循环体、数据拷贝)
areaarmcopycode,readonlynumequ16entryadrr1,srcadrr3,dst
Movr2,#num程序实现了将16个字从内存SRC复制到DST。
copyldrr0、[r1]、
#4strr0、[r3]、#4
subsr2,r2,#1bnecopy
stopbstop
srcdcd1,2,3,4,1,2,3,4,5,6,1,2,3,4,1,2dstdcd0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
终止
4、分析程序功能,并写出加序号语句的作用。
(知识点:状态切换)
该程序实现了从arm状态到thumb状态的切换,并实现了4字节数据的拷贝。
areathcopy,code,readonlyentry
code32;伪操作,表示以下指令是32位arm指令ldrr1、=SRCLDR3、=dstmovr2、#4
ldrr4,=copy+1;①;伪指令,装载跳转地址以及最后的状态切换位bxr4;②;从arm状态跳转到thumb状态
代码16③;伪操作,指示以下指令是16位thumb指令副本
ldrbr0,[r1]addr1,#1
strbr0,[r3]地址3,#1
subr2,r2,#1bnecopystopbstop
srcdcb1,2,3,4dstdcb0,0,0,0end
5、写出下列程序执行后r0的值,并写出加序号语句的作用。
(知识点:跳转表、子程序的调用返回)
区域跳转、代码、只读入口
startmovr0,#0movr1,#8movr2,#5
blcount① 调用子例程stopbstop
countcmpr0,#2;②r0与2比较
movhspc,lr③ 如果R0大于2,子程序返回ldrr3,=jumptable;④ 否则,跳转表头地址将被发送到r3ldrpc[R3,R0,lsl#2];⑤ 将R3+R0×4(跳转地址)设置为pcjumptable
dcddoadddcddosubdoadd
地址0,r1,r2
movpc,lr;⑥子程序返回dosub
subr0,r1,r2
movpc,lr程序执行后r0=13end
6.分析以下混合程序答案:(1)程序实现了什么功能?在C语言中,调用汇编函数实现字符串的复制(2)C语言程序和汇编代码如何传递参数?dststrr0;Srcstrr1(3)在每次陈述后做简短评论。
(知识点:c和汇编混合编程框架、atpcs规则、字节拷贝)
externvoidstrcpy(char*d,constchar*s);声明外部函数intmain(void){
constchar*srcstr=”abcdefg”;
char*dststr=“jjjjjj”;
strcopy(dststr,srcstr);调用汇编函数(通过r0和r1实现参数传递)
printf(“%s\\n%\\n”,srcstr,dststr);return(0);}
区域透视,代码,只读
exportstrcopy;声明一个全局标号,可以在其他文件中引用
strcopyldrbr2,[r1],#1strbr2,[r0],#1
cmpr2,#0bnestrcpy
movpc,lr;子程序返回端
三、设计题
(掌握汇编和C语言的简单程序设计,如数据复制、跳转表和混合编程。
)1.用汇编
语言编写数据块或字符复制程序(如读取程序标题)。
2.用汇编语言编写具有两个分支的
跳转表,实现程序跳转。
R2寄存器存储跳转表的基址。
R1用于选择不同的子例程,可以
任意命名。
为R1的不同值选择不同的子程序。
做简单的笔记。
(如阅读程序问题)
3、编写一段c语言与汇编语言的混合编程代码,在c语言程序中调用汇编语言代码,完成字符串的拷贝。
(如阅读程序题)
在汇编子程序中,我们调用一个C语言函数add3(),它计算a、B和C三者之和,
并计算i+2i+3i,假设i在R0中。
(需要解释如何在汇编程序和C函数之间传递参数)。
intadd3(inta,intb,intc){
returna+b+c;}
areasadd,code,readonly
importadd3;声明标签位于其他源文件中,并且应在当前文件中引用
addr1,r0,r0addr2,r0,r1
bladd3;调用子程序结束。