原来只知道一个MOV指令,却不知道还有个MOVS,在书上查找了只有MOV传送指令,

num EQU 20;定义一个常量num,值为20;---------------------------------------------------------------------------------------------------
;AREA分析如下:;语法格式:
;AREA   段名  属性1,属性2,。。。;AREA伪指令用于定义一个代码段或数据段。其中段名若以数字开头,则该段名需用"|"
;括起来,如|1_test|;属性字段表示该代码段(或数据段) 的相关属性,多个属性用逗号分开常用
;属性如下:;CODE属性:用于定义代码段,默认为READONLY;DATA属性:用于定义数据段,默认为READWRITE;READONLY属性:指定本段为只读,代码段默认为READONLY;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE;ALIGN属性:使用方式为ALIGN表达式。;COMMON属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享
;同一段存储单元
;---------------------------------------------------------------------------------------------------AREA    EXAMPLE2,CODE,READONLY  ;声明一个代码段,名为EXAMPLE2ENTRY ;指定程序入口点;-----------------------------------------------------------------------------------------------  ;ENTRY:一个完整的汇编程序中至少要有一个ENTRY,也可以有多个。当有多个ENTRY时,程序的真正入口点由;连接器指定,但在一个源文件里最多只能有一个ENTRY,也可以没有。;-----------------------------------------------------------------------------------------------
StartLDR        r0, =src           ;/*  r0 = pointer to source block 指向源操作数的首地址*/LDR      r1, =dst           ;/*  r1 = pointer to destination block 指向目的操作数的首地址*/MOV        r2, #num            ;/*  r2 = number of words to copy 要拷贝大小*/MOV       sp, #0x400          ;/*  set up stack pointer (r13) 确定堆栈地址*/blockcopyMOVS   r3,r2, LSR #3       ;/*  number of eight word multiples */BEQ       copywords           ;/*  less than eight words to move ? */STMFD    sp!, {r4-r11}       ;/*  save some working registers */
octcopyLDMIA    r0!, {r4-r11}       ;/*  load 8 words from the source */STMIA   r1!, {r4-r11}       ;/*  and put them at the destination */SUBS r3, r3, #1          ;/*  decrement the counter */BNE        octcopy             ;/*  ... copy more */LDMFD  sp!, {r4-r11}       ;/*  don't need these now - restore originals */
copywordsANDS   r2, r2, #7          ;/*  number of odd words to copy */BEQ      stop                ;/*  No words left to copy ? */
wordcopyLDR     r3, [r0], #4        ;/*  a word from the source */STR       r3, [r1], #4        ;/*  store a word to the destination */SUBS r2, r2, #1          ;/*  decrement the counter */BNE        wordcopy            ;/*  ... copy more */
stopB       stop                ;/*在此进入死循环*/AREA    blockdata,DATA,READWRITE    ;声明一个数据段,名为blockdatasrc  DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst  DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END

今天到这算是搞定这个程序了,算是完全弄懂了他是怎么执行的了,不容易啊!

还有一个要特别说明的寄存器操作方式:

多寄存器装载与存储:

用一条指令把存储器里的数据装载到多个寄存器,或者把多个寄存器里的数据存储到存储器,这类指令就是多寄存器装载与存储指令,他们特别适合两种情况:堆栈操作和数据块传输。

在这两种情况下,使用多寄存器传送指令比使用单寄存器传送指令效率要高很多。

实现方式和分类:

STMIA/LDMIA     IA(Increment After)表示在数据传送后,基址寄存器的值递增。

STMIB/LDMIB  IB(Increment Before) 表示在数据传送前,基址寄存器的值递增

STMDA/LDMDA  DA(Decrement After)表示在数据传送后,基址寄存器的值递减

STMDB/LDMDB  DB(Decrement Before)表示在数据传送前,基址寄存器的值递减

到这里算是全部搞懂了,要是您觉得哪里存在问题请留言,谢谢!

ARM汇编程序设计之--数据搬移相关推荐

  1. ARM汇编程序设计实例

    10.5  ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1  条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...

  2. PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

    该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用.实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改 ...

  3. linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计

    嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...

  4. 嵌入式ARM设计编程(一) 简单数据搬移

    文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 熟悉实验开发环境,掌握简单ARM ...

  5. 【ARM】ARM汇编程序设计(六) stm和ldm

    00. 目录 文章目录 00. 目录 01. ldmea指令 02. ldmed指令 03. ldmfa指令 04. ldmfd指令 05. stmea指令 06. stmed指令 07. stmfa ...

  6. 【ARM】ARM汇编程序设计(五) str和ldr

    00. 目录 文章目录 00. 目录 01. ldr伪指令 02. ldr指令 03. adr指令 04. str指令 05. 附录 01. ldr伪指令 ldr示例一: .section .roda ...

  7. 【ARM】ARM汇编程序设计(三) 循环结构

    00. 目录 文章目录 00. 目录 01. 循环结构-死循环 02. 循环结构-累加和 03. 循环结构-循环输出 04. 循环结构-循环输出 05. 随机数 06. 综合应用一 07. 综合应用二 ...

  8. 【ARM】ARM汇编程序设计(一)

    00. 目录 文章目录 00. 目录 01. 第一个汇编程序 02. printf函数 03. 字符串 04. 进制 05. mov指令 06. mvn指令 07. add指令 08. sub指令 0 ...

  9. 【ARM】ARM汇编程序设计(四) 选择结构

    00. 目录 文章目录 00. 目录 01. if 结构一 02. if 结构二 03. if 结构三 04. if 结构四 05. if 结构五 06. switch结构 07. 附录 01. if ...

  10. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137  转载请著名出处 本博客相关文档下载 :  -- A ...

最新文章

  1. EJB3.0定时发送jms(发布/定阅)方式
  2. 深入理解Linux内核-内存寻址
  3. java+criteriaquery_Hibernate动态条件查询(Criteria Query)
  4. 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿
  5. 最新的20多个JMS面试问答(2020)
  6. cd命令 nodejs_nodejs学习之 - mac 终端常用开发命令(一)
  7. C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单
  8. tp5中php正则怎么写,详解tp5中phpmailer的使用
  9. ubuntu16.04--cuda
  10. C++ 代码调试建议
  11. mysql timestamp 值不合法问题
  12. 天联高级版服务器信息怎么查,天联高级版
  13. 3月8号女神节不知道送什么?python告诉你~(祝小仙女们节日快乐~)
  14. python编程实现华氏温度和摄氏温度转换
  15. JS中var、let以及const关键字到底怎么用?
  16. linux下载blast软件
  17. JSD-2204-SpringBoot+MyBatis-Day12
  18. 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案
  19. IC学习笔记3——异步FIFO
  20. Bolt介绍及基于其的实例

热门文章

  1. rk1808交叉编译opencv_我用AI视觉模组DIY了一个驾驶疲劳监测仪
  2. 会不会导致内存泄漏_使用ThreadLocal不当可能会导致内存泄露
  3. python fft函数_python scipy fft.fft用法及代码示例
  4. signalr判断对方是否和服务器断开_感情初期,如何快速判断对方是否合适,看这三件事...
  5. MySQL如何把A表查询出来的某个字段的数据插入到新增的字段的下面
  6. Event Loop - JavaScript和node运行机制
  7. 慢查询日志分析工具mysqldumpslow
  8. oracle函数,查询,事务
  9. BeanShell变量和方法的作用域
  10. 【MyBatis】bind标签