打印

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

[复制链接]
4931|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
javasdk|  楼主 | 2007-11-27 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
computer00| | 2007-11-28 00:56 | 只看该作者

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

而加上=号,实际上LDR不再是LDR指令,而成了伪指令,它会生成另外几条指令,通过将数据保存到程序中再加载。

使用特权

评论回复
板凳
javasdk|  楼主 | 2007-11-28 21:12 | 只看该作者

多谢楼上好友!

谢谢。
又在百度搜到一点资料,贴在这里共享:

ARM是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指令不是一个同东西。

使用特权

评论回复
地板
wishcom| | 2007-11-29 00:32 | 只看该作者

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

里面关于你这个问题基本上有标准答案。。。

不一样
LDR R0,=xxxx
这句中的xxxx可以是任意值

MOV R0,#xxxx
这句中的xxxx需要满足一定的条件,如果不满足则不对,至于什么条件——翻书去

建议:不清楚就使用LDR R0,=xxxx用法,就多用一点存储空间而已。

使用特权

评论回复
5
johnnyqyun| | 2007-11-29 10:36 | 只看该作者

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

MOV R0,#xxxx
这句中的xxxx需要满足一定的条件,如果不满足则不对,至于什么条件——翻书去

立即数方式 每个立即数由一个8位的常数循环右移偶数位得到。期中循环右移的位数由一个4位二进制的两倍表示。
这样并不是每一个32位的常数都是合法的立即数,只有能够通过上面构造方法得到的才是合法的立即数。

还有就是P163页 伪指令LDR的使用实例
谢下LZ提到这个问题,再谢下WISHCOM.
结构与编程有时候的确要经常翻一翻

使用特权

评论回复
6
javasdk|  楼主 | 2007-11-29 13:29 | 只看该作者

谢wishcom

"不清楚就使用LDR R0,=xxxx用法"

这是万全的办法,就像是51单片机里面跳转大家都用 LJMP 一样,放心, 不出错.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

28

帖子

0

粉丝