ARM汇编指令ldr和MOV的区别

1.“八位图”数据

 

2、MOV指令

MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。
 
MOV对于立即数是有要求的,就是上边的“8位图”数据。
只能由一个8bit连续有效位通过偶数次移位得到的数。
 
它为什么会有这样的限制呢?
原因是,MOV本身就是一个32bit指令,除了指令码本身,他不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示

立即数,其中4bit表示移位的尾数(循环右移,且数值*2),8bit用来表示要移位的一个基数。如果立即数超过这个范围,就没有办法用一条MOV指令给寄存器赋值

        要想判断一个数是否是合法的立即数,可以把这个数左移或右移偶数位,看能否变成一个8为的数。如果能,则是合法的立即数,可以用MOV指令操作。否则,不是合法立即数,不能用MOV指令来操作。

(这里就要用到LDR伪指令了,查看反汇编指令,你会看到LDR伪指令此变成了两条指令~~)。
3、LDR指令
ldr指令既可以是大范围的地址读取伪指令,也可以内存访问指令。
当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。
LDR指令:就是个单寄存器存储的ARM存储器访问指令。
(LDR补充了MOV指令不能访问内存的缺陷。)
 
 ARM是RISC结构的,数据从内存到CPU之间的移动只能通过ldr/str指令(我说的是但个寄存器~~)。
想要把数据从内存中某处读取到寄存器中,只能用ldr。
 
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只能在寄存器之间移动数据,或者把立即数移动到寄存器中。


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


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

 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值