个人总结,如有错误,欢迎纠正,谢谢!!!
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伪指令就不用的原因。
|