📄 startup.s
字号:
;------------------------------------------------------------------------------
; Includes
;------------------------------------------------------------------------------
;////myDef
SVC_STACK EQU (0x20a00000)
SYS_STACK EQU (SVC_STACK-0x100000)
IRQ_STACK EQU (SYS_STACK-0x100000)
NOINT EQU 0xc0
IRQMODE EQU 0x12
;////
;-------------------------------------------------------------------------------
; Constants
;-------------------------------------------------------------------------------
;-- ARM processor modes
ARM_MODE_USER EQU 0x10
ARM_MODE_FIQ EQU 0x11
ARM_MODE_IRQ EQU 0x12
ARM_MODE_SVC EQU 0x13
ARM_MODE_ABORT EQU 0x17
ARM_MODE_UNDEF EQU 0x1B
ARM_MODE_SYS EQU 0x1F
;-- Status register bits
I_BIT EQU 0x80
F_BIT EQU 0x40
;-- Stack sizes
IRQ_STACK_SIZE EQU (3*8*4) ;( 3 stacks 8 vectors 4 bytes)
FIQ_STACK_SIZE EQU 0x004
ABT_STACK_SIZE EQU 0x004
UND_STACK_SIZE EQU 0x004
SVC_STACK_SIZE EQU 0x800
SYS_STACK_SIZE EQU 0x400
;-------------------------------------------------------------------------------
; Entry point
;-------------------------------------------------------------------------------
AREA reset, CODE, READONLY
EXPORT __ENTRY
__ENTRY
;-------------------------------------------------------------------------------
;- Exception vectors ( before Remap )
;-------------------------------------------------------------------------------
;- These vectors are read at address 0.
;- They absolutely requires to be in relative addresssing mode in order to
;- guarantee a valid jump. For the moment, all are just looping (what may be
;- dangerous in a final system). If an exception occurs before remap, this
;- would result in an infinite loop.
;-------------------------------------------------------------------------------
B Reset ; 0x00 Reset handler
undefvec
B undefvec ; 0x04 Undefined Instruction
swivec
B swivec ; 0x08 Software Interrupt
pabtvec
B pabtvec ; 0x0C Prefetch Abort
dabtvec
B dabtvec ; 0x10 Data Abort
rsvdvec
B rsvdvec ; 0x14 reserved
irqvec
LDR PC,[PC,# -&F20] ; 0x18 IRQ : read the AIC
fiqvec
B fiqvec ; 0x1C FIQ
;-------------------------------------------------------------------------------
; Reset routine
;-------------------------------------------------------------------------------
Reset
;---- Stack setup
;---- End of RAM (start of stack) address in r1
ldr r0,=0x1
mov r1,r0
;enter IRQ mode and set IRQ stack
ldr r1,=(IRQMODE|NOINT)
msr cpsr_cxsf,r1
ldr sp,=IRQ_STACK ;中断模式堆栈
mov r3, #ARM_MODE_SVC |I_BIT| F_BIT
msr CPSR_c, r3 ; Copy to CPSR
ldr r13,=SVC_STACK ;特权模式堆栈
mov r3, #ARM_MODE_SYS | F_BIT
msr CPSR_c, r3 ; Copy to CPSR
ldr r13,=SYS_STACK ;系统模式堆栈
ldr r1,=(0xffffff00)
mov r0,#1
str r0,[r1] ;内存重映射,使得0x0开始的内存可写
;---- Initialize ZI data
ZI_loop
cmp r1, r2
strcc r0, [r1], #4
bcc ZI_loop
b ZI_end
ZI_addresses
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; Top of zero init segment
DCD |Image$$ZI$$Base|
DCD |Image$$ZI$$Limit|
ZI_end
;-------------------------------------------------------------------------------
; Branch on C code Main function (with interworking)
;-------------------------------------------------------------------------------
; Branch must be performed by an interworking call as either an ARM or Thumb
; main C function must be supported. This makes the code not position-
; independant. A Branch with link would generate errors
;-------------------------------------------------------------------------------
IMPORT main
ldr r0, =main
mov lr, pc
bx r0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -