找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4444|回复: 0
打印 上一主题 下一主题
收起左侧

ARM汇编语言中MOV MVN LDR区别

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-13 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
个人总结,如有错误,欢迎纠正,谢谢!!!

MOV指令可以完成从另一个寄存器,被移位的寄存器或将一个立即数加载到目的寄存器。
例如:
MOV  R1,     R0
MOV  R1,  R0,  LSL   #3
MOV  R1 ,    #3
但把立即数赋给一个寄存器,对立即数的范围有要求。只能是由8bit连续有效位通过偶
数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。
例如:
MOV   R0,    #0xFF
这条指令的意思是将0xFF这个立即数复制到R0寄存器中去,且MOV 指令只能将寄存器
中的数相互的复制。

MVN指令可以完成从另一个寄存器,被移位的寄存器或将一个立即数加载到目的寄存器。
与MOV指令不同之处传送之前按位取反了,即把一个被取反的值传送到目的寄存器中。
例如:
MVN  R0,  #0  //是将立即数0去反后传送给寄存器R0的。
这条指令的意思是将MOV指令不能操作的一些立即数进行操作!也是只能在寄存器中相互
复制。

ARM指令集中,LDR通常都是作为加载指令的,但是它也可以作伪指令。
LDR,STR作为加载指令, 用于寄存器和存储器之间的数据传输。一般用在寄存器间接寻址
或基址变址寻址。
例如:
LDR   R1,  [R0]    //寄存器间接寻址
LDR   R1,  [R0,#3]  //基址变址寻址

LDR 作为伪指令和ARM的LDR指令很像,但是作用不太一样。LDR伪指令可以在立即数前
加上=,以表示把一个地址写到某寄存器中。
LDR   R1,  =0xxxxx
当第二个操作数0xxxxx没有超过MOV或者MVN 第二个操作数的范围,就会将指令之间编
译成MOV    R1 ,    #0xxxxx或者MVN    R1 ,    #0xxxxx(取反后的值)

当第二个操作数0xxxxx超过MOV或者MVN 第二个操作数的范围,编译器将该常数放在数据
缓冲区中,同时用一条基于PC的LDR指令读取该常数。但是LDR伪指令处到数据缓冲区(
也叫做  文字池)的目标数据所在的地址偏移量一定要小于4KB,否则出错。这也是能不用
LDR伪指令就不用的原因。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表