首先需要朱有鹏老师,这是在学习了朱老师的课程之后的一点理解,代码是根据朱老师的源码学习之后编写的。
根据反汇编代码 d0024010: e24f0018 sub r0, pc, #24 可以看出通过adr汇编伪指令将加载地址写入r0寄存器,此时因为adr指令采用相对寻址的寻址方式所以adr实际写入r0寄存器的地址为程序的加载地址而非反汇编代码所指示的0xd0024000,通过ldr伪指令将所需重定位的地址写入r1寄存器,此时r1所存的地址为0xd0024064,该地址的内容为d0024000即为重定位的起始地址.由ldr伪指令将bss段的起始地址符号bss_start写入r2寄存器,当r0和r1相等时表示加载地址和重定位地址为同一地址,所以不会进行重定位的相关操作,而是跳转到清理bss段为C代码的运行建立环境:如果r0和r1不相等,就表示加载地址与实际运行地址不同,所以需要进行重定位以保证代码在运行时不会出现错误。所谓的重定位就是将加载地址处的代码拷贝一份到实际运行位置处,所以在.S代码的copy_loop就是将代码从加载地址处拷贝到实际运行处。在清理完bss为C代码建立好运行环境后通过ldr pc, =led_flash ,ldr长跳转到C代码的流水灯程序中。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。