资源描述:
《嵌入式系统原理及应用题目要求+程序代码》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《嵌入式系统原理及应用》作业题目作业1一、调试下面的程序,并回答问题。.global_start.text_start:LDRSP,=srcLDMFDSP!,{R0-R6}STMFDSP!,{R0-R6}LDMFDSP!,{R3}LDMFDSP!,{R4}LDMFDSP!,{R5}LDMFDSP!,{R6}LDMFDSP!,{R0}LDMFDSP!,{R1}LDMFDSP!,{R2}stop:bstop.ltorgsrc:.long1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的1~7这七个数据送
2、给R0~R0寄存器,然后又把寄存器列表中的R0~R7存入堆栈,然后又依次把堆栈中的1~7这七个数送给R3~R6,R0~R2,然后程序就结束了,在取数和存数的过程中。堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4。二、LDMFD,STMFD伪代码实现的原理。答:指令STMFD和LDMFD分析:根据ATPCS规则,我们一般使用FD(FullDescending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈
3、操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)17 而DB寻址方式实际内存地址为: start_address=Rn-(Number_Of_Set_Bits_In(register_list)*4) end_address=Rn-4 STM指令操作的伪代码: ifConditionPassed(cond)then address=start_address fori=0to15 ifregister_list[i]==1
4、 Memory[address]=Ri address=address+4有上面两个伪代码可以得出STMFDSP!,{R0-R7,LR}的伪代码如下: SP=SP-9×4; address= SP; fori=0to7 Memory[address]=Ri; address =address+4;Memory[address]=LR; LDMFD指令的寻址方式为事后递增方式(IA)IA内存的实际地址的伪代码 start_address=Rn end_address=Rn+(Number_of_set
5、_bits_in(register_list)*4)-4LDM指令操作的伪代码(未考虑PC寄存器): ifConditionPassed(cond)then address=start_address fori=0to15 ifregister_list[i]==1 Ri=Memory[address,4] address=address+4所以LDMFDSP!,{R0-R7,PC}^(;恢复现场,异常处理返回)伪代码是: address=SP; fori=0to7 R
6、i=Memory[address,4] address=address+4; SP=address;作业2一、用移位操作完成(R0)*10运算。参考程序:.text.global_start_start:17movR0,#10movR1,R0,LSL#3movR2,R0,LSL#1addR3,R1,R2stop:Bstop.end二、已知数据缓冲池中有两组数据x和y,每组中有3个数据(例如x:90,60,30,y:60,40,20),将x中的数据减去y中的数据,最后将两组数相减得到的结果送回到x中去!参考代码:.text.global_star
7、t_start:LDRSP,=xLDMFDSP!,{R0-R2}LDMFDSP!,{R3-R5}subR2,R2,R5SubR1,R1,R4SubR0,R0,R3STMFDSP!,{R0-R2}stop:bstop.ltorgx:.long80,90,100y:.long10,20,30.end作业3已知R0和R1的值,要求保留R0的低16位,保留R1的高16位状态,最后将这两个值组成一个新的数送给R3.参考代码:.text.global_start17_start:LDRR0,=0x12345678LDRR1,=0x87654321ldrR2,=
8、0xffffLDRR4,=0xffff0000ANDR0,R0,R2ANDR1,R1,R4ORRR3,R0,R1stop: