ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRH

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:

—  LDR     字数据加载指令—  LDRB    字节数据加载指令—  LDRH    半字数据加载指令—  STR     字数据存储指令—  STRB    字节数据存储指令—  STRH    半字数据存储指令

1、LDR指令

LDR指令的格式为:

LDR{条件} 目的寄存器,<存储器地址>

LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。

指令示例:

LDR   R0,[R1]                  ;将存储器地址为R1的字数据读入寄存器R0。

LDR   R0,[R1,R2]             ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR   R0,[R1,#8]             ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR   R0,[R1,R2] !           ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR   R0,[R1,#8] !          ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDR   R0,[R1],R2              ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR   R0,[R1,R2,LSL#2]!   ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR   R0,[R1],R2,LSL#2     ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR r, label  和 LDR r, =label的区别

LDR r, =label

会把label表示的值加载到寄存器中。

LDR r, label

会把label当做地址,把label指向的地址中的值加载到寄存器中。譬如 label的值是 0x8000, LDR r, =label会将 0x8000加载到寄存器中,而LDR r, label则会将内存0x8000处的值加载到寄存器中。

ADR 和 ADRL 伪指令:

ADR 和 ADRL 伪指令用于将一个地址加载到寄存器中。

ADR为小范围的地址读取伪指令。ADR指令将基于PC相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR伪指令被编译器替换在一条合适的指令,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能使用一条指令实现,则产生错误。其能加载的地址范围,当为字节对齐时,是-1020~1020,当为非字对齐时在-255~255之间。

ADRL是中等范围的地址读取指令。会被编译器翻译成两条指令。如果不能用两条指令表示,则产生错误。

ADRL能加载的地址范围当为非字节对齐时是-64K~64K之间;当为字节对齐时是-256K~256K之间。

2、LDRB指令

LDRB指令的格式为:

LDR{条件}B 目的寄存器,<存储器地址>

LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

指令示例:

LDRB R0,[R1]         ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。

LDRB R0,[R1,#8]    ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

3、LDRH指令

LDRH指令的格式为:

LDR{条件}H 目的寄存器,<存储器地址>

LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

指令示例:

LDRH R0,[R1]         ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。

LDRH R0,[R1,#8]    ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。

LDRH R0,[R1,R2]    ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

4、LDM指令:

L的含义仍然是LOAD,即是Load from memory into register。

虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

LDMFD     SP! ,   {R0, R1, R2}

实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去。

5、STR指令

STR指令的格式为:

STR{条件} 源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR

指令示例:

STR   R0,[R1],#8    ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STR   R0,[R1,#8]    ;将R0中的字数据写入以R1+8为地址的存储器中。

LDR是内存数据放到寄存器,即装载,是读  
STR是寄存器数据放到内存,即存储,是写

6、STRB指令

STRB指令的格式为:

STR{条件}B 源寄存器,<存储器地址>

STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。

指令示例:

STRB R0,[R1]         ;将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRB R0,[R1,#8]    ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

7、STRH指令

STRH指令的格式为:

STR{条件}H 源寄存器,<存储器地址>

STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。

指令示例:

STRH R0,[R1]         ;将寄存器R0中的半字数据写入以R1为地址的存储器中。

STRH R0,[R1,#8]    ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。

8、STM指令:

S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

STMFD      SP!,   {R0}

同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

意思是:把R0保存到堆栈(sp指向的地址)中。

ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH相关推荐

  1. ARM汇编加载/存储指令

    用在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器:存储指令则是完成相反操作.

  2. 单寄存器加载与存储指令

    这种指令用于把单一的数  传入或者传出一个寄存器.支持的数据类型有字(32 位 ) .半字(16 位)  和字节.常用的单寄存器加载与存储指令包括: LDR/STR            字数据加载/ ...

  3. 借由ARM CORTEX-M芯片分析C程序加载和存储模型

    https://zhuanlan.zhihu.com/p/22048373 写文章 借由ARM CORTEX-M芯片分析C程序加载和存储模型 王小军 1 年前 阿军最近在忙着血氧手环嵌入式系统的技术预 ...

  4. ARMv8体系结构基础03:加载和存储指令

    目录 1 A64指令集概述 1.1 A64指令集特征 1.1.1 指令定长 1.1.2 可使用64位指针 1.1.3 使用一致的编码结构(consistent encoding scheme) 1.1 ...

  5. Python之pandas数据加载、存储

    Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...

  6. python观察日志(part28)--数据的加载与存储

    学习笔记,仅供参考,有错必究 参考文献:编码问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position; 数据的加载 ...

  7. xp系统打开计算机配置文件,浅析xp系统如何解决开机出现“Windows不能加载本地存储的配置文件“...

    对于打开电脑出现"Windows不能加载本地存储的配置文件"的问题,之前小编有跟大家分享通过用户配置文件设置来解决这个问题.可是有部分xp系统用户反馈设置完之后问题还是没有得到解决 ...

  8. 《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式

    第1章 准备工作 第2章 Python语法基础,IPython和Jupyter 第3章 Python的数据结构.函数和文件 第4章 NumPy基础:数组和矢量计算 第5章 pandas入门 第6章 数 ...

  9. python数据分析实例_python数据分析实例3-商铺数据加载及存储

    商铺数据加载及存储 在data文件夹存放有商铺数据.csv文件,路径:path = '../data/商铺数据.csv' 要求: 1.成功读取"商铺数据.csv"文件,并展示打印出 ...

最新文章

  1. 246.三元图的应用与绘图实战
  2. 第十七届智能汽车竞赛-多车编队组入门讲解
  3. 基于SSH实现健身俱乐部管理系统
  4. python3 整除 取模
  5. 二层以太网技术—Vecloud
  6. 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)
  7. CardLayout布局练习(小的图片浏览器)
  8. Java 面试高频提问知识点一
  9. golang windows环境下的配置安装
  10. C++奥赛第四弹——阿克曼函数
  11. 《单片机原理与接口技术》小结
  12. 前端开发过程中经常遇到的问题以及对应解决方法 (持续更新)
  13. C. Alternating Sum(数论——等比数列公式与变换)
  14. 支配树与Lengauer-Tarjan算法
  15. python实训报告5000字_测量实训报告范文5000字
  16. linux下tar.bz2文件的 解压缩方法
  17. 网吧服务器掉硬盘,一些网吧的无主机系统,是这样实现的!
  18. 自媒体各大平台收益对比_各大自媒体平台的收益收益如何 以下是我个人的一个汇总...
  19. 如何系统学习MySQL数据库?
  20. composer Updating dependencies (including require-dev)

热门文章

  1. 机器学习中的EM算法具体解释及R语言实例(1)
  2. 走进 Facebook POP 的世界
  3. BZOJ 2662: [BeiJing wc2012]冻结(最短路)
  4. wp7 生命周期及多任务 详解
  5. 快快: 一点即玩的游戏客户端平台
  6. [二分查找] 一:子区间界限应当如何确定
  7. Django+xadmin打造在线教育平台(十)
  8. Shell编程进阶篇(完结)
  9. 戴尔:发力互联互通 构建世界基础设施中心
  10. JavaScript ES6箭头函数指南