📄 init.s
字号:
AREA Init,CODE,READONLY
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
HAVEINT EQU 0x00
RAM_Limit EQU 0x400000 ; For unexpanded W90N740 board
UND_Stack EQU RAM_Limit
Abort_Stack EQU RAM_Limit-256
IRQ_Stack EQU RAM_Limit-512 ; followed by IRQ stack
FIQ_Stack EQU RAM_Limit-768 ; followed by IRQ stack
SVC_Stack EQU RAM_Limit-1024 ; SVC stack at top of memory
; add FIQ_Stack, ABT_Stack, UNDEF_Stack here if you need them
USR_Stack EQU 0x3f8000 ; followed by USR(SYS) stack
KEEP
ENTRY
EXPORT Reset_Handler
;****************************************************
;* Initialize stacks *
;****************************************************
Reset_Handler
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UND_Stack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=Abort_Stack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQ_Stack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQ_Stack
orr r1,r0,#SVCMODE|NOINT
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVC_Stack
mrs r0,cpsr
bic r0,r0,#0xC0
msr cpsr_cxsf,r0 ;SVCMode
; orr r1,r0,#USERMODE
; bic r1,r1,#0xc0
; msr cpsr_cxsf,r1 ;USRMode
; ldr sp,=USR_Stack
;********************************************************
;* Copy and paste RW data/zero initialized data *
;********************************************************
; orr r1,r0,#USERMODE
; bic r1,r1,#0xc0
; msr cpsr_c,r1 ;USRMode
;********************************************************
;* Copy and paste RW data/zero initialized data *
;********************************************************
IMPORT |Image$$RO$$Limit| ; End of ROM code
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT main ; The main entry of mon program
LDR r0, =|Image$$RO$$Limit| ; pointer to ROM data
LDR r1, =|Image$$RW$$Base| ; RAM copy
LDR r3, =|Image$$ZI$$Base|
;Zero init base => top of initialised data
CMP r0, r1 ; Check that they are different
BEQ %F1
0
CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2
CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2
; MSR CPSR_c, #USERMODE ; No interrupts
; LDR SP, =USR_Stack
BL main ; jump to C program
B .
; ALIGN
; AREA RamData, DATA, READWRITE
;
; ^ (0x400000-0x600) ;
;UserStack # 256 ;c1(c7)ffa00
;SVCStack # 256 ;c1(c7)ffb00
;UndefStack # 256 ;c1(c7)ffc00
;AbortStack # 256 ;c1(c7)ffd00
;IRQStack # 256 ;c1(c7)ffe00
;FIQStack # 0 ;c1(c7)fff00
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -