您的位置:首页 > 其它

ARM汇编指令学习 - 实现数据块的拷贝复制

2016-04-07 16:53 183 查看
ARM汇编指令学习 - 实现数据块拷贝

这个学期,系里开了嵌入式的课程,正好借助这个机会系统地学习下ARM的指令系统。这个系列文章主要是通过一些简单的汇编程序实例来学习ARM指令,使用的编译器是ADS 1.2。

程序要求

设计一段程序完成数据块的复制,数据从源数据区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




转载这篇文章是感觉这段很小的代码很有助于学习这些汇编指令

转载地址:http://www.cnblogs.com/ycz9999/archive/2012/05/02/2478638.html,谢谢分享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: