当前位置:文档之家› 嵌入式系统原理及应用题目要求+程序代码

嵌入式系统原理及应用题目要求+程序代码

《嵌入式系统原理及应用》作业题目作业1一、调试下面的程序,并回答问题。

.global _start.text_start:LDR SP, =srcLDMFD SP!,{R0-R6}STMFD SP!,{R0-R6}LDMFD SP!,{R3}LDMFD SP!,{R4}LDMFD SP!,{R5}LDMFD SP!,{R6}LDMFD SP!,{R0}LDMFD SP!,{R1}LDMFD SP!,{R2}stop: b stop.ltorgsrc:.long 1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的1~7这七个数据送给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(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)而DB寻址方式实际存地址为:start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)end_address = Rn - 4STM指令操作的伪代码:if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Memory[address] = Riaddress = address + 4有上面两个伪代码可以得出STMFD SP!,{R0-R7,LR} 的伪代码如下:SP =SP -9×4;address =SP;for i = 0 to 7Memory[address] = Ri;address= address + 4;Memory[address] = LR;LDMFD指令的寻址方式为事后递增方式(IA)IA存的实际地址的伪代码start_address = Rnend_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4LDM指令操作的伪代码(未考虑PC寄存器):if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Ri =Memory[address,4]address = address + 4所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是: address = SP;for i = 0 to 7Ri = Memory[address ,4]address = address + 4;SP = address;作业2一、用移位操作完成(R0)*10运算。

参考程序:.text.global _start_start:mov R0,#10mov R1,R0,LSL #3mov R2,R0,LSL #1add R3,R1,R2stop:B stop.end二、已知数据缓冲池中有两组数据x和y,每组中有3个数据(例如x: 90,60,30,y: 60,40,20),将x中的数据减去y中的数据,最后将两组数相减得到的结果送回到x中去!参考代码:.text.global _start_start:LDR SP,=xLDMFD SP!,{R0-R2}LDMFD SP!,{R3-R5}sub R2,R2,R5Sub R1,R1,R4Sub R0,R0,R3STMFD SP!,{R0-R2}stop:b stop.ltorgx: .long 80,90,100y: .long 10,20,30.end作业3已知R0和R1的值,要求保留R0的低16位,保留R1的高16位状态,最后将这两个值组成一个新的数送给R3.参考代码:.text.global _start_start:LDR R0,=0x12345678LDR R1,=0x87654321ldr R2,=0xffffLDR R4,=0xffff0000AND R0,R0,R2AND R1,R1,R4ORR R3,R0,R1stop: B stop.end作业4在ARM GNU环境下用ARM汇编语言编程序实现,00,0,0x xy x xx x>⎧⎪===⎨⎪-<⎩参考代码:.text.global _start_start:LDR R0,=xLDR R1,=yLDR R2,[R0]CMP R2,#0BEQ ZEROBGT ZHENGBLT FUZERO:MOV R3,#0STR R3,[R1]B stopZHENG:mov R3,R2STR R3,[R1]B stopFU:mvn R3,R2mov R4,#0x1add R3,R3,R4STR R3,[R1]B stopstop:B stop.ltorgx: .long -10y: .long 0作业5求20的阶乘:64位结果放在【R9:R8】中,R9放高32位,R放低32位思路:每轮乘法操作中,低32位(R8)乘以X(R0)后,结果的低32位放在R8中,高32位放在R9中;高32位R1乘以X(R0)后再加上R9,得到64位结果的高32位,存入R9 参考程序:.global _start.text_start:MOV R8 , #20 低32位初始化为20MOV R9 , #0 高位初始化为0SUB R0,R8,#1 初始化计数器Loop:MOV R1 , R9 暂存高位值UMULL R8 , R9 , R0 , R8 [R9:R8]=R0*R8MLA R9 , R1 , R0 , R9 R9=R1*R0+R9SUBS R0 , R0 , #1 计数器递减BNE Loop 计数器不为0继续循环Stop:B stop.end二、已知a=R0,b=R1.while(a< >b) doif(a>b) thena=a-belsea=b-aend ifend whileresult=a根据以上代码写出对应的汇编代码:参考代码:CMP R0,R1CMPNE R0,R1SubGT R0,R0,R1SubLT R0,R1,R0.end作业61.将下面的ADS环境下的程序代码改写成GUN环境下的程序代码。

