哪些公司经常做网站,建站代理,做网站时如何上传图片,美业营销策划公司Mov 是把立即数赋给一个寄存器#xff0c;但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围#xff0c;就没办法用一条MOV指令给寄存器赋值。LDR除了普通的读数之外#xff0c;也有给寄存器赋立即数的功能。你只要写 LDR R… Mov 是把立即数赋给一个寄存器但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围就没办法用一条MOV指令给寄存器赋值。LDR除了普通的读数之外也有给寄存器赋立即数的功能。你只要写 LDR R00xabcdef它没有立即数范围的限制。因为这是一条伪指令。如果立即数在MOV的要求内那就用一条汇编来实现。如果不在Mov的范围内就用其它方式实现如变成两条指令或从PC偏移地址读一个32位数给寄存器。MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器从本质上是寄存器到寄存器的传递为什么会有立即数其实也是有限制的立即数不是所有立即数都可以传递的这个立即数要符合一个8位数循环右移偶数位的取值原因是MOV本身就是一条32bit指令除了指令码本身它不可能再带一个可以表示32bit的数字所以用了其中的12bit来表示立即数其中4bit表示移位的位数(循环右移且数值x2)8bit用来表示要移位的一个基数。还有一点是关于ldr的其实ldr可以装载一个32bit立即数的说法并不确切因为实际上并不是这一条语句装载了一个32bit立即数比如ldr r1 0x12345678其实真正的汇编代码是将某个地址的值传递给r1就是说需要一个地址存放0x12345678这个立即数实际上可以看作是一条伪指令而且如果这个立即数可以用mov指令的形式来表达会被编译器实际用mov来代替比如ldr r1,0x10会变成mov r1,#0x10ARM是RISC结构数据从内存到CPU之间的移动只能通过L/S指令来完成也就是ldr/str指令。想把数据从内存中某处读取到寄存器中只能使用ldr。比如ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活mov只能在寄存器之间移动数据或者把立即数移动到寄存器中这个和x86这种CISC架构的芯片区别最大的地方。 x86中没有ldr这种指令因为x86的mov指令可以将数据从内存中移动到寄存器中。另外还有一个就是ldr伪指令虽然ldr伪指令和ARM的ldr指令很像但是作用不太一样。ldr伪指令可以在立即数前加上以表示把一个地址写到某寄存器中比如ldr r0, 0x12345678这样就把0x12345678这个地址写到r0中了。所以ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时后面跟的立即数没有超过8位那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。ldr伪指令和ldr指令不是一个同东西。 转载于:https://blog.51cto.com/elvinsys/1618028