串口裸机程序中有如下链接脚本
SECTIONS {
. = 0x30000000;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
.= 0x30000000;
这个程序应该放置在0x30000000。
但是为什么这个程序上来可以执行呢?
位置无关码:可以执行
Bl相对位置跳转指令 是一种位置无关码(不管代码位置在哪,都可以执行)。
位置无关码的PC值如下:
PC值:
PC(新)=P(当前)+偏移(与BL指令有关)
PC=4+8(4+8当前位置+8)+0x28=0x34
BL会把返回地址保存到LR寄存器中
ldr 位置相关码,因为SDRAM上来还没有初始化,所以还不能使用0x30000034
两种SDRAM初始化方法:位置相关与无关
如何写位置无关码:
转载请注明原文地址: https://ju.6miu.com/read-200114.html