ARM汇编程序设计之--数据搬移
原来只知道一个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汇编程序设计之--数据搬移相关推荐
- ARM汇编程序设计实例
10.5 ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1 条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...
- PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)
该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用.实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改 ...
- linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计
嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...
- 嵌入式ARM设计编程(一) 简单数据搬移
文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 熟悉实验开发环境,掌握简单ARM ...
- 【ARM】ARM汇编程序设计(六) stm和ldm
00. 目录 文章目录 00. 目录 01. ldmea指令 02. ldmed指令 03. ldmfa指令 04. ldmfd指令 05. stmea指令 06. stmed指令 07. stmfa ...
- 【ARM】ARM汇编程序设计(五) str和ldr
00. 目录 文章目录 00. 目录 01. ldr伪指令 02. ldr指令 03. adr指令 04. str指令 05. 附录 01. ldr伪指令 ldr示例一: .section .roda ...
- 【ARM】ARM汇编程序设计(三) 循环结构
00. 目录 文章目录 00. 目录 01. 循环结构-死循环 02. 循环结构-累加和 03. 循环结构-循环输出 04. 循环结构-循环输出 05. 随机数 06. 综合应用一 07. 综合应用二 ...
- 【ARM】ARM汇编程序设计(一)
00. 目录 文章目录 00. 目录 01. 第一个汇编程序 02. printf函数 03. 字符串 04. 进制 05. mov指令 06. mvn指令 07. add指令 08. sub指令 0 ...
- 【ARM】ARM汇编程序设计(四) 选择结构
00. 目录 文章目录 00. 目录 01. if 结构一 02. if 结构二 03. if 结构三 04. if 结构四 05. if 结构五 06. switch结构 07. 附录 01. if ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- A ...
最新文章
- EJB3.0定时发送jms(发布/定阅)方式
- 深入理解Linux内核-内存寻址
- java+criteriaquery_Hibernate动态条件查询(Criteria Query)
- 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿
- 最新的20多个JMS面试问答(2020)
- cd命令 nodejs_nodejs学习之 - mac 终端常用开发命令(一)
- C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单
- tp5中php正则怎么写,详解tp5中phpmailer的使用
- ubuntu16.04--cuda
- C++ 代码调试建议
- mysql timestamp 值不合法问题
- 天联高级版服务器信息怎么查,天联高级版
- 3月8号女神节不知道送什么?python告诉你~(祝小仙女们节日快乐~)
- python编程实现华氏温度和摄氏温度转换
- JS中var、let以及const关键字到底怎么用?
- linux下载blast软件
- JSD-2204-SpringBoot+MyBatis-Day12
- 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案
- IC学习笔记3——异步FIFO
- Bolt介绍及基于其的实例
热门文章
- rk1808交叉编译opencv_我用AI视觉模组DIY了一个驾驶疲劳监测仪
- 会不会导致内存泄漏_使用ThreadLocal不当可能会导致内存泄露
- python fft函数_python scipy fft.fft用法及代码示例
- signalr判断对方是否和服务器断开_感情初期,如何快速判断对方是否合适,看这三件事...
- MySQL如何把A表查询出来的某个字段的数据插入到新增的字段的下面
- Event Loop - JavaScript和node运行机制
- 慢查询日志分析工具mysqldumpslow
- oracle函数,查询,事务
- BeanShell变量和方法的作用域
- 【MyBatis】bind标签