📄 startup.s
字号:
; *****************************************************************************
; * *
; * 复位引导程序 *
; * *
; *****************************************************************************
IMPORT Int_Undefined
IMPORT Int_SWI
IMPORT Int_PrefetchAbort
IMPORT Int_DataAbort
IMPORT Int_FIQ
IMPORT Main
EXPORT ResetEntry
;定义堆栈的大小(2KB)
IRQ_STACK_LENGTH EQU 128
FIQ_STACK_LENGTH EQU 32
SVC_STACK_LENGTH EQU 32
ABT_STACK_LENGTH EQU 0
UND_STACK_LENGTH EQU 0
USR_STACK_LENGTH EQU 320
AREA GprsData, DATA, NOINIT
GprsDataReserve SPACE 0x7800
AREA Stacks, DATA, NOINIT, ALIGN=2
; -----------------------------------------------------------------------------
; 堆栈空间定义
UsrStackSpace SPACE USR_STACK_LENGTH * 4 ; 系统/用户模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LENGTH * 4 ; IRQ中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LENGTH * 4 ; FIQ中断模式堆栈空间
SvcStackSpace SPACE SVC_STACK_LENGTH * 4 ; 管理模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LENGTH * 4 ; 中止模式堆栈空间
UndStackSpace SPACE UND_STACK_LENGTH * 4 ; 未定义模式堆栈空间
AREA Startup,CODE,READONLY
ENTRY
; -----------------------------------------------------------------------------
; 复位中断向量表
ResetEntry
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SwiAddr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
B .
LDR PC, [PC, #-0xff0]
LDR PC, FiqAddr
ResetAddr DCD Int_Reset
UndefinedAddr DCD Int_Undefined
SwiAddr DCD Int_SWI
PrefetchAddr DCD Int_PrefetchAbort
DataAbortAddr DCD Int_DataAbort
ReserveAddr DCD 0
IrqAddr DCD 0
FiqAddr DCD Int_FIQ
; -----------------------------------------------------------------------------
; 复位(管理模式)
Int_Reset
MSR CPSR_c, #0xd3 ; 设置管理模式SVC堆栈
LDR SP, StackSvc
MSR CPSR_c, #0xd2 ; 设置中断模式IRQ堆栈
LDR SP, StackIrq
MSR CPSR_c, #0xd1 ; 设置快速中断模式FIQ堆栈
LDR SP, StackFiq
MSR CPSR_c, #0xd7 ; 设置中止模式DATAABORT堆栈
LDR SP, StackAbt
MSR CPSR_c, #0xdb ; 设置未定义模式UDF堆栈
LDR SP, StackUnd
MSR CPSR_c, #0xdf ; 设置系统/用户模式USR堆栈
LDR SP, StackUsr
B Main ; 系统模式
; -----------------------------------------------------------------------------
; 堆栈定义
StackFiq DCD FiqStackSpace + (FIQ_STACK_LENGTH - 1)* 4
StackSvc DCD SvcStackSpace + (SVC_STACK_LENGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LENGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LENGTH - 1)* 4
StackUnd DCD UndStackSpace + (UND_STACK_LENGTH - 1)* 4
StackUsr DCD UsrStackSpace + (USR_STACK_LENGTH - 1)* 4
GprsDataDefine DCD GprsDataReserve
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -