KG—MOV指令、LDR指令、LDR伪指令之间的区别

MOV指令、LDR指令、LDR伪指令之间的区别

作为一个扩展(KG),感觉这个东西还是有必要说说的~~

在我编译一个工程的时候,用MOV指令编译有的时候出错,但是有的时候就又对了,还有LDR,怎么有的时候加个“=”有的时候有不加了,晕头晕闹的~~

查过相关资料后,发现还是有很多要知道的~~

1、“8位图”数据

这个是必须的必要知道的~~

看一张图片就明白了(右移~~):


2、MOV指令

MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。

对于立即数是有要求的,就是上边的“8位图”数据。只能由一个8bit连续有效位通过偶数次移位得到的数。

它为什么会有这样的限制呢?

原因是,MOV本身就是一个32bit指令,除了指令码本身,他不可能再带一个可以表示32bit的数字,所以用了

其中的12bit来表示立即数,其中4bit表示移位的尾数(循环右移,且数值*2),8bit

用来表示要移位的一个基数。

如果立即数超过这个范围,就没有办法用一条MOV指令给寄存器赋值(这里就要用到LDR伪指令了,查看反汇编指令,你会看到LDR伪指令此变成了两条指令~~)。

3、LDR指令

首先呢:

ldr指令既可以是大范围的地址读取伪指令,也可以内存访问指令。当它的第二个参数前面有“=”时,

表示伪指令,否则表示内存访问指令。

LDR指令就是个单寄存器存储的ARM存储器访问指令。

补充了MOV指令不能访问内存的缺陷。

ARM是RISC结构的,数据从内存到CPU之间的移动只能通过ldr/str指令(我说的是但个寄存器~~)。

想要把数据从内存中某处读取到寄存器中,只能用ldr。

在X86这种CISC构架的就没有ldr,因为X86一个mov就搞定了,可以说这就是连个芯片之间最大的区别了~~

4、LDR伪指令

1)

LDR伪指令没有立即数范围的限制,既,可以直接赋值。因为这是一条伪指令。

如果立即数在MOV的要求内,系统会自动用一条汇编MOV指令来实现。如果不在MOV的范围内,就用其它的方式来实现,比如变成了两条指令,或者从PC偏移地址读取一个32位的数据给寄存器。

2)

关于LDR伪指令,可以装载一个32bit立即数的说法并不正确,因为在实际中并不是这一条语句装载了32bit立即数(跟上面的貌似一样,呵呵~~),比如:

ldr r1,=0x70000000

其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x70000000这个立即数,在反汇编中,

如果仔细看会返现,如果这个立即数可以用mov指令的表达形式来表达,编译器就直接用mov了~~

ARM汇编中ldr伪指令和ldr指令

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指令可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数。而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比如:

ldr r1,=0x10

会变成

mov r1,#0x10 

综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。        ldr伪指令和ldr指令不是一个同东西。

ARM LDR与MOV的区别相关推荐

  1. LDR 和MOV 指令区别

    LDR 和MOV 指令区别 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ld ...

  2. ARM立即数讲解--LDR和MOV的区别 .

    Mov 是把立即数赋给一个寄存器,但对立即数的范围有要求.只能是由8bit连续有效位通过偶数次移位能得到的数.如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值. LDR除了普通的读数之外, ...

  3. 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)

    首先说明一下 ARM是RISC("reduced instruction set computer",即"精简指令集计算机")结构 x86是CISC(" ...

  4. ARM LDR和ADR指令

    讲的比较好的一篇帖子,ADR和LDR区别的比较清除: LDR和ADR的区别 Load/Store指令 ARM属于RISC指令集,CPU无法对内存的数据进行直接操作,只能通过Load/Store指令来实 ...

  5. ARM中的MOV指令

    ARM中的MOV指令格式是这样的 op2是占了12位,其中bit11-bit8是移位数(rotate),bit7-0是一个8位的立即数(imm),MOV Rn, op2,执行之后,Rn=op2 > ...

  6. ARM汇编之MOV PC,LR

    ARM汇编之MOV PC,LR BL NEXT :跳转到子程序......... :NEXT处执行NEXT..........MOV PC,LR :从子程序返回 这里的BL是跳转的意思,LR(R14) ...

  7. arm鲲鹏服务器和x86区别

    华为云服务器x86计算和鲲鹏计算的区别是什么?X86和鲲鹏指的是两个系列的中央处理器架构.x86采用复杂指令集(CISC),鲲鹏采用精简指令集(RISC).pc6a学习分享小白详细说明一下这2种服务器 ...

  8. ARM基础教程 | ARM与RISC-V架构的区别

    关注+星标公众号,不错过精彩内容 编排 | strongerHuang 微信公众号 | 嵌入式专栏 从2019年开始,RISC-V得到了越来越多的重视,原因有很多,ARM授权费高是关键的因素,下面就来 ...

  9. ARM基础教程3 | ARM与RISC-V架构的区别(架构)

    从2019年开始,RISC-V得到了越来越多的重视,原因有很多,ARM授权费高是关键的因素,下面就来说说关于ARM和RISC-V架构,以及相关的内容. 关于ARM 1991 年ARM 公司成立于英国剑 ...

最新文章

  1. Android Intent的 Component 使用
  2. 方案里最常用的集群拓扑图(包含:多机集群、负载均衡、双机)
  3. 基于TransformerFusion的单目场景重构
  4. lotus php,LotusPhp框架目录_PHP教程
  5. [Linux]lnmp一键安装包,访问yii/tp5/laravel的时候,报错500或者空白页面
  6. python中的缩进问题_Python中的缩进问题
  7. Java虚拟机:class类文件结构
  8. OpenGL 实例化 Instancing
  9. oracle 10g 安装介质,如何从Oracle 10g的安装介质中提取BBED必须的sbbdpt.o和ssbbded.o库文件...
  10. 层次聚类算法 算法_聚类算法简介
  11. Windows Server Failover Cluster 使用的协议和端口
  12. 走在梦的路上 绝不回头
  13. [转]触碰心灵34句
  14. 凤凰机器人猜成语答案_看图猜成语:一只手上拿着绳子,旁边有个起吊机
  15. 如何通过OCJP认证考试
  16. ARM一面(二轮技术面)
  17. 功率因数 matlab,基于Matlab的功率因数校正电路的仿真分析
  18. android 动画无缝滚动,CSS3动画之无缝滚动
  19. python3判断字典中的key是否存在_python3判断key存在字典中的方法是什么
  20. AJAX如何将参数带到并传给另一个页面?

热门文章

  1. 关于在hue当中执行定时任务,时间的设置。
  2. 题解 UVA10587 【Mayor's posters】
  3. tslib编译使用方法
  4. 【bzoj5037】[Jsoi2014]电信网络 最大权闭合图
  5. Overview of the New C++:C++0x
  6. 一周学C#第五天——命名空间
  7. 3.14圆周率节,这5本书带你领略数学的魅力
  8. 小白入门机器学习必备:编程语言环境介绍及搭建
  9. 成为大数据顶尖程序员,先过了这些Hadoop面试题!(附答案解析)
  10. 开关电源之防浪涌、防雷电路