历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | ARM学习_六大类指令集

发布者:人妙果华 来源: eefocus关键字:ARM学习  指令集 手机看文章 扫描二维码
随时随地手机看文章

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。

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为地址的存储器中。

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学习  指令集 引用地址:ARM学习_六大类指令集

上一篇:STM32之_keil编译内存大小解析
下一篇:关于STM32中NSS位的用法

推荐阅读

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信...
中国储能网讯:近日,国网招标平台发布了《国家电网有限公司2019年(新增)信息化设备招标采购》公告,本次招标共包含85个包,19219件产品,579个项目。本次招标属于新增批次,属于计划外的追加,本身就超市场预期,且数量上呈现井喷状态,更重要的是大多数项目与2019年泛在电力物联网建设方案相吻合,标志着泛在电力物联网正式落地启动。 业内人士表示,...
谈到医疗机器人,许多人都会起到美国Intuitive surgical公司研发的达芬奇机器人,它是世界第一款手术机器人,代表着机器人在医疗行业应用的重要里程碑。不过,达芬奇仍然是由人类控制的机器系统。随着人工智能技术的进步发展,医疗行业又发生了巨大的变化。利用机器学习的方法,可以对不同病例进行学习,再结合所有医学知识库的知识,能够快速诊断出病情...

史海拾趣

问答坊 | AI 解惑

P89LPC932 Flash 单片机使用指南

P89LPC932 Flash 单片机使用指南…

查看全部问答∨

开关电源中电磁干扰的产生及其抑制

摘要:开关电源的突出缺点是能产生较强的电磁干扰(EMI)。EMI信号既具流输出有很宽的频率范围,又有一定的幅度,经传导和辐射后会污染电磁环境,对通信设备和电子产品造成干扰。如果处理不当,开关电源本身就会变成一个干扰源。电磁干扰对开关电源的 ...…

查看全部问答∨

RDA第一次PULL成功第二次PULL程序自动退出

环境VS2005+sqlce3.0+sql2000,语言C# 步骤 1.创建*.sdf数据库,如果存在,先删除再创建 2.PULL  ->rda.Dispose(); 3.操作*.sdf 4.PUSH 循环以上步骤 当第二次执行PULL时,程序自动退出 有人说是跟sql2000用户权限设置有关,我 ...…

查看全部问答∨

请教GPIO流驱动的问题

virtualalloc和virtualcopy这两个函数是可以在开发流驱动的时候使用,之后应用程序只需要调用 GPIO_Read(..)和GPIO_Write(..)就可以完成对GPIO的操作了? …

查看全部问答∨

关于TCPMP

我到下载了tcpmp.src.0.72RC1源码,用EVC编译,为什么amr、asap、flac、player_ce3、Sample_ce3、setup_ce3编译通过不过?源码是在官网下的 …

查看全部问答∨

nios 经典问题

我的NIOS II 的板子以前能正常运行,可是不知道怎么的突然运行不起了,老是出现下面的错误:There are no Nios II processors available which match the values specified. Please check that your PLD is correctly configured, downloading a n ...…

查看全部问答∨

【低功耗】FPGA在便携式产品中应用的低功耗实现方法

FPGA在便携式产品中应用的低功耗实现方法…

查看全部问答∨

am3359 mpu频率问题

我使用1280*800的lcd.在linux系统下.使用mplayer播放器 mpu=720MHZ .全屏播放视频lcd.会闪 mpu=600MHZ .全屏播放视频lcd.就显示相对正常. 这个是什么情况?…

查看全部问答∨

简单的应急灯电路

转发一个简单应急灯电路和介绍 这里介绍一款简单的应急灯电路,它采用普通蓄电池的12V电源供电,经过逆变电路后,变成220V高频正弦交流电,从而可驱动普通的日光灯管,电路如图1所示。     电路由R1-R4、C1、C2、Q1、Q2组成最常用的“ ...…

查看全部问答∨

有对FLEXRAY协议熟悉的童鞋没?

希望大家能就这个协议做一些有益的探讨.…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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