设计一段程序完成数据块的,数据从源数据区snum到目标数据区dnum,数据量大小为NUM字(1个字=4个字节),时以8个字为单位进行,对于最后所剩不到8个字的数据,以字为单位进行。
程序清单:
1 ;============================================================================== 2 ; blocks.s: 将数据从源数据区snum到目标数据区dnum,数据量大小为NUM字 3 ; 时以8个字为单位进行,最后不够8个字的数据按1个字为单位 4 ;============================================================================== 5 6 NUM EQU 20 ; NUM表示有20个字(80字节)数据,以字为单位,宏定义要顶格书写 7 8 AREA Init, CODE, READONLY ; 定义一个代码段,段名为Init,属性为READONLY 9 CODE32 ; 告诉汇编编译器后面的指令序列为32位的ARM指令, 10 ; 该伪操作只是告诉编译器后面指令的类型,其本身 11 ; 并不进行程序状态切换 12 ENTRY ; 指定程序的入口点 13 14 15 ;变量的初始化 16 START 17 LDR R0, =SRC ; R0指向源数据区起始地址 18 LDR R1, =DST ; R1指向目的数据区起始地址 19 MOV R2, #NUM ; R2存放待数据量大小,以字为单位 20 MOV SP, #0X400 ; 堆栈指针指向0X400,堆栈增长模式由装载指令的类型域确定 21 22 ;确定条件及保存现场 23 BLKCOPY 24 MOV R3, R2, LSR #3 ; 将R2中值除以8后的结果存放在R3,R3中值表示NUM中有多少个8字单元 25 BEQ COPYWORDS ; 若Z=1(R3=0,数据少于1个8字单元),则跳转到COPYWORDS处,运行少于8字单元数据处理程序 26 STMFD SP!, {R4-R11} ; 保存R4-R11的内容到堆栈,并更新栈指针,FD:满递减堆栈,由此可知堆栈长向 27 28 ;8字单元数据主程序 29 OCTCOPY 30 LDMIA R0!, {R4-R11} ; 从R0所指的源数据区装载8个字数据到R4-R11中,每次装载1个字后R0中地址加1,最后更新R0中地址 31 STMIA R1!, {R4-R11} ; 将R4-R11的8个字数据存入R1所指的目的数据区,每次装载1个字后R1中地址加1,最后更新R1中地址 32 SUBS R3, R3, #1 ; 每一次,则R3=R3-1,表示已经了1个8字单元,结果影响CPSR 33 BNE OCTCOPY ; 若CPSR的Z=0(即运算结果R3不等于0),跳转到OCTCOPY,继续下一个8字单元数据 34 LDMFD SP!, {R4-R11} ; 将堆栈内容恢复到R4-R11中,并更新堆栈指针,此时整8字单元数据已经完成,且出栈模式应和入栈模式一样 35 36 ;少于8字单元数据处理程序 37 COPYWORDS 38 ANDS R2,R2, #7 ; 得到NUM除以8后余数,即未满8字单元数据的字数(1个字=4个字节) 39 BEQ STOP ; 若R2=0(NUM有整数个8字单元),则停止 40 41 ;单字单元数据程序,用来处理不足8字单元数据 42 WORDCOPY 43 LDR R3, [R0], #4 ; 将R0所指源数据区的4个字节(1个字)数据装载至R3,然后R0=R0+4 44 STR R3, [R1], #4 ; 将R3中4个字节(1个字)数据存到R1所指目的数据区,然后R1=R1+4 45 SUBS R2, R2, #1 ; 数据传输控制计数器减1(其总是小于8),成功一个字数据 46 BNE WORDCOPY ; 若R2不等于0,则转到WORDCOPY,继续下一个字数据 47 48 ;停止操作死循环 49 STOP 50 B STOP 51 52 ;数据缓冲池 53 LTORG ;声明一个数据缓冲池的开始,一般在代码的最后面 54 ;定义源数据区,每个数据均是字型(占4个字节) 55 ;DCD,分配一段字内存单元(分配的内存是字对齐的),并用后续的数据初始化该段内存 56 SRC DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 57 58 ;定义目的数据区,并初始化为0 59 DST DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60 61 62 ;源程序结尾 63 END
代码使用ADS 1.2编译后,即可使用AXD Debugger单步调试,可以很直观的看到代码的执行结果。
上一篇:ARM寄存器的7种工作模式和几种寻址方式
下一篇:ARM汇编中lr(r14)寄存器的作用
推荐阅读最新更新时间:2024-03-16 14:58
设计资源 培训 开发板 精华推荐
- 三星 Exynos 2600 芯片前景堪忧:良率挑战严峻,有被取消量产风险
- 苹果搁置反垄断报告的请求遭印度监管机构拒绝,案件将继续推进
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 边缘 AI 如何提升日常体验
- 苹果要首发!台积电宣布2nm已准备就绪
- AMD有望用上全新芯片堆叠技术:延迟大幅减少、性能显著提升