|
USR_STACK_LEGTH EQU 64<br />SVC_STACK_LEGTH EQU 0<br />FIQ_STACK_LEGTH EQU 16<br />IRQ_STACK_LEGTH EQU 64<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br />; 名称:InitStack<br />; 功能:堆栈初始化,即初始化各模式下的堆栈指针。<br />; 入口参数:无<br />; 出口参数:无<br />; 说明:在特权模式下调用此子程序,比如复位后的管理模式<br />InitStack <br /> MOV R0, LR ; R0 <= LR,因为各种模式下R0是相同的 <br /><br />;设置管理模式堆栈<br /> MSR CPSR_c, #0xd3 <br /> LDR SP, StackSvc <br />;设置中断模式堆栈<br /> MSR CPSR_c, #0xd2 <br /> LDR SP, StackIrq <br />;设置快速中断模式堆栈<br /> MSR CPSR_c, #0xd1 <br /> LDR SP, StackFiq <br />;设置中止模式堆栈<br /> MSR CPSR_c, #0xd7 <br /> LDR SP, StackAbt <br />;设置未定义模式堆栈<br /> MSR CPSR_c, #0xdb <br /> LDR SP, StackUnd <br />;设置系统模式堆栈<br /> MSR CPSR_c, #0xdf <br /> LDR SP, StackUsr <br /><br /> MOV PC, R0 <br /><br />StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4<br />StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4<br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4<br />StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)*4<br /><br /><br />; 分配堆栈空间 <br /> AREA MyStacks, DATA, NOINIT, ALIGN=2 <br />UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间 d<br />SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ; 管理模式堆栈空间 <br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中断模式堆栈空间 <br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中断模式堆栈空间 <br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ; 中止义模式堆栈空间 <br />UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定义模式堆栈 <br /><br /><br /><br />经过ADS1.2仿真;发现地址变化如下<br />svc 0x400030fc<br />irq 0x400031fc<br />fiq 0x4000323c<br />abort 0x4000323c<br />undef 0x4000323c<br />sys 0x400030fc |
|