ARM 核心工作模式的切換是要自己寫程式碼的, 設定CPSR 暫存器低5位進行切換
0b10001 快速中斷模式
0b10010 中斷模式
0b10011 管理模式
0b10111 中止模式
0b11011 未定義
0b11111 系統模式
以下程式碼就是切換CPU工作模式的示例
;********** Begin init stact ***********/
;在6種模式下切換並設定堆疊指標
MRS R0,CPSR ;把CPSR讀取到R0
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Fiq ;設定R1 為0b10001
ORR R0,R0,R1 ;R0和R1相或,設定低5位
MSR CPSR_c,R0 ;把R0的值重新賦值到CPSR
LDR SP,=Stact_Fiq
LDR R1,=MODE_Irq
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Irq
LDR R1,=MODE_Svc
LDR SP,=Stact_Svc
LDR R1,=MODE_Abort
LDR SP,=Stact_Abort
LDR R1,=MODE_Undef
LDR SP,=Stact_Undef
LDR R1,=MODE_Sys
LDR SP,=Stact_Sys
ARM 核心工作模式的切換是要自己寫程式碼的, 設定CPSR 暫存器低5位進行切換
0b10001 快速中斷模式
0b10010 中斷模式
0b10011 管理模式
0b10111 中止模式
0b11011 未定義
0b11111 系統模式
以下程式碼就是切換CPU工作模式的示例
;********** Begin init stact ***********/
;在6種模式下切換並設定堆疊指標
MRS R0,CPSR ;把CPSR讀取到R0
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Fiq ;設定R1 為0b10001
ORR R0,R0,R1 ;R0和R1相或,設定低5位
MSR CPSR_c,R0 ;把R0的值重新賦值到CPSR
LDR SP,=Stact_Fiq
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Irq
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Irq
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Svc
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Svc
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Abort
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Abort
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Undef
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Undef
BIC R0,#0x1f ;低5位清零
LDR R1,=MODE_Sys
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Sys