(调试时使用F11 step into,注意和F10 step over的区别)AREA Jump, CODE, READONLYnum EQU 4 ; 函数地址表容的个数ENTRYCODE32startLDR R0, =choice ; R0指向存储区的choice单元LDR R0, [R0] ; 设置第一个参数:选择执行哪一个函数MOV R1, #16 ; 设置第1个操作数MOV R2, #2 ; 设置第2个操作数BL arithfunc ; 调用子程序arithfuncstopMOV R0, #0x18 ; 程序结束返回编译器调试环境LDR R1, =0x20026SWI 0x123456arithfuncCMP R0, #num ; 比较R0的值是否超过函数地址表的个数MOVHS PC, LR ; 如果大于,那么就返回到标号stop处ADR R3, JumpTable ; 将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL #2] ; 根据R0参数进入对应的子程序JumpTable ; 函数地址表的入口基地址DCD DoAdd ; 加法子程序DCDDoSub ; 减法子程序DCDDoMul ; 乘法子程序DCDDoDiv ; 除法子程序DoAddADD R0, R1, R2 ; R0 = R1 + R2MOV PC, LR ; 返回DoSubSUB R0, R1, R2 ; R0 = R1 - R2MOV PC, LR ; 返回DoMulMOV R0, R1, LSL R2 ; R0 = R1 << R2MOV PC, LR ; 返回DoDivMOV R0, R1, LSR R2 ; R0 = R1 >> R2MOV PC, LR ; 返回AREA NUM, DATA, READWRITEchoice DCD3 ; 0:表示选择加法子程序1:表示选择减法子程序; 2:表示选择乘法子程序3:表示选择除法子程序END参考程序:.equ num,4 函数地址表容的个数.text.global _start_start:LDR R0,=choice R0指向存储区的choice单元LDR R0,[R0] 设置第一个参数:选择执行哪一个函数MOV R1,#16 设置第1个操作数MOV R2,#2 设置第2个操作数Bl arithfunc 调用子程序arithfuncstop:b stoparithfunc:CMP R0,#num 比较R0的值是否超过函数地址表的个数MOVHS PC, LR 如果大于,那么就返回到标号stop处ADR R3, JumpTable 将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL#2] 根据R0参数进入对应的子程序JumpTable: 函数地址表的入口基地址.long DoAdd 加法子程序.long DoSub 减法子程序.long DoMul 乘法子程序.long DoDiv 除法子程序DoAdd:ADD R0, R1, R2 R0 = R1 + R2MOV PC, LR 返回DoSub:SUB R0, R1, R2 R0 = R1 - R2MOV PC, LR 返回DoMul:MOV R0, R1, LSL R2 R0 = R1 << R2MOV PC, LR 返回DoDiv:MOV R0, R1, LSR R2 R0 = R1 >> R2MOV PC, LR 返回.ltorgchoice: .long 3 0:表示选择加法子程序1:表示选择减法子程序2:表示选择乘法子程序:表示选择除法子程序.end2. 改写以下程序,实现从ARM状态切换到thumb状态,最后再切换到ARM状态!#*******************************************************************************************# NAME: ThumbCode.s *# Author: Embest *# Desc: ThumbCode examples *# History: shw.He 2005.02.22 *#*********************************************************************************************/*-----------------------------------------------------------------------------------------------------------*//* constant define *//*-----------------------------------------------------------------------------------------------------------*/.global _start/*-----------------------------------------------------------------------------------------------------------*//* unable to locate source file. code *//*-----------------------------------------------------------------------------------------------------------*/.text_start:.arm /* Subsequent instructions are ARM */header:adr r0, Tstart + 1 /* Processor starts in ARM state, */bx r0 /* so small ARM code header used *//* to call Thumb main program. */ nop.thumbTstart:mov r0, #10 /* Set up parameters */mov r1, #3bl doadd /* Call subroutine */stop:b stop/*------------------------------------------------------------------------------------------*//* Subroutine code:R0 = R0 + R1 and return *//*------------------------------------------------------------------------------------------*/doadd:add r0, r0, r1 /* Subroutine code */mov pc, lr /* Return from subroutine. */.end /* Mark end of file */参考程序:.global _start.text_start:mov r3,#0.armheader:adr r0,Tstart + 1add r3,r3,#1 //设置循环标志,便于从thumb切换到arm后能停止程序cmp r3,#2Beq stopbx r0stop:b stop.thumbTstart:LDR r2,=headermov r0, #10mov r1, #3bl doaddbx r2doadd:add r0, r0, r1mov pc, lr.end作业7已知1,00,01,0xy xx>⎧⎪==⎨⎪-<⎩,若任意给一个定值,假定为-25,存放在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。

相关主题