InitStacks mrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack (sp = #0x0c7fe400) orr r1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 ;AbortMode ldr sp,=AbortStack (sp = #0x0c7fe800)
orr r1,r0,#IRQMODE|NOINT msr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStack (sp = #0x0c7fec00) orr r1,r0,#FIQMODE|NOINT msr cpsr_cxsf,r1 ;FIQMode ldr sp,=FIQStack (sp = #0x0c7ff000)
bic r0,r0,#MODEMASK|NOINT orr r1,r0,#SVCMODE msr cpsr_cxsf,r1 ;SVCMode ldr sp,=SVCStack (sp = #0x0c7fe000)
44binit.s中当程序进入这一段时 看样子是在给各个模式下的堆栈指针SP定一个地址 看了S3C44B0的寄存器说明 6个模式下 有6个SP 也就是6个R13了 每个R13要区别开要加后缀的吧 比如 _usr _svc _abt _und _irp _fiq 那么从上面程序来看 貌似SP没区别开嘛 虽然有一句 msr cpsr_cxsf,r1 看样子是切换到那个将要给相应的SP赋值的模式了 但是切换到那个相应模式 那么后面的SP不需要加后缀以区别吗···· 程序后面我标注的()里的内容是我用AXD 单步运行时 记录下来的 确确实实送如sp的值 我是把RO_BASE设为0x00000000烧录完成后 程序能运行没问题后开AXD的 disassembly 看到的值 上面程序运行完后 我开AXD的registers表看看每个模式下的SP值是不是按上述程序设置的一样 结果很郁闷 所有的SP都成了 (sp = #0x0c7fe000) 再单步看了一下 原来每次 ldr sp,=???Stack 所有的SP都是一起被赋值的·· 到最后 都被赋值成了0x0c7fe000 我想改下程序 把sp改成相应的 r13_svc r13_abt ··· 但是改不了 编译出错 这个问题很郁闷 难道说这几个模式的SP本来就该设置成同一个地址 请教高人··· 还有那个cpsr_cxsf 加的_cxsf后缀是什么意思啊? |