×
单片机 > 单片机程序设计 > 详情

ARM汇编语言中MOV MVN LDR区别

发布时间:2020-06-02 发布时间:
|

个人总结,如有错误,欢迎纠正,谢谢!!!


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伪指令就不用的原因。


关键字:ARM  汇编语言  MOV  MVN  LDR 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析