ARM汇编:加载和存储指令集(六大类)

2019-09-23来源: eefocus关键字:ARM  汇编  加载  存储  指令集

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  汇编  加载  存储  指令集 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic475368.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ARM汇编文件的组成和汇编指令类型
下一篇:ARM汇编:汇编中IA、IB、DA、DB和FD、ED、FA、EA什么意思?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM联手通用、丰田开发自动驾驶通用计算系统
据国外媒体报道,日本软银集团旗下的英国芯片技术公司ARM,正与汽车制造商通用汽车和丰田汽车合作,开发面向自动驾驶汽车的通用计算系统。这三家公司希望通过加强合作来推动这项技术的发展。                                                ARM是移动芯片基础技术公司,该公司自己并不制造芯片。该公司与汽车工业的关系可以追溯到20世纪90年代末,当时
发表于 2019-10-09
ARM联手通用、丰田开发自动驾驶通用计算系统
7纳米好夯!台积电Arm共创了业界第一款小芯片系统
台积电26日在美国圣塔克拉拉举办开放创新平台论坛,与高效能运算IP厂Arm共同发表业界首款采用台积电先进CoWoS封装解决方案并获得硅晶验证的7纳米小芯片(Chiplet)系统,其中内建Arm多核心处理器。台积电指出,此款概念性验证的小芯片系统成功展现出结合了7纳米FinFET制程及4GHz Arm核心所打造出的高效能运算的系统单芯片(SoC)关键技术,已于2018年12月完成产品设计定案,并已于今年4月成功生产。Arm资深副总裁暨基础设施事业部总经理Drew Henry表示,这次与我们长期伙伴台积电协作的最新概念性验证成果,结合了台积电创新的先进封装技术与Arm架构卓越的灵活性及扩充性,为将来生产就绪的基础架构SoC解决方案奠定
发表于 2019-09-27
7纳米好夯!台积电Arm共创了业界第一款小芯片系统
高云半导体参加Arm 中国Tech Symposia大会
全球发展速度最快、最具创新性的FPGA设计公司-广东高云半导体科技股份有限公司(以下简称“高云半导体”)将于10月参加2019年度 Arm 中国Tech Symposia 活动,此次活动分别在北京(10.23日,北京金隅喜来登大酒店)和上海(10.25日,上海丽思卡尔顿酒店)举办。高云半导体将于会上展示其最新发布的“GoAI”人工智能边缘加速解决方案,此方案基于高云半导体小蜜蜂家族低密度SoC-FPGA产品GW1NS-4,使用ARM Cortex-M1软核结合FPGA逻辑进行边缘测的物体检测,效率比当前主流的MCU方案提升87倍。“作为唯一一家参与ARM design Start计划的国产FPGA企业,我们很高兴能够参与此次活动
发表于 2019-09-26
Arm、Arm中国与华为海思最新“声明”:不会断供华为海思!
Arm是一家成立于1990年的英国芯片架构公司,2016年被孙正义的软银收购,但总部依然在英国剑桥。有报道说,Arm本身并不制造计算机芯片,其主要的业务是对外授权其半导体技术,把技术和工具打包售卖,买到的企业可以使用Arm技术进行设计。而这个技术,也就是芯片界鼎鼎大名的Arm架构。据公开数据表明,中国区合作伙伴搭载了Arm IP的芯片出货量在过去10年内增长了超过170倍。中国市场不仅非常庞大,也有其独特性并与世界其他地区有极大差别。为了让Arm技术惠及更多中国本土企业,Arm公司迫切需要一个中国的合作伙伴来开发可在中国市场获得本地许可的Arm兼容技术。同时,中国企业也更倾向于购买由中国公司全面开发的技术,因此通过Arm
发表于 2019-09-26
Arm、Arm中国与华为海思最新“声明”:不会断供华为海思!
电装与黑莓共同开发综合驾驶舱系统”Harmony CoreTM”
电装和黑莓公司宣布,共同开发出可以把多个人机界面(HMI*1)系统产品连接,以提升驾驶员便利性能的综合驾驶舱系统”Harmony CoreTM”。该产品将搭载在今秋于美国发售的斯巴鲁新型力狮和傲虎车型上。 此次开发的“Harmony CoreTM”产品是黑莓公司「QNX Hypervisor」*2操作系统初次搭载在汽车上,并应用到综合驾驶舱系统中。 斯巴鲁新型力狮/傲虎(美国版)(图片提供:株式会社SUBARU) 近年来,利用摄像头以及传感器的高度驾驶辅助功能,以及和智能手机进行连接的车载娱乐等功能的出现,使得汽车可以传递给驾驶员的信息量大幅增加。因此,车内就需要搭载仪表盘及导航等多个HM
发表于 2019-09-24
电装与黑莓共同开发综合驾驶舱系统”Harmony CoreTM”
华为Harmony Studio的软件应用商标现身
今年7月,华为鸿蒙Harmony操作系统的商标申请现身互联网。数月后,刚刚结束的海外发布会上也公布了两种在新操作系统上运行的产品,Honor Vision TV和更先进的Huawei Vision TV是首批运行在鸿蒙之上的设备,在美国的实体清单政策重压下,华为也正在全力开发其新操作系统。在阿根廷,华为技术公司已在INPI(国家工业研究院)注册了Harmony Studio的名称。该商标已于2019年9月18日在南美提交,它被归类为9/42类别。与此同时,该商标也已包含在EUIPO(欧盟知识产权局)数据库中。商标用途当中包括了广泛的描述,其中第9类列出了可以使用Harmony OS的多样化的产品,包括智能手机,平板电脑,可穿戴设备
发表于 2019-09-24
华为Harmony Studio的软件应用商标现身
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved