arm 模式栈初始化
初始化 栈的一般的步骤,
首先要 切换到特定的模式,
然后是 将栈地址 给到PC指针。
有多少种模式就有多少种 栈地址。
PC 寄存器 是R13
每种模式都有自己的 R13
每种模式 都要初始化自己的R13
一共这个多的模式
那么CPU 怎么区分 处于何种模式呢?
就是通过 CPSR的 后5个 bit 来判断的。
area reset,code
code32
entry
start
bl stack_init
stack_init ; 栈指针初始化函数
; @undefine_stack
msr cpsr_c,#0xdb ; 切换到未定义异常
ldr sp,=0x34000000 ; 栈指针为内存最高地址,栈为倒生的栈
; 栈空间的最后1M 0x34000000~0x33f00000
; @abort_stack
msr cpsr_c,#0xd7 ; 切换到终止异常模式
ldr sp,=0x33f00000 ; 栈空间为1M,0x33f00000~0x33e00000
; @irq_stack
msr cpsr_c,#0xd2 ; 切换到中断模式
ldr sp,=0x33e00000 ; 栈空间为1M,0x33e00000~0x33d00000
; @ sys_stack
msr cpsr_c,#0xdf ; 切换到系统模式
ldr sp,=0x33d00000 ; 栈空间为1M,0x33d00000~0x33c00000
msr cpsr_c,#0xd3 ; 切换回管理模式
mov pc,lr
end
一共设置了 5种模式 的 SP