ARM微处理器的指令集概述(四)——MOV和LDR的区别

原创 2012年03月21日 10:11:53

以下内容为转载:


一   先让我们看一段汇编代码

LDR R0,=0x56000010 #R0 is set to be register GPBCON and is used to select pin function for Port B 
                   #in,out special function and others 
MOV R1,#0x00004000 
STR R1,[R0] #pin GPB7 is set to be output port
以上三条汇编语句的功能是将数值0x00004000存储到以0x56000010为地址的存储单元中。

其反汇编代码如下

   0:   e59f0044        ldr     r0, [pc, #68]   ; 0x4c
   4:   e3a01901        mov     r1, #16384      ; 0x4000
   8:   e5801000        str     r1, [r0]

   ......

   4c:   56000010        undefined
可见LDR R0,=0x56000010        被转换成ldr指令来执行

二  再看

LDR R0,=0x56000000  
MOV R1,#0x00004000
STR R1,[R0]  
其反汇编代码如下

   0:   e3a00456        mov     r0, #1442840576 ; 0x56000000
   4:   e3a01901        mov     r1, #16384      ; 0x4000
   8:   e5801000        str     r1, [r0]

这里LDR R0,=0x56000000   被转换成mov     r0, #1442840576

也就是说LDR伪指令是根据后面的数据值来决定转换为ldr指令或MOV指令执行。

那么同样是给R0赋值,LDR R0,=0x56000010 能否用mov     r0, #0x56000010来代替呢,

三  由此可见MOV和LDR的区别

mov指令后面的立即数是有限制的,这个立即数必须一个8位的二进制数经过偶数次右移后得到才合法数据

LDR R0,=0x56000000   被转换成mov     r0, #0x56000000,其中立即数0x56000000是可以由0x56经过循环右移得到的,而0x56000010无法通过一个8位的二进制数经过偶数次右移后得到,所以无法转换成mov指令来实现。

四  再举例如下:

mov R0,#0x101
mov R0,#0xFF1
以上两条指令都不正确,因为立即数不合法。

这样的话用MOV指令是比较麻烦的,因为有些简单的数据比较容易看出来,有些数据即不容易看出来是否是合法数据。

五  使用ldr伪指令解决这个问题

为了解决这个问题,我们可以用LDR伪指令来实现,根据后面的立即数来决定转换为ldr指令或MOV指令执行,符合MOV指令的立即数合法性要求就转换为MOV指令,不符合的话就转换为LDR加载指令来实现。

在Uboot源码中看到这样一条指令 MOV r1,#0xFFFFFFFF

有点费解,查看反汇编代码如下

mvn r1,#0

原来如此。


版权声明:本文为博主原创文章,未经博主允许不得转载。

ARM基础系列——ARM指令集

ARM指令和指令系统: 指令是指示计算机某种操作的命令,指令的集合称为指令系统。指令系统的功能强弱很大程度上决定了这类计算机智能的高低,它集中地反应了微处理器的硬件功能和属性。 ARM指令...
  • destiny_my
  • destiny_my
  • 2016年04月20日 22:14
  • 1818

arm中LDR与MOV的区别

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

ARM中MOV与LDR的区别

http://blog.csdn.net/lihaoweiv/article/details/6033003  ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,...
  • chj90220
  • chj90220
  • 2015年03月25日 20:00
  • 512

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

1、MOV指令 MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。  立即数相当于高级语言中的常量(常数), 立即数就是数字嘛,表示数值的数字, 存储器...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月18日 11:36
  • 1610

ARM MOV和LDR 和 LDR伪指令区别

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

【转】ARM汇编 MOV PC,LR

终于明白这个LR寄存器了 看下面这个ARM汇编吧 BL  NEXT                                 ;跳转到子程序 .........    ...
  • xgx198831
  • xgx198831
  • 2014年02月15日 18:00
  • 5626

ARM平台下bl和ldr指令的区别

学linux驱动,断断续续已经有个把月了,但一直停留在跟着视频模仿的阶段,不知其所然更不知其所以然。就决定,按照玩单片的方式,先去玩玩裸机的程序开发,把自己做的电路板小模块测试下(本来想在linux系...
  • wafx1314
  • wafx1314
  • 2013年11月24日 15:48
  • 1462

ARM中的MOV与LDR小结

RM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x123456...
  • u010911350
  • u010911350
  • 2015年01月05日 15:25
  • 288

ARM汇编指令集

ARM汇编指令集的介绍,包括指令和伪指令。指令和伪指令概念指令指令指的是CPU机器指令的助记符,是由CPU的指令集提供的,经过编译之后,会以二进制机器码的形式由CPU读取执行伪指令伪指令本质上不是指令...
  • u012741741
  • u012741741
  • 2016年06月26日 10:13
  • 1141

在ARM汇编中如何区分LDR是指令还是伪指令

由于ARM汇编中,LDR指令和LDR伪指令的指令zhu
  • ASMARM
  • ASMARM
  • 2014年05月29日 07:51
  • 1360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM微处理器的指令集概述(四)——MOV和LDR的区别
举报原因:
原因补充:

(最多只允许输入30个字)