ARM 汇编笔记

1、LDR r0, label  和 LDR r0, =label的区别

LDR 是ARM中的指令,也是伪指令。
当用 LDR r0, =num
编译时,编译器会根据num是否能表示为立即数,决定用 ldr 指令或者是mov或mvn指令。
当num能表示为立即数,就将它翻译成一条mov或mvn指令。不能,编译器会将num存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到r0中。
LDR r0, label  和 LDR r0, =label的区别:
LDR r0, =label 会把label表示的值加载到r0中,相当于直接赋值。
LDR r0, label  会把label当做地址,把label指向的地址中的值加载到r0中,相当于指针操作.
譬如 label的值是 0x8000, LDR r0, =label会将 0x8000加载到r0中,而LDR r0, label则会将内存0x8000处的值加载到r0中。
————————————————
版权声明:本文为CSDN博主「铍镁钙锶钡镭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1113231395/article/details/83650069

2、ldr和bl的区别

ldr和bl在启动程序中,都是可以负责pc跳转的指令。

1)bl是地址无关指令,和当前的运行地址无关,链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候实际的地址和运行地址不相符,如果想让程序正常的运行,就必须使用地址无关指令。比如在完成将程序复制到内存之前想要跳转到一个函数里,就必须使用bl,因为bl跳转依靠的是相对地址,和运行地址无关,所以能完成跳转。

2)ldr是地址有关指令,如果这个时候使用“ldr  pc,=函数名”来跳转,实际上是跳转到这个函数在链接器脚本中标明的地址上了。所以使用地址相关指令之前,要把代码复制到链接器脚本中指明的那个地址上,否则程序就跑飞了。复制完成之后再使用ldr跳转到内存中,使程序继续运行。
————————————————
版权声明:本文为CSDN博主「猪皮哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013368345/article/details/91882554

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值