LDR 和MOV 指令区别

摘要:
数据从内存到CPU的移动只能通过L/S指令完成,因为x86 mov指令可以将数据从内存移动到寄存器。然而,mov指令将立即数的长度限制为8位,并将存储器地址指示的地址处的4个连续字节(1个字)的数据传输到目标寄存器。将具有存储器地址R1+R2的字数据读入寄存器R0。将具有存储器地址R1+8的字数据读入寄存器R0。将具有存储器地址R1+R2的字数据读入寄存器R0。
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678
就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

ldr伪指令和ldr指令不是一个同东西
----------------------------------------------------------------------------------------------------------

LDR指令的格式: 

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

作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。

LDR指令的寻址方式比较灵活,实例如下:

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

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

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

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

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

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

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

LDR R0,[R1,R2,LSL #2]                         ;将存储器地址为R1+R2*4的字数据读入寄存器R0。

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 R0,Label                                                ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。

要注意的是

LDR Rd,[Rn],#0x04                                                              ;这里Rd不允许是R15。

另外LDRB 的指令格式与LDR相似,只不过它是将存储器地址中的8位(1个字节)读到目的寄存器中。

LDRH的指令格式也与LDR相似,它是将内存中的16位(半字)读到目的寄存器中。

LDR R0,=0xff

这里的LDR不是arm指令,而是伪指令。这个时候与MOVE很相似,只不过MOV指令后的立即数是有限制的。这个立即数必须是0X00-OXFF范围内的数经过偶数次右移得到的数,所以MOV用起来比较麻烦,因为有些数不那么容易看出来是否合法。

 

免责声明:文章转载自《LDR 和MOV 指令区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇去耦电容和旁路电容的区别基于docker/dockerfile实现redis主从复制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿里云的推流、拉流与播流

原文: https://help.aliyun.com/document_detail/199340.html?spm=5176.13499635.help.dexternal.119f2699sMrZOJ 视频直播的基础服务是直播流的接入和分发服务。您可以使用推流地址通过推流工具将视频流推送至阿里云平台进行视频的内容处理及分发,观众可以通过播放地址和播放...

Unity中对注册表进行修改

问题背景: PC端软件开发,当我在Unity中的PlayerSetting中设置好分辨率,每次打包运行后会记忆上次退出时窗口的分辨率(记忆窗口状态),导致下次打开时不是PlayerSetting中的初始设置,而是读取注册表记录的数据。而我的需求时必须每次进去时都是指定的那个分辨率。 问题纠结点: 1.注册表信息是否可删,怎么获取到删除 2.也不能直接删除整...

汇编语言-标志寄存器

汇编语言-标志寄存器 CPU内部的寄存器中,有一个特殊的寄存器,叫标志寄存器,它具有以下三种作用: 用来存储相关指令的某些执行结果 用来为CPU执行相关指令行为提供行为依据 用来控制CPU的相关工作方式 flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。 而flag寄存器是按位起作用的,也就是说,它的每一位都有专门...

MongoDB(课时5 数据查询)

3.4.2 数据查询 对于数据的查询操作核心语法: db.集合名称.find({查询条件}, {设置显示的字段})    范例:没查询条件 db.info.find() 范例:有查询条件,查询出url为"www.mldn.cn"的数据 db.info.find({"url" : "www.mldn.cn"}) 进行数据查询的时候是按照JSON的形式设置...

Apache Solr 全版本任意读取文件漏洞

一、漏洞背景 Apache Solr 全版本存在任意文件读取漏洞,攻击者可以在未授权的情况下获取目标系统的敏感文件,为什么说是全版本呢因为由于目前官方不予修复该漏洞,所以无安全版本。 二、网络空间搜索: fofa语法如下 app="Apache-Solr" app="Solr" app="Solr" || app="Apache-Solr" 三、漏洞验证...

转:ImageMagick +Jmagick安装

原文来自于:  目录 一、ImageMagick介绍 二、安装支持库 三、在Linux上用源码编译安装ImageMagick与Jmagick 四、在Linux上使用yum安装ImageMagick与Jmagick 五、在windows上安装ImageMagick与Jmagick 六、常见问题以及解决方法 作者:赵磊 博客:http://elf8848.i...