温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-06-28 15:06:07 来源:网络 阅读:1162 作者:liuxu112 栏目:开发技术

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

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

根据反汇编代码  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代码的流水灯程序中。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI