码迷,mamicode.com
首页 > 其他好文 > 详细

关于重定位代码的浅显理解

时间:2015-11-14 23:36:38      阅读:454      评论:0      收藏:0      [点我收藏+]

标签:嵌入式   重定位

首先需要朱有鹏老师,这是在学习了朱老师的课程之后的一点理解,代码是根据朱老师的源码学习之后编写的。

技术分享

根据反汇编代码  d0024010:     e24f0018       sub      r0, pc, #24 可以看出通过adr汇编伪指令将加载地址写入r0寄存器,此时因为adr指令采用相对寻址的寻址方式所以adr实际写入r0寄存器的地址为程序的加载地址而非反汇编代码所指示的0xd0024000,通过ldr伪指令将所需重定位的地址写入r1寄存器,此时r1所存的地址为0xd0024064,该地址的内容为d0024000即为重定位的起始地址.ldr伪指令将bss段的起始地址符号bss_start写入r2寄存器,当r0r1相等时表示加载地址和重定位地址为同一地址,所以不会进行重定位的相关操作,而是跳转到清理bss段为C代码的运行建立环境:如果r0r1不相等,就表示加载地址与实际运行地址不同,所以需要进行重定位以保证代码在运行时不会出现错误。所谓的重定位就是将加载地址处的代码拷贝一份到实际运行位置处,所以在.S代码的copy_loop就是将代码从加载地址处拷贝到实际运行处。在清理完bssC代码建立好运行环境后通过ldr pc, =led_flash ,ldr长跳转到C代码的流水灯程序中。


本文出自 “嵌入式入门学习” 博客,请务必保留此出处http://liuxiaoniu.blog.51cto.com/10779102/1712769

关于重定位代码的浅显理解

标签:嵌入式   重定位

原文地址:http://liuxiaoniu.blog.51cto.com/10779102/1712769

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!