在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
12
返回列表 发新帖
楼主: walliamaa

[求助] 请高手指导下面的LDR指令为何出错

[复制链接]
发表于 2015-6-15 21:32:47 | 显示全部楼层
回复 9# walliamaa


    使用ldr指令时要注意一个问题,在代码中不可有地址有关的变量,例如在链接地址和运行地址一样的时候,使用ldr伪指令,结果没问题,但是如果链接地址和运行地址不一样的时候,使用ldr运行的时候可能出现你那个问题。understand????????????
 楼主| 发表于 2015-6-17 15:25:13 | 显示全部楼层
发表于 2015-12-8 17:24:07 | 显示全部楼层


回复  ddxx


   ldr  r0, =#0x0001指令与mov r0, #0x0001在ARM运行成二进制是一样的,即ldr装载立即数 ...
walliamaa 发表于 2015-6-10 15:32




   用ldr和mov给R5赋值 编译出来的指令肯定是不一样的   ldr指令编译的机器指令是从当前PC加上一个偏移地址去取数,因此真正进入CPU的是这个偏移地址,而这个偏移地址则指向你当前运行的代码后面的文字池。如果你仔细读过ARM汇编或者自己编写过,每段子程序结束后都会有一条指令LTORG,这个指令就是告诉编译器在这一块预留一块空间,即文字池,这块空间用于存储像LDR这样的指令需要存储的数。
   这也就是为什么ldr给r5赋立即数可以赋32bit的数的原因,因为m0里大部分指令对应的机器指令是16bit的,16bit的指令中怎么可能放得下一个32bit的立即数呢?因为ldr指令对应的机器码中放的是一个偏移地址,这个地址我没记错的话应该是8bit。因此资源池的地址距离当前代码的地址最远不能超过2^8,所以这也是为什么当你写汇编时,如果写了一串很长很长的子程序,或者几段子程序之间没有加LTORG命令的话,编译时会报错。
   而MOV指令相对就比较简单了,他所需要赋值的立即数是直接存在于对应的指令码中,这也是为什么MOV指令给R5赋值最大只能赋8bit的数,道理上面已经说过,因为指令码只有16bit。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-12 15:10 , Processed in 0.021143 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表