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指向的地址)中。
上一篇:STM32之_keil编译内存大小解析
下一篇:关于STM32中NSS位的用法
推荐阅读
史海拾趣
在电子行业,技术创新是企业持续发展的关键。常州星海电子一直致力于技术的研发和创新。近年来,公司成功取得了一项名为“一种高反压二极管”的专利,通过采用先进的生产工艺和设计,实现了产品性能的优化和成本的降低。这一创新不仅提升了公司的市场竞争力,也为整个电子行业的发展注入了新的活力。
进入21世纪,冠西电子不断加大在研发方面的投入,成功突破了一系列技术难题,特别是在光耦合器和继电器领域取得了显著成果。这些技术突破不仅提升了冠西电子产品的竞争力,也为其赢得了更多国际大厂的信赖。同时,冠西电子积极拓展市场,其产品广泛应用于电源、互联网设备、电脑系统和相关系统、家电、工业、安防系统等领域,为全球客户提供优质的产品和服务。
冠西电子一直重视产品质量和客户服务,通过了国际标准化组织的ISO9001质量管理标准认证,以及各国的安规认证,如UL、TUV等。这些认证不仅证明了冠西电子产品的品质卓越,也为其赢得了更多国际客户的认可。此外,冠西电子还积极与国际知名企业开展合作,共同推动电子行业的发展。
冠西电子一直重视产品质量和客户服务,通过了国际标准化组织的ISO9001质量管理标准认证,以及各国的安规认证,如UL、TUV等。这些认证不仅证明了冠西电子产品的品质卓越,也为其赢得了更多国际客户的认可。此外,冠西电子还积极与国际知名企业开展合作,共同推动电子行业的发展。
为了提高DSSC的转换效率和长期稳定性,G24i积极寻求技术合作。公司与离子液体供应商BASF公司签署了合作协议,共同开发性能更优的离子液体和电解液配方。此外,G24i还与国内外多家科研机构建立了紧密的合作关系,共同推进DSSC技术的研发和创新。这些合作不仅为G24i带来了先进的技术支持,也促进了整个DSSC行业的快速发展。
随着全球环保意识的日益增强,ATO SOLUTION公司积极响应绿色环保号召,将环保理念融入企业发展和产品生产中。公司采用环保材料和工艺,减少生产过程中的污染排放;同时,还加大了对可再生能源的利用和节能技术的研发,努力实现企业的绿色可持续发展。这种环保实践不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。
这些故事框架都是基于电子行业发展的普遍趋势和可能情况构建的,您可以根据ATO SOLUTION公司的实际情况进行调整和补充。在撰写具体故事时,请确保内容的真实性和客观性,避免加入主观评价或猜测。
摘要:开关电源的突出缺点是能产生较强的电磁干扰(EMI)。EMI信号既具流输出有很宽的频率范围,又有一定的幅度,经传导和辐射后会污染电磁环境,对通信设备和电子产品造成干扰。如果处理不当,开关电源本身就会变成一个干扰源。电磁干扰对开关电源的 ...… 查看全部问答∨ |
|
环境VS2005+sqlce3.0+sql2000,语言C# 步骤 1.创建*.sdf数据库,如果存在,先删除再创建 2.PULL ->rda.Dispose(); 3.操作*.sdf 4.PUSH 循环以上步骤 当第二次执行PULL时,程序自动退出 有人说是跟sql2000用户权限设置有关,我 ...… 查看全部问答∨ |
virtualalloc和virtualcopy这两个函数是可以在开发流驱动的时候使用,之后应用程序只需要调用 GPIO_Read(..)和GPIO_Write(..)就可以完成对GPIO的操作了? … 查看全部问答∨ |
我使用1280*800的lcd.在linux系统下.使用mplayer播放器 mpu=720MHZ .全屏播放视频lcd.会闪 mpu=600MHZ .全屏播放视频lcd.就显示相对正常. 这个是什么情况?… 查看全部问答∨ |
|