您的位置 首页 嵌入式

ARM汇编指令学习 完成数据块复制

这个学期,系里开了嵌入式的课程,正好借助这个机会系统地学习下ARM的指令系统。这个系列文章主要是通过一些简单的汇编程序实例来学习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 START17     LDR    R0,    =SRC                    ; R0指向源数据区开端地址18     LDR    R1,    =DST                    ; R1指向意图数据区开端地址19     MOV    R2,    #NUM                    ; R2寄存待数据量巨细,以字为单位20     MOV    SP, #0X400                     ; 仓库指针指向0X400,仓库增加形式由装载指令的类型域确认    21 22 ;确认条件及保存现场23 BLKCOPY24     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 OCTCOPY30     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字单元,成果影响CPSR33     BNE    OCTCOPY                        ; 若CPSR的Z=0(即运算成果R3不等于0),跳转到OCTCOPY,持续下一个8字单元数据34     LDMFD    SP!,    {R4-R11}             ; 将仓库内容康复到R4-R11中,并更新仓库指针,此刻整8字单元数据现已完结,且出栈形式应和入栈形式相同35 36 ;少于8字单元数据处理程序37 COPYWORDS38     ANDS    R2,R2,    #7                  ; 得到NUM除以8后余数,即未满8字单元数据的字数(1个字=4个字节)39     BEQ    STOP                           ; 若R2=0(NUM有整数个8字单元),则中止40 41 ;单字单元数据程序,用来处理缺乏8字单元数据    42 WORDCOPY43     LDR    R3,    [R0],    #4             ; 将R0所指源数据区的4个字节(1个字)数据装载至R3,然后R0=R0+444     STR    R3,    [R1],    #4             ; 将R3中4个字节(1个字)数据存到R1所指意图数据区,然后R1=R1+445     SUBS    R2,    R2,    #1              ; 数据传输操控计数器减1(其总是小于8),成功一个字数据46     BNE    WORDCOPY                       ; 若R2不等于0,则转到WORDCOPY,持续下一个字数据47     48 ;中止操作死循环49 STOP50     B    STOP51 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 ;界说意图数据区,并初始化为059 DST    DCD    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,060 61 62 ;源程序结束63     END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/276856.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部