启动文件
.global _start /* 全局标号 */
/*
* 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C
* 运行环境。
*/
_start:
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
/*清除BSS段*/
ldr r0,_bss_start
ldr r1, _bss_end
mov r2, #0
bss_Loop:
stmia r0!,{r2} /*比较R0和R1里面的值* /
cmp r0, r1 /*如果r0地址小于等于r1,继续清除bss段*/
ble bss_Loop
/* 设置栈指针,
* 注意:IMX6UL的堆栈是向下增长的!
* 堆栈指针地址一定要是4字节地址对齐的!!!
* DDR范围:0X80000000~0X9FFFFFFF
*/
ldr sp,=0X80200000 /* 设置用户模式下的栈首地址为0X80200000,大小为2MB */
b main /* 跳转到main函数 */
链接文件
SECTIONS{
. = 0X87800000;
.text :
{
obj/start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data) }
/*
由于IMX6ULL是32位SOC,在处理数据的时候都是4字节进行访问
因此BSS段起始地址要是能被4整除的地址,如果不是的话会出现不能访问的现象。
*/
. = ALIGN(4);
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}