ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:28.67KB ,
资源ID:26049338      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26049338.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统原理及应用题目要求+程序代码.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、嵌入式系统原理及应用题目要求+程序代码嵌入式系统原理及应用 作业题目作业1一、调试下面的程序,并回答问题。.global _start.text_start: LDR SP, =src LDMFD 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.ltorg src: .long 1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的17这七

2、个数据送给R0R0寄存器,然后又把寄存器列表中的R0R7存入堆栈,然后又依次把堆栈中的17这七个数送给R3R6,R0R2,然后程序就结束了,在取数和存数的过程中。堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4 。二、LDMFD,STMFD伪代码实现的原理。答:指令STMFD和LDMFD分析:根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈操作和批量Load/Store指令寻址方式,

3、可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)而DB寻址方式实际存地址为:start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)end_address = Rn - 4STM指令操作的伪代码: if ConditionPassed(cond) then address = start_address for i = 0 to 15 if register_listi = 1 Memoryaddress = Ri address = address + 4有上面两个伪代码可以得出

4、 STMFD SP!,R0-R7,LR 的伪代码如下: SP SP 94; address =SP;for i = 0 to 7 Memoryaddress = Ri; address = address + 4;Memoryaddress = LR;LDMFD指令的寻址方式为事后递增方式(IA)IA存的实际地址的伪代码start_address = Rnend_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4LDM指令操作的伪代码(未考虑PC寄存器): if ConditionPassed(cond) then addre

5、ss = start_address for i = 0 to 15 if register_listi = 1 Ri Memoryaddress,4 address = address + 4所以LDMFD SP!,R0-R7,PC (;恢复现场,异常处理返回)伪代码是: address = SP; for i = 0 to 7 Ri = Memoryaddress ,4 address = address + 4; SP = address;作业2一、用移位操作完成(R0)*10运算。参考程序:.text.global _start_start:mov R0,#10mov R1,R0,LS

6、L #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,=x LDMFD SP!,R0-R2 LDMFD SP!,R3-R5 sub R2,R2,R5 Sub R1,R1,R4 Sub R0,R0,R3 STMFD SP!,R0-R2 stop: b stop.ltorg x: .long 80,90,

7、100 y: .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汇编语言编程序实现参考代码:.text.global _start_start: LDR R0,=x

8、 LDR R1,=y LDR R2,R0 CMP R2,#0 BEQ ZERO BGT ZHENG BLT FU ZERO: MOV R3,#0 STR R3,R1 B stopZHENG: mov R3,R2 STR R3,R1 B stop FU: mvn R3,R2 mov R4,#0x1 add R3,R3,R4 STR R3,R1 B stop stop: B stop.ltorg x: .long -10 y: .long 0作业5求20的阶乘:64位结果放在【R9:R8】中,R9放高32位,R放低32位思路:每轮乘法操作中,低32位(R8)乘以X(R0)后,结果的低32位放在R8

9、中,高32位放在R9中;高32位R1乘以X(R0)后再加上R9,得到64位结果的高32位,存入R9参考程序:.global _start.text_start: MOV R8 , #20 低32位初始化为20 MOV R9 , #0 高位初始化为0 SUB R0,R8,#1 初始化计数器Loop: MOV R1 , R9 暂存高位值 UMULL R8 , R9 , R0 , R8 R9:R8=R0*R8 MLA R9 , R1 , R0 , R9 R9=R1*R0+R9 SUBS R0 , R0 , #1 计数器递减 BNE Loop 计数器不为0继续循环Stop: B stop.end二、已

10、知a=R0,b=R1.while(ab) do if(ab) then a=a-belse a=b-a end 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, READONLY num EQU 4 ; 函数地址表容的个数 ENTRY CODE32start LDR R0, =ch

11、oice ; R0指向存储区的choice单元 LDR R0, R0 ; 设置第一个参数:选择执行哪一个函数 MOV R1, #16 ; 设置第1个操作数 MOV R2, #2 ; 设置第2个操作数 BL arithfunc ; 调用子程序arithfuncstop MOV R0, #0x18 ; 程序结束返回编译器调试环境 LDR R1, =0x20026 SWI 0x123456arithfunc CMP R0, #num ; 比较R0的值是否超过函数地址表的个数 MOVHS PC, LR ; 如果大于,那么就返回到标号stop处 ADR R3, JumpTable ; 将函数地址表的地址

12、作为基地址 LDR PC, R3, R0, LSL #2 ; 根据R0参数进入对应的子程序JumpTable ; 函数地址表的入口基地址 DCD DoAdd ; 加法子程序 DCD DoSub ; 减法子程序 DCD DoMul ; 乘法子程序 DCD DoDiv ; 除法子程序DoAdd ADD R0, R1, R2 ; R0 = R1 + R2 MOV PC, LR ; 返回DoSub SUB R0, R1, R2 ; R0 = R1 - R2 MOV PC, LR ; 返回DoMul MOV R0, R1, LSL R2 ; R0 = R1 R2 MOV PC, LR ; 返回 AREA

13、 NUM, DATA, READWRITEchoice DCD 3 ; 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 调用子程序arithfunc stop: b stop arithfunc: CMP R0,#

14、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 + R2 MOV PC, LR 返回DoSub: SUB R0, R1, R2 R0 = R1 -

15、R2 MOV PC, LR 返回DoMul: MOV R0, R1, LSL R2 R0 = R1 R2 MOV PC, LR 返回.ltorg choice: .long 3 0:表示选择加法子程序 1:表示选择减法子程序 2:表示选择乘法子程序 :表示选择除法子程序.end2. 改写以下程序,实现从ARM状态切换到thumb状态,最后再切换到ARM状态!#*# NAME: ThumbCode.s *# Author: Embest *# Desc: ThumbCode examples *# History: shw.He 2005.02.22 *#*/*-*/* constant def

