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