LDR sp, label ; 将该标号(地址)处的数据写入sp
LDR sp, =label ; 将该标号所标识的地址写入sp
下面是一段栈初始化代码:
StackInit
MOV R0, LR
;/* Set Stack: Supervisor Mode */
IF SVC_STACK_LENGTH <> 0
MSR CPSR_c, #(SVC32MODE | NoInt | NoFIQ)
LDR SP, StackSvc
ENDIF
;/* Set Stack: IRQ Mode */
IF IRQ_STACK_LENGTH <> 0
MSR CPSR_c, #(IRQ32MODE | NoInt | NoFIQ)
LDR SP, StackIrq
ENDIF
;/* Set Stack: FIQ Mode */
IF FIQ_STACK_LENGTH <> 0
MSR CPSR_c, #(FIQ32MODE | NoInt | NoFIQ)
LDR SP, StackFiq
ENDIF
;/* Set Stack: Abort Mode */
IF ABT_STACK_LENGTH <> 0
MSR CPSR_c, #(ABT32MODE | NoInt | NoFIQ)
LDR SP, StackAbt
ENDIF
;/* Set Stack: Undefined Mode */
IF UND_STACK_LENGTH <> 0
MSR CPSR_c, #(UND32MODE | NoInt | NoFIQ)
LDR SP, StackUnd ;// 此处为ARM指令,StackUnd定义在RO段,将该标号处的数据写入SP
ENDIF
;/* Set Stack: System/User Mode */
MSR CPSR_c, #(SYS32MODE | NoInt | NoFIQ)
LDR SP, =Bottom_UserStack ;// 此处为LDR伪指令,Bottom_UserStack定义在DATA段,直接将该标号地址写入SP
MOV PC, R0 ;// 堆栈初始化后IRQ、FIQ中断是关闭的,内核处于系统模式