16、ine */*-*/.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 u

17、p 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 + 1

18、add r3,r3,#1 /设置循环标志,便于从thumb切换到arm后能停止程序 cmp r3,#2 Beq stop bx r0 stop: b stop .thumbTstart: LDR r2,=header mov r0, #10 mov r1, #3 bl doadd bx r2doadd: add r0, r0, r1 mov pc, lr.end 作业7已知,若任意给一个定值,假定为-25,存放在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。 参考程序:.text.global _start_start: ldr r0,=src ldr r3,=dst ldr r1

19、,r0 ldr r2,=0x0 /*r2储存常数0*/ cmp r1,r2 addgt r2,r2,#1 sublt r2,r2,#1 str r2,r3stop: b stop.ltorgsrc: .long -25dst: .long 0.end作业8从x单元开始的5个连续字单元中存放5个无符号数,从中找出最大者送入y单元中。参考程序:.text.global _start.equ num,4_start: ldr r4,=num /*r4的数值作为计数变量*/ ldr r0,=x ldr r5,=y ldr r1,r0,#4loop: ldr r1,r0,#4 ldr r2,r0,#4

20、cmp r2,r1 strge r2,r5 strlt r1,r5 sub r4,r4,#1 cmp r4,#0 bne loopstop: b stop.ltorgx: .long 1,2,6,3,9y: .long 0.end 作业9(冒泡排序法):利用逐次求大数的方法对存单元ARRAY开始的以字节为单位的无符号数进行从大到小排序。在以BUF为首址的字存储区中存放有10个无符号数 0x0FF,0x00, 0x40, 0x10, 0x90, 0x20, 0x80, 0x30, 0x50, 0x70, 0x60,现需将它们按从小到大的顺序排列在BUF存储区中,试编写其程序。参考程序:分析:采用

21、逐一比较法:将第一个存储单元中的数与其后n-1个存储单元中的数逐一比较,每次比较之后,总是把小者放在第一个存储单元之中,经过n-1次比较之后,n个数中最小者存入第一存储单元中;接着从第二个存储单元开始,同理,经过n-2次比较之后,得到n-1个数中最小者存入第二存储单元中;如此类推,当最后两个存储单元的数比较完成之后,从小到大的排列顺序就实现了。 “冒泡排序”算法。各寄存器分配功能如下:R0:用来指示缓冲区初始地址R1:外循环计数器R2:循环计数器R3:外循环地址指针R4:循环地指针R5:循环下一个数地址指针R6:存放循环一轮比较的最小值R7:存放循环取出的下一个比较值程序代码:.equ num

22、,10.text.global _start_start: LDR R0,=Datas 指向数组的首地址 mov R1,#0 外循环计数器 mov R2,#0 循环计数器LOOPI: add R3,R0,R1,lsl #2 外循环首地址存R3 mov R4,R3 循环首地址存R4 ADD R2,R1,#1 存换计数器初值 MOV R5,R4 循环下一地址初值 LDR R6,R4 取循环下一地址值R4LOOPJ: add r5,r5,#4 循环下一地址值 ldr r7,r5 取出下一地址值至R7 cmp r6,r7 比较 blt next 小则取下一个 swp r7,r6,r5 大则交换,最小值

23、R6 mov r6,r7next: add r2,r2,#1 循环计数 cmp r2,#num 循环中止条件 blt LOOPJ 小于N则继续循环 swp r7,r6,r3 否则,循环一轮结束,将最小数存入外循环的首地址处 add r1,r1,#1 外循环计数 cmp r1,#num-1 外循环中止条件 blt LOOPI 小于N-1则继续执行外循环 BEQ stop b _start stop: b stop .ltorgDatas: .long 0x0FF, 0x00, 0x40 .long 0x10, 0x90, 0x20, .long 0x80, 0x30, 0x50, .long 0

24、x70 .end作业10通过设置的入口参数查找函数地址表,实现选择不同的函数功能。已知两个操作数分别存放于寄存器R0与R1中,函数1实现两数相加R0+R1;函数2实现两数相减R0-R1;函数3实现两数相乘R0*R1; 函数4实现两数相除R0/R1。参考代码:.text.equ num,3.global _start_start: ldr r0,=0x01 ldr r1,=0x02 ldr r4,=0x02 /*r4用来作为选择函数入口Doadd,Dosub,Domul的选项(默认为1,可修改)*/ bl Funcstop: b stopFunc: cmp r4,#num movge pc,lr

25、 /*当r4的值大于等于3时,调回_start函数*/ ldr r3,=JTable ldr pc,r3,r4,lsl #2 /*因为函数入口是.long类型,所以需要左移(LSL)2位*/JTable: .long Doadd,Dosub,DomulDoadd: add r2,r0,r1 mov pc,lrDosub: sub r2,r0,r1 mov pc,lrDomul: mul r2,r0,r1 mov pc,lr.end作业11编程实现S=1+2*3+4*5+.+N*(N+1),其中N=10。参考答案:分析过程算法功能:相邻数相乘:MUL累加: ADD循环次数:10 CMP B指令初始值 S=1 N N+1 部分和N(N+1)寄存器分配R0: S 1 R0+R3得S值R1: N的初始值 2 循环变量R2: N+1 由R1=1 求得R3: N(N+1)参考程序:.text.equ N,10.global _sta

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1