?? test7.s
字號:
;定義堆棧的大小
USR_STACK_LEGTH EQU 64
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 64
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
AREA Example7,CODE,READONLY ; 聲明代碼段Example7
ENTRY ; 標識程序入口
CODE32 ; 聲明32位ARM指令
START MOV R0,#0
MOV R1,#1
MOV R2,#2
MOV R3,#3
MOV R4,#4
MOV R5,#5
MOV R6,#6
MOV R7,#7
MOV R8,#8
MOV R9,#9
MOV R10,#10
MOV R11,#11
MOV R12,#12
BL InitStack ; 初始化各模式下的堆棧指針
; 打開IRQ中斷 (將CPSR寄存器的I位清零)
MRS R0,CPSR ; R0 <= CPSR
BIC R0,R0,#0x80
MSR CPSR_cxsf,R0 ; CPSR <= R0
; 切換到用戶模式
MSR CPSR_c, #0xd0
MRS R0,CPSR
; 切換到管理模式
MSR CPSR_c, #0xdf
MRS R0,CPSR
HALT B HALT
; 名稱:InitStack
; 功能:堆棧初始化,即初始化各模式下的堆棧指針。
; 入口參數:無
; 出口參數:無
; 說明:在特權模式下調用此子程序,比如復位后的管理模式
InitStack
MOV R0, LR ; R0 <= LR,因為各種模式下R0是相同的
;設置管理模式堆棧
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;設置中斷模式堆棧
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;設置快速中斷模式堆棧
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;設置中止模式堆棧
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;設置未定義模式堆棧
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;設置系統模式堆棧
MSR CPSR_c, #0xdf
LDR SP, StackUsr
MOV PC, R0
StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)*4
; 分配堆棧空間
AREA MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用戶(系統)模式堆棧空間
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ; 管理模式堆棧空間
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中斷模式堆棧空間
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中斷模式堆棧空間
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ; 中止義模式堆棧空間
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定義模式堆棧
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -