历史上的今天
返回首页

历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2019年09月23日 | ARM汇编:加载和存储指令集(六大类)

2019-09-23 来源:eefocus

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指向的地址)中。


推荐阅读

史海拾趣

ENPIRION公司的发展小趣事

随着ENPIRION公司产品的不断推出和市场的逐步扩大,公司开始寻求与各大电子制造商的合作。通过与小米、OPPO、vivo等知名品牌建立合作关系,ENPIRION公司的电源管理解决方案得到了更广泛的应用,进一步提升了其市场影响力和竞争力。这些合作伙伴关系的建立不仅为ENPIRION公司带来了更多的商业机会,也为其技术创新和产品升级提供了更广阔的平台。

ELEMENT14公司的发展小趣事

ELEMENT14始终将提升服务质量和客户满意度作为首要任务。公司建立了完善的客户服务体系,提供快速响应、专业解答的客户服务。同时,ELEMENT14还定期开展客户满意度调查,针对客户的反馈和建议进行改进。这些努力不仅提升了客户满意度,也增强了公司的品牌形象和市场竞争力。

Carling Technologies公司的发展小趣事

Carling Technologies于1920年创立,早期专注于电气和电子开关以及组件的制造。凭借创始人的远见卓识和团队的努力,公司逐渐在行业中崭露头角。在创立初期,Carling Technologies就以其高质量的产品和创新的设计赢得了客户的信赖。通过不断的研发和技术升级,公司逐渐在电气和电子开关领域建立了自己的地位。

Amulet Technologies公司的发展小趣事

为了确保产品质量和满足国际标准,Carling Technologies先后获得了多项ISO和TS认证。这些认证不仅证明了公司在质量管理方面的实力,也为其产品在全球市场上的竞争提供了有力支持。同时,公司还建立了标准化的生产流程和质量检测体系,确保每一款产品都能达到客户的期望和要求。

ELM [ELM Electronics]公司的发展小趣事

ELM始终将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,ELM还注重客户需求和反馈,不断优化产品和服务,以满足客户的个性化需求。这些举措使得ELM的产品在市场上享有很高的声誉和口碑,客户满意度持续提升。

G-Mag Usa公司的发展小趣事

在20世纪90年代初,G-Mag Usa公司由一群电子工程师创立,专注于研发高性能的半导体芯片。当时,市场上对于小型化、低功耗的芯片需求日益增长。G-Mag通过不断的技术创新,成功研发出了一种新型低功耗处理器,该处理器在保持高性能的同时,能耗降低了30%。这一技术突破迅速吸引了众多智能手机制造商的注意,G-Mag因此迅速崛起,成为半导体行业的佼佼者。随着智能手机市场的爆发式增长,G-Mag的芯片出货量也随之飙升,公司规模迅速扩大。

问答坊 | AI 解惑

浅谈手机发射功率(上)

笔者从事手机测试校准系统集成有段时间,感觉到手机发射功率在不同的系统、不同的协议下有很多的不同。笔者对此深感有意思,故把PHS、GSM、cdma2000 1x、wcdma下对手机发射功率的规定罗列于此,希望能给同行起到抛砖引玉的作用,斧正我的错误。 一 ...…

查看全部问答>

做H题的进来

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 选H题的人不知道多不多哦 我觉得这个难就难在做板了 大家讨论一下  …

查看全部问答>

新出的altium 有没有人在用

新买的书 说是比99se好 不知道有没有人用这个啊? 我用的99se是汉化的       一下子用英文的 木啦…

查看全部问答>

西门子经典天线教程

西门子经典天线教程…

查看全部问答>

周工尝试开办的夏令营活动

本帖最后由 paulhyde 于 2014-9-15 09:31 编辑 我们将准备在今年暑假针对大三电类专业学生开办夏令营,目标大学:80-100所,营员:100-150人!大约于4月初开始启动,目前我们正在制作海报。 一、2010年夏令营 1、 初选 对象:电类 ...…

查看全部问答>

关于sources.cmn文件的问题和两个汇编指令。

bsp包下的sources.cmn文件是怎样产生的。他的生成是要手动编写吗?它和catalog中的bsp.pbcxml文件是什么关系?我修改了bsp.pbcxml,用set命令查看环境变量是可以看到的。但是sources.cmn文件中没有那个环境变量,所以我在编译的时候仍然不能有效修 ...…

查看全部问答>

ProgrammingWinCE3rd,字体为何显示比系统用的字体要大的多?!

《Programming Microsoft Windows CE .NET, Third Edition》by Douglas Boling   在看第二章Drawing on the screen遇到一个问题,示例程序FontList是用来枚举字体之后显示出来。 但是我的问题是它枚举的字体为什么显示的那么大?而且在 ...…

查看全部问答>

固件库的问题,请大侠帮帮忙,

我用的是STM32F101VCT6,后来使用了STM32F103VCT6,每进入中断的时候,就出现了硬件故障,出现下面数据: The stack pointer for stack \'CSTACK\' (currently 0x1FFFFBC0) is outside the stack range (0x20000000 to 0x20000400) 请问那个 ...…

查看全部问答>

请问大家,这个是什么传感器

 如图 VALVE SENSOR   这个是不是汽车排气阀门传感器???谢谢 [ 本帖最后由 moonling 于 2011-10-27 15:13 编辑 ]…

查看全部问答>

深入了解FRAM和TI新MSP430FR57xx MCU(二)

简介: FRAM(铁电随机存取存储器)是下一代非易失性存储器技术的先驱技术,嵌入在选定的 MSP430 微处理器中。嵌入式FRAM 能够实现更快的速度、更低的功耗以及更小的封装尺寸。本视频带您走进FRAM以及MSP430FR57xx——业内首款采用嵌入式 FRAM 的 ...…

查看全部问答>