LDR R0,=0x00001234 和 MOV R0,#0x00001234是不是一样作用?

[复制链接]
5658|5
 楼主| javasdk 发表于 2007-11-27 22:06 | 显示全部楼层 |阅读模式
在ARM7/9中,<br />LDR&nbsp;R0,=0x00001234&nbsp;和&nbsp;MOV&nbsp;R0,#0x00001234是不是一样作用?<br />谢谢
computer00 发表于 2007-11-28 00:56 | 显示全部楼层

ARM指令只支持8位位图立即数,这个不要=就编译通不过了

而加上=号,实际上LDR不再是LDR指令,而成了伪指令,它会生成另外几条指令,通过将数据保存到程序中再加载。
 楼主| javasdk 发表于 2007-11-28 21:12 | 显示全部楼层

多谢楼上好友!

谢谢。<br />又在百度搜到一点资料,贴在这里共享:<br /><br />ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。<br />比如想把数据从内存中某处读取到寄存器中,只能使用ldr<br />比如:<br />ldr&nbsp;r0,&nbsp;0x12345678<br />就是把0x12345678这个地址中的值存放到r0中。<br />而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。<br />x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。<br /><br />另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:<br />ldr&nbsp;r0,&nbsp;=0x12345678<br />这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为&nbsp;mov指令的。<br /><br />ldr伪指令和ldr指令不是一个同东西。
wishcom 发表于 2007-11-29 00:32 | 显示全部楼层

建议LZ看看《ARM体系结构与编程》

里面关于你这个问题基本上有标准答案。。。<br /><br />不一样<br />LDR&nbsp;R0,=xxxx<br />这句中的xxxx可以是任意值<br /><br />MOV&nbsp;R0,#xxxx<br />这句中的xxxx需要满足一定的条件,如果不满足则不对,至于什么条件——翻书去<br /><br />建议:不清楚就使用LDR&nbsp;R0,=xxxx用法,就多用一点存储空间而已。
johnnyqyun 发表于 2007-11-29 10:36 | 显示全部楼层

结构与编程有时候的确要经常翻一翻

MOV&nbsp;R0,#xxxx<br />这句中的xxxx需要满足一定的条件,如果不满足则不对,至于什么条件——翻书去<br /><br />立即数方式&nbsp;每个立即数由一个8位的常数循环右移偶数位得到。期中循环右移的位数由一个4位二进制的两倍表示。<br />这样并不是每一个32位的常数都是合法的立即数,只有能够通过上面构造方法得到的才是合法的立即数。<br /><br />还有就是P163页&nbsp;伪指令LDR的使用实例<br />谢下LZ提到这个问题,再谢下WISHCOM.<br />结构与编程有时候的确要经常翻一翻
 楼主| javasdk 发表于 2007-11-29 13:29 | 显示全部楼层

谢wishcom

&quot;不清楚就使用LDR&nbsp;R0,=xxxx用法&quot;<br /><br />这是万全的办法,就像是51单片机里面跳转大家都用&nbsp;LJMP&nbsp;一样,放心,&nbsp;不出错.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部