注2:cpsr_c指令中各个位含义
示例:通过cpsr spsr设置arm cpu工作模式,代码如下:
areaexample,code,readonly
entry
start
blenable_irq
bldisable_irq
blstack_init
b over
enable_irq
;读取cpsr的值到r0
mrsr0,cpsr
; 将中断标志位置0,使能中断
bicr0,r0,#0x80
msr cpsr_c,r0
bxlr
disable_irq
mrsr0,cpsr
; 将中断标志位置1,禁止中断
orrr0,r0,#0x80
msr cpsr_c,r0
bxlr
stack_init
;当前cpu工作模式为svc模式,将堆栈地址初始化为33c00000
ldrsp , =0x33c00000
; 将cpu工作模式为undef模式,将堆栈地址初始化为0x34000000
msrcpsr_c, #0xdb
movsp , #0x34000000
; 将cpu工作模式为abort模式,将堆栈地址初始化为0x33f00000
;abort
msrcpsr_c, #0xd7
ldr sp , =0x33f00000
; 将cpu工作模式为irq模式,将堆栈地址初始化为0x33e000000
;irq
msrcpsr_c, #0xd2
ldrsp , =0x33e00000
; 将cpu工作模式为usr模式,将堆栈地址初始化为0x33d000000,注意在这种模式下,不可再设置cpsr寄存器,因为usr模式访问资源有限。
;usr
;msrcpsr_c, 0xd0
;ldrsp , =0x33d00000
;cpu工作模式为返回svc模式
;svc
msrcpsr_c, #0xd3
bxlr
over
bover
end
undef模式调试界面如下
注2:切换模式后,看到的 sp lr spsr 都是新的模式下的寄存器。
注3: usr模式下,不能修改cpsr-----usr是非特权模式