.globl _start
_start:
/* 硬件相关的设置 */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/* 重定位 */
adr r0, _start /* 伪指令,取_start的当前地址 */
ldr r1, =_start /* 链接地址 */
1000是链接地址
ldr r2, =bss_start //bss_start地址
cmp r0, r1 //比较当前地址和链接地址。相同,则程序已经位于链接地址上,不需要copy_loop了
beq clean_bss //跳到clean_bss
copy_loop:
ldr r3, [r0], #4 //取出r3到r0,后r0加4
str r3, [r1], #4 //将r3放到r1,后r1加4
cmp r1, r2 //比较bss_start地址和链接地址
bne copy_loop //不同时,则继续循环,相同,则进行下一段代码
/* 清bss段 */
clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
mov r2, #0 //r2=0
clean_loop:
str r2, [r0], #4
cmp r0, r1 //r0=r1时,表示清bss完成
bne clean_loop
/* 设置栈 */
ldr sp, =8*1024
ldr pc, =main //重定位完后,使用位置相关指令,使程序跳到链接地址上运行
/* bl main*/ //用bl指令,不会跳到链接地址上
halt:
b halt