为什么需要重定位?
本来代码是运行在0xd0020010的,但因为一些原因我们又希望代码实际是在0xd0024000位置运行的。这时候就需要重定位了。
ARM裸机重定位汇编代码到解读
任务:在SRAM中将代码从0xd0020010重定位到0xd0024000
思路: 第一点:通过链接脚本将代码链接到0xd0024000
第二点:dnw下载时将bin文件下载到0xd0020010
第三点:代码执行时通过代码前段的少量位置无关码将整个代码搬移到0xd0024000
第四点:使用一个长跳转跳转到0xd0024000处的代码继续执行,重定位完成
// 重定位汇编指令
// adr指令用于加载_start当前运行地址
adr r0, _start // adr加载时就叫短加载
// ldr指令用于加载_start的链接地址:0xd0024000
ldr r1, =_start // ldr加载时如果目标寄存器是pc就叫长跳转,如果目标寄存器是r1等就叫长加载
// bss段的起始地址
ldr r2, =bss_start // 就是我们重定位代码的结束地址,也就是重定位只需重定位代码段和数据段即可
cmp r0, r1 // 比较_start的运行时地址和链接地址是否相等
beq clean_bss // 如果相等说明不需要重定位,所以跳过copy_loop,直接到clean_bss
// 如果不相等说明需要重定位,那么直接执行下面的copy_loop进行重定位
// 重定位完成后继续执行clean_bss。
// 用汇编来实现的一个whi