ARM的六大类指令集—LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM

ARM的六大类指令集—LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM汇编指令:LDR、LDRB、LDRH、STR、STRB、STRH

大家好,又见面了,我是你们的朋友全栈君。

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[R1R2]             ;将存储器地址为R1+R2的字数据读入寄存器R0

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

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

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

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

LDR   R0[R1R2LSL2]   ;将存储器地址为R1R2×4的字数据读入寄存器R0,并将新地址R1R2×4写入R1

LDR   R0[R1]R2LSL2     ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1R2×4写入R1

2、LDRB指令

LDRB指令的格式为:

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

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

指令示例:

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

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

3、LDRH指令

LDRH指令的格式为:

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

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

指令示例:

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

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

LDRH R0[R1R2]    ;将存储器地址为R1R2的半字数据读入寄存器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为地址的存储器中,并将新地址R18写入R1

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

6、STRB指令

STRB指令的格式为:

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

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

指令示例:

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

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

7、STRH指令

STRH指令的格式为:

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

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

指令示例:

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

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

8、STM指令

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

   STMFD      SP!,   {R0}

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

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


注:非常感谢博主“希望之光”,文章转自他的博客:http://blog.chinaunix.net/uid-20379123-id-1956584.html





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149440.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • STL库 总览_stl库函数

    STL库 总览_stl库函数  STL库1泛型程序设计2STL标准模板库2.1STL库的基本组件2.1.1STL基本组件—-容器2.1.2STL基本组件—-迭代器2.1.3STL基本组件—-函数对象2.1.4STL基本组件—-算法3迭代器4容器的基本功能与分类4.1顺序容器  1泛型程序设计  泛型程序设计就是时候,将程序设计的尽量的通用。STL标准库就是泛型程序设计的一个很好的范例。  ◇编写不依赖具体数据类型的程序;  ◇将算法从特定的数据结构中抽象出来,成为通用的;  ◇

    2022年10月10日
    2
  • 华为模拟器ensp怎么安装_华为模拟器怎么安装

    华为模拟器ensp怎么安装_华为模拟器怎么安装简单介绍一下eNSP:eNSP是一款由华为提供的免费的图形化网络仿真工具平台,它将完美呈现真实设备实景(包括华为最新的ARG3路由器和X7系列的交换机),支持大型网络模拟,让你有机会在没有真实设备

    2022年8月2日
    5
  • 常用字典_古汉语常用字典

    常用字典_古汉语常用字典huangyu888!@#$zhoujiakui223223jtserver1981@223wztelecom2008easygetyzdx123echina0228xiaxue123-$$4rf7uj3ed8ik!!changeme$$ebochai517qifengjc09001.1qa2ws3edwzcgame12wanzhonggamewanzhonggame…

    2025年6月6日
    1
  • tensorflow各个版本的CUDA以及Cudnn版本对应关系

    tensorflow各个版本的CUDA以及Cudnn版本对应关系概述,需要注意以下几个问题:(1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的本质是一个工具包(ToolKit);但是二者虽然不一样的。显卡驱动的安装:当我们使用…

    2022年6月9日
    28
  • 基于云计算的大数据平台基础设施建设实践

    基于云计算的大数据平台基础设施建设实践大数据平台基础建设当前的趋势是云化与开放,这个平台需要可以提供各类大数据相关PaaS服务,也需要使各类服务间可以简单灵活的组合来满足多变及定制的需求。如何在云上提供弹性、敏捷,却不失稳定和高性能的大数据平台?如何高效的利用云计算的特点来开发大数据平台?本期青云QingCloud系统工程师周小四给大家带来基于云计算的大数据平台基础设施建设以及其架构特点的主题分享。以下是分享原文。——————大…

    2022年5月16日
    42
  • 【python二级-练习题】

    【python二级-练习题】2、随机密码验证题目描述:代码如下:3、信息分配表(字典)题目描述:代码如下:4、全模式分词(jieba)题目描述:代码如下:5、数字金字塔题目描述:6、求最大值、最小值及平均值题目描述:代码如下:7、交换变量题目描述:代码如下:或或8、输入密码-三次机会题目描述:代码如下:9、水仙花数题目描述:代码如下:或或或10、增加与去掉题目描述:代码如下:11、添加通讯录信息题目

    2022年10月12日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号