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

上传人:C****o 文档编号:42700538 上传时间:2022-09-16 格式:PDF 页数:17 大小:121.22KB
返回 下载 相关 举报
2022年嵌入式系统原理及应用题目要求+程序代码 .pdf_第1页
第1页 / 共17页
2022年嵌入式系统原理及应用题目要求+程序代码 .pdf_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《2022年嵌入式系统原理及应用题目要求+程序代码 .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式系统原理及应用题目要求+程序代码 .pdf(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、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 这七个数据送给R0R0寄存器,然后又把

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

3、tore指令寻址方式,可以知道指令STMFD 和 LDMFD 的地址计算方法:STMFD 指令的寻址方式为事后递减方式(DB)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 17 页 -2 而 DB寻址方式实际内存地址为:start_address=Rn-(Number_Of_Set_Bits_In(register_list)*4)end_address=Rn-4 STM指令操作的伪代码:if ConditionPassed(cond)then address=start_address for i=0 to 15 if register_listi=1 Memoryaddre

4、ss=Ri address=address+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=Rn end_address=Rn+(Number_of_set_bits_in(register_list)*4)-4 LDM指令操作的伪代码(未考虑 PC寄存器):if ConditionPas

5、sed(cond)then address=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:名师资料总结-精品资料欢迎下载-名师精心整理-第

6、 2 页,共 17 页 -3 mov R0,#10 mov R1,R0,LSL#3 mov R2,R0,LSL#1 add R3,R1,R2 stop: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

7、SP!,R0-R2 stop:b stop.ltorg x:.long 80,90,100 y:.long 10,20,30.end 作业 3 已知 R0 和 R1 的值,要求保留R0 的低 16 位,保留 R1 的高 16 位状态,最后将这两个值组成一个新的数送给R3.参考代码:.text.global _start 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 17 页 -4 _start:LDR R0,=0 x12345678 LDR R1,=0 x87654321 ldr R2,=0 xffff LDR R4,=0 xffff0000 AND R0,R0,R2 AND

8、R1,R1,R4 ORR R3,R0,R1 stop:B stop.end 作业 4 在 ARM GNU环境下用 ARM 汇编语言编程序实现,00,0,0 x xyxxx x参考代码:.text.global _start _start:LDR R0,=x LDR R1,=y LDR R2,R0 CMP R2,#0 BEQ ZERO BGT ZHENG BLT FU ZERO:MOV R3,#0 STR R3,R1 B stop ZHENG:mov R3,R2 STR R3,R1 B stop 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 17 页 -5 FU:mvn R3,R

9、2 mov R4,#0 x1 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 中,高32 位放在 R9 中;高 32 位 R1 乘以 X(R0)后再加上R9,得到 64 位结果的高32 位,存入R9 参考程序:.global _start.text _start:MOV R8,#20 低 32 位初始化为20 MOV R

10、9,#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 二、已知 a=R0,b=R1.while(ab)do if(ab)then a=a-b else a=b-a end if end while 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 17 页 -6 result=a 根据以上代码写出对应的汇编

11、代码:参考代码:CMP R0,R1 CMPNE R0,R1 SubGT R0,R0,R1 SubLT R0,R1,R0.end 作业 6 1.将下面的 ADS 环境下的程序代码改写成GUN 环境下的程序代码。(调试时使用 F11 step into,注意和 F10 step over的区别)AREA Jump,CODE,READONL Y num EQU 4;函数地址表内容的个数ENTRY CODE32 start LDR R0,=choice;R0 指向存储区的choice 单元LDR R0,R0 ;设置第一个参数:选择执行哪一个函数MOV R1,#16;设置第 1 个操作数MOV R2,#

12、2;设置第 2 个操作数BL arithfunc ;调用子程序arithfunc stop MOV R0,#0 x18;程序结束返回编译器调试环境LDR R1,=0 x20026 SWI 0 x123456 arithfunc CMP R0,#num;比较 R0 的值是否超过函数地址表的个数MOVHS PC,LR;如果大于,那么就返回到标号stop 处ADR R3,JumpTable;将函数地址表的地址作为基地址LDR PC,R3,R0,LSL#2;根据 R0 参数进入对应的子程序JumpTable;函数地址表的入口基地址DCD DoAdd;加法子程序DCD DoSub;减法子程序DCD Do

13、Mul;乘法子程序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 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 17 页 -7 MOV R0,R1,LSL R2;R0=R1 R2 MOV PC,LR;返回AREA NUM,DA TA,READWRITE choice DCD 3;0:表示选择加法子程序1:表示选择减法子程序;2:表示选择乘法子程序3:表示选择除法子程序END 参考程序:.equ num,4 函数地址表内容的个数

14、.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,#num 比较 R0 的值是否超过函数地址表的个数MOVHS PC,LR 如果大于,那么就返回到标号stop 处ADR R3,JumpTable 将函数地址表的地址作为基地址LDR PC,R3,R0,LSL#2 根据 R0 参数进

15、入对应的子程序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-R2 MOV PC,LR 返回DoMul:MOV R0,R1,LSL R2 R0=R1 R2 MOV PC,LR 返回.ltorg choice:.long 3 0:表示选择加法子程序1:表示选择减法子程序2:表示选择乘法子程序:表示选择除法子程序.end 2.改写以下程序,实

16、现从 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 sta

17、rts in ARM state,*/bx r0/*so small ARM code header used*/*to call Thumb main program.*/nop.thumb Tstart:mov r0,#10/*Set up parameters*/mov r1,#3 bl doadd/*Call subroutine*/stop:b stop/*-*/*Subroutine code:R0=R0+R1 and return*/*-*/名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 17 页 -9 doadd:add r0,r0,r1 /*Subroutine

18、 code*/mov pc,lr/*Return from subroutine.*/.end/*Mark end of file*/参考程序:.global _start.text _start:mov r3,#0.arm header:adr r0,Tstart+1 add r3,r3,#1/设置循环标志,便于从thumb 切换到 arm 后能停止程序cmp r3,#2 Beq stop bx r0 stop:b stop.thumb Tstart:LDR r2,=header mov r0,#10 mov r1,#3 bl doadd bx r2 doadd:add r0,r0,r1 m

19、ov pc,lr.end 作业 7 已知1,00,01,0 xyxx,若任意给一个定值,假定为-25,存放在 x 单元,函数值存放在y 单元;要求根据 x 中的值来确定y 的值。参考程序:.text.global _start _start:ldr r0,=src ldr r3,=dst ldr r1,r0 名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 17 页 -10 ldr r2,=0 x0/*r2 储存常数0*/cmp r1,r2 addgt r2,r2,#1 sublt r2,r2,#1 str r2,r3 stop:b stop.ltorg src:.long-25

20、dst:.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,#4 loop:ldr r1,r0,#4 ldr r2,r0,#4 cmp r2,r1 strge r2,r5 strlt r1,r5 sub r4,r4,#1 cmp r4,#0 bne loop stop:b stop.ltorg x:.long 1,2,6,3,9

21、y:.long 0.end 作业 9 名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 17 页 -11(冒泡排序法):利用逐次求大数的方法对内存单元ARRAY开始的以字节为单位的无符号数进行从大到小排序。在以BUF 为首址的字存储区中存放有10 个无符号数0 x0FF,0 x00,0 x40,0 x10,0 x90,0 x20,0 x80,0 x30,0 x50,0 x70,0 x60,现需将它们按从小到大的顺序排列在BUF 存储区中,试编写其程序。参考程序:分析:采用逐一比较法:将第一个存储单元中的数与其后n-1 个存储单元中的数逐一比较,每次比较之后,总是把小者放在第一个存

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

23、向数组的首地址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 取内循环下一地址值R4 LOOPJ:add r5,r5,#4 内循环下一地址值ldr r7,r5 取出下一地址值至R7 cmp r6,r7 比较blt next 小则取下一个swp r7,r6,r5 大则交换,最小值R6 mov r6,r7 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 17

24、页 -12 next: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.ltorg Datas:.long 0 x0FF,0 x00,0 x40.long 0 x10,0 x90,0 x20,.long 0 x80,0 x30,0 x50,.long 0 x70.end

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

26、pc,lr/*当 r4 内的值大于等于3 时,调回 _start 函数*/名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 17 页 -13 ldr r3,=JTable ldr pc,r3,r4,lsl#2/*因为函数入口是.long 类型,所以需要左移(LSL)2 位*/JTable:.long Doadd,Dosub,Domul Doadd:add r2,r0,r1 mov pc,lr Dosub:sub r2,r0,r1 mov pc,lr Domul:mul r2,r0,r1 mov pc,lr.end 作业 11 编程实现S=1+2*3+4*5+,.+N*(N+1),

27、其中 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 _start _start:MOV R0,#1 R0 用作累加,置初值1,S MOV R1,#2 R1 用作第一个乘数,初值为 2,N loop:/*内层循环loop1,做乘法运算*/ADD R2,R1,#1 R2 用作第二个乘数,N+1 MUL R3,R2,R1

28、 实现 N*(N+1)部分积存于R3 ADD R0,R0,R3 将部分乘积累加至R0 ADD R1,R1,#1 改 N 的值得到下一轮乘数CMP R1,#10 循环次数比较名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 17 页 -14 BLE loop 未完成则重复stop:b stop.end 作业 12 编程实现S=1!+2!+3!,+N!,要求 N!用子程序实现。程序代码:.global _start.text _start:mov R0,#0 mov R1,#1 loop:mov R2,#1 mov R3,#1 mov R4,#1 loop1:mul R4,R2,R3

29、 mov R3,R4 add R2,R2,#1 cmp R1,R2 bge loop1 loop2:add R0,R0,R3 add R1,R1,#1 cmp R1,#10 bls loop stop:b stop.end 作业 13 在 C 程序中内嵌汇编程序实现将源字符串src 中的数据拷贝到目的字符串dest中参考程序:其中主程序如下:*/#include void strcpyy(const char*src,char*dest);_gccmain(void)char*s=this is a example AsmInC!;char temp64;名师资料总结-精品资料欢迎下载-名师精

30、心整理-第 14 页,共 17 页 -15 strcpyy(s,temp);/printf(Original string:%s n,s);/printf(Copyed string:%s,temp);return 0;void strcpyy(const char*src,char*dest)_asm(/*GNU 和 ADS 环境下的区别*/loop:ldrb r5,r0,#1 strb r5,r1,#1 cmp r5,#0;bne loop );作业 14/*在 GNU ARM 环境下设计程序,实现字符串的逆序拷贝。*/.global _start.text _start:LDR R0,=

31、SrcString 源字符串指针LDR R1,=DstString 目标字符串指针StrCopyDes:MOV R4,#0 字符串长度记录寄存器Strcpydes_L1:计算字符串的长度LDRB R2,R0,#1 ADD R4,R4,#1 TST R2,#0 xFF BNE Strcpydes_L1 SUB R4,R4,#1 SUB R0,R0,#2 R0 指向源字符串的末尾MOV R3,R1 R3 作为目标串的游标指针Strcpydes_L2:LDRB R2,R0,#-1 逐个拷贝字符串STRB R2,R3,#1 SUBS R4,R4,#1 BNE Strcpydes_L2 Strcpyde

32、s_L3:STRB R4,R3 向目标串末尾写0,此处 R4的值一定为0 名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 17 页 -16 Stop:B Stop.ltorg SrcString:.string Hello World!DstString:.string .end作业 15 1、在 GNU ARM编译环境下设计程序,用ARM 汇编语言调用C 语言实现20 的阶乘 20 的阶乘(20!)操作,并将64 位结果保存到寄存器R0、R1 中,其中R1 中存放高32 位结果。程序代码:汇编程序:/*Factorial.s*/.text.equ NI,20.global _

33、start.extern Factorial 申明 Factorial 是外部函数_start:mov r0,#NI BL Factorial 调用 Factorial stop:B stop.end/*main.c*/long Factorial(char n)long long ni=1;char i;for(i=1;i=n;i+)ni=ni*i;return ni;2、在 GNU ARM编译环境下设计程序,用 C 语言调用 ARM 汇编语言实现20 的阶乘(20!)操作,并将64 位结果保存到0 xFFFFFFF0 开始的内存地址单元,按照小端格式低位数据存放在低地址单元。名师资料总结-

34、精品资料欢迎下载-名师精心整理-第 16 页,共 17 页 -17/*首先建立汇编源文件start.s*/.global _start.global _gccmain.extern main 定义外部函数.text _start:BL main 调用 Main 函数Stop:B Stop _gccmain:mov pc,lr.end/*第二建立 C 语言源文件main.c*/extern void Factorial(char Nx);/声明 Factorial 是一个外部函数main()char N=20;Factorial(N);/调用汇编文件实现N!操作/*注:在此处观察结果*/whil

35、e(1);/*Factorial.s*/.global Factorial 声明 Factorial 为一个全局函数Factorial:MOV R8,R0 取参数MOV R9,#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 继续循环LDR R0,=0 xFFFFFFF0 STMIA R0,R8,R9 结果保存到0 x10000 开始的内存单元MOV PC,LR 子程序返回.end 名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 17 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