📄 crt0_gnu.asm
字号:
/*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Workfile: crt0_gnu.asm $; $Revision: 1.0 $; $Author: WellsK $; $Date: Jul 01 2003 09:05:34 $; ; Project: GNU C runtime startup code;; Description:; This code sets up the basic code runtime environment for and; application example started with the GNU toolset. This code; clears out the ZI segment, initialize the stacks, and branches; to the c_entry() function.;; Revision history:; $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh7a404/bsps/sdk7a404/examples/common/crt0_gnu.asm-arc $;
; Rev 1.0 Jul 01 2003 09:05:34 WellsK
; Initial revision.
; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION; OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE,; AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES, ; SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE.; ; SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY ; FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A ; SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE; FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS.; ; COPYRIGHT (C) 2001 SHARP MICROELECTRONICS OF THE AMERICAS, INC.; CAMAS, WA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/.EQU MODE_USR, 0x010.EQU MODE_FIQ, 0x011.EQU MODE_IRQ, 0x012.EQU MODE_SVC, 0x013.EQU MODE_SVC_NI, 0x0D3.EQU MODE_ABORT, 0x017.EQU MODE_UNDEF, 0x01b.EQU MODE_SYSTEM, 0x01f.EQU MODE_BITS, 0x01f.EQU I_MASK, 0x080.EQU F_MASK, 0x040.EQU IF_MASK, 0x0C0.EQU USR_STK_SIZE, 0x400 /* User mode stack size */.EQU FIQ_STK_SIZE, 0x400 /* FIQ mode stack size */.EQU IRQ_STK_SIZE, 0x800 /* IRQ mode stack size */.EQU ABT_STK_SIZE, 0x400 /* Abort exception stack size */.EQU UND_STK_SIZE, 0x400 /* Undefined exception stack size */.EQU SYS_STK_SIZE, 0x1000 /* System mode stack size */.EQU SVC_STK_SIZE, 0x4000 /* Supervisor mode stack size */ .text .code 32 .align 0 .extern c_entry /* Reference to c entry point */ .extern __gnu_bssstart /* Start of the bss segment */ .extern __gnu_bssend /* End of the bss segment */ .extern __end /* End of segments, needed to define stack area */ .global __gccmain /* public method */ .global __start /* public code entry point */__start: MOV r1, #IF_MASK /* No Interrupts */ ORR r2, r1, #MODE_SVC /* Supervisor mode with no interrupts */ MSR cpsr_cxsf, r2 /* Set ARM core mode to supervisor */ LDR r0, =__gnu_bssstart /* Get start of bss segment */ LDR r1, =__gnu_bssend /* Get end of bss segment *//* Clear out the xero-init (ZI) data segment */ LDR r2, =0 /* r2 = 0 */zi_clear: CMP r0, r1 /* Compare current and last clear address */ BGE zi_clear_done /* Was this the last address? */ STR r2, [r0] /* Not last address, clear data area */ ADD r0, r0, #4 /* Increment to next word address */ B zi_clear /* Continue *//* After the ZI segment is cleared, set up the stacks needed for the examples */zi_clear_done: LDR r0, =__end /* Get end of all segments */ MOV r1, #IF_MASK /* No Interrupts */ /* Enter FIQ mode and setup the FIQ stack pointer */ ORR r2, r1, #MODE_FIQ MSR cpsr_cxsf, r2 LDR r3, =FIQ_STK_SIZE ADD r0, r0, r3 MOV r13, r0 /* Enter IRQ mode and setup the IRQ stack pointer */ ORR r2, r1, #MODE_IRQ MSR cpsr_cxsf, r2 LDR r3, =IRQ_STK_SIZE ADD r0, r0, r3 MOV r13, r0 /* Enter Abort mode and setup the Abort stack pointer */ ORR r2, r1, #MODE_ABORT MSR cpsr_cxsf, r2 LDR r3, =ABT_STK_SIZE ADD r0, r0, r3 MOV r13, r0 /* Enter Undefined mode and setup the Undefined stack pointer */ ORR r2, r1, #MODE_UNDEF MSR cpsr_cxsf, r2 LDR r3, =UND_STK_SIZE ADD r0, r0, r3 MOV r13, r0 /* Enter System mode and setup the User/System stack pointer */ ORR r2, r1, #MODE_SYSTEM MSR cpsr_cxsf, r2 LDR r3, =SYS_STK_SIZE ADD r0, r0, r3 MOV r13, r0 /* Enter SVC mode and setup the SVC stack pointer. This is the mode for runtime initialization. */ ORR r2, r1, #MODE_SVC MSR cpsr_cxsf, r2 LDR r3, =SVC_STK_SIZE ADD r0, r0, r3 MOV r13, r0c_start: BL c_entry /* Jump to the c_entry() */exit: B exit /* On exit, sit and spin *//* The function gccmain() is needed only for GNU toolsets */__gccmain: MOV pc, lr /* Just return - gnu specific */ .end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -