重定位整个代码

        最近重温韦东山老师的嵌入式视频重定位章节,看完重定位整个代码部分后一直在纠结一个问题,先把链接脚本和重定位部分代码贴出来:

SECTIONS{
    .= 0x30000000;
    .= ALIGN(4);
    .text : { *(.text) }
    .= ALIGN(4);
    .rodata : { *(.rodata) }
    .= ALIGN(4);
    .data : { *(.data) }
    .= ALIGN(4);
    _bss_start = .;
    .bss : { *(.bss) *(.COMMON) }
    _end = .;
}
mov r1, #0
ldr r2, =_start
ldr r3, =_bss_start

cpy:
    ldr r4, [r1]
    str r4, [r2]
    add r1, r1, #4
    add r2, r2, #4
    cmp r2, r3
    ble cpy

        我所纠结的问题是:我们明明可以在重定位代码中直接将r2赋值为0x3000,0000,这样也能将代码重定位到0x3000,0000处,然后ldr pc, =main绝对跳转命令跳到SDRAM执行,那么问题来了,在链接脚本中指定的链接地址有什么用?有没有必要?

        想了很久终于找到了问题,如果不在链接脚本指定链接地址,ldr pc, =main凭什么可以跳到0x3000,0000处运行?我们的重定位代码可没有这个能力,它只是把程序复制到0x3000,0000开始的地址处,所以指定链接地址的作用就是定位main的运行地址为0x3xxx,xxxx,这样重定位之后执行ldr pc, =main绝对跳转就可以跳到SDRAM中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值