127 lines
2.2 KiB
ArmAsm
127 lines
2.2 KiB
ArmAsm
.global _start
|
|
.extern main
|
|
|
|
|
|
.section .init, "ax"
|
|
.code 16
|
|
.align 2
|
|
.thumb_func
|
|
|
|
|
|
_start:
|
|
CPSID i
|
|
ldr r1, =__stack_end__
|
|
mov sp, r1
|
|
|
|
|
|
/* Copy initialised sections into RAM if required. */
|
|
ldr r0, =__data_load_start__
|
|
ldr r1, =__data_start__
|
|
ldr r2, =__data_end__
|
|
bl crt0_memory_copy
|
|
ldr r0, =__text_load_start__
|
|
ldr r1, =__text_start__
|
|
ldr r2, =__text_end__
|
|
bl crt0_memory_copy
|
|
ldr r0, =__fast_load_start__
|
|
ldr r1, =__fast_start__
|
|
ldr r2, =__fast_end__
|
|
bl crt0_memory_copy
|
|
ldr r0, =__ctors_load_start__
|
|
ldr r1, =__ctors_start__
|
|
ldr r2, =__ctors_end__
|
|
bl crt0_memory_copy
|
|
ldr r0, =__dtors_load_start__
|
|
ldr r1, =__dtors_start__
|
|
ldr r2, =__dtors_end__
|
|
bl crt0_memory_copy
|
|
ldr r0, =__rodata_load_start__
|
|
ldr r1, =__rodata_start__
|
|
ldr r2, =__rodata_end__
|
|
bl crt0_memory_copy
|
|
|
|
|
|
/* Zero bss. */
|
|
ldr r0, =__bss_start__
|
|
ldr r1, =__bss_end__
|
|
mov r2, #0
|
|
bl crt0_memory_set
|
|
|
|
|
|
/* Setup heap - not recommended for Threadx but here for compatibility reasons */
|
|
ldr r0, = __heap_start__
|
|
ldr r1, = __heap_end__
|
|
sub r1, r1, r0
|
|
mov r2, #0
|
|
str r2, [r0]
|
|
add r0, r0, #4
|
|
str r1, [r0]
|
|
|
|
|
|
/* constructors in case of using C++ */
|
|
ldr r0, =__ctors_start__
|
|
ldr r1, =__ctors_end__
|
|
crt0_ctor_loop:
|
|
cmp r0, r1
|
|
beq crt0_ctor_end
|
|
ldr r2, [r0]
|
|
add r0, #4
|
|
push {r0-r1}
|
|
blx r2
|
|
pop {r0-r1}
|
|
b crt0_ctor_loop
|
|
crt0_ctor_end:
|
|
|
|
|
|
/* Setup call frame for main() */
|
|
mov r0, #0
|
|
mov lr, r0
|
|
mov r12, sp
|
|
|
|
|
|
start:
|
|
/* Jump to main() */
|
|
mov r0, #0
|
|
mov r1, #0
|
|
ldr r2, =main
|
|
blx r2
|
|
/* when main returns, loop forever. */
|
|
crt0_exit_loop:
|
|
b crt0_exit_loop
|
|
|
|
|
|
|
|
/* Startup helper functions. */
|
|
|
|
|
|
crt0_memory_copy:
|
|
cmp r0, r1
|
|
beq memory_copy_done
|
|
sub r2, r2, r1
|
|
beq memory_copy_done
|
|
memory_copy_loop:
|
|
ldrb r3, [r0]
|
|
add r0, r0, #1
|
|
strb r3, [r1]
|
|
add r1, r1, #1
|
|
sub r2, r2, #1
|
|
bne memory_copy_loop
|
|
memory_copy_done:
|
|
bx lr
|
|
|
|
|
|
crt0_memory_set:
|
|
cmp r0, r1
|
|
beq memory_set_done
|
|
strb r2, [r0]
|
|
add r0, r0, #1
|
|
b crt0_memory_set
|
|
memory_set_done:
|
|
bx lr
|
|
|
|
|
|
/* Setup attibutes of stack and heap sections so they don't take up room in the elf file */
|
|
.section .stack, "wa", %nobits
|
|
.section .stack_process, "wa", %nobits
|
|
.section .heap, "wa", %nobits
|
|
|