如下代码,如果我不使用space来分配,甚至可以不使用dcd指令,我就直接给那些各种模式下的sp的指针附值,只要自己在程序中控制好,保证不让代码段的指令会到这段地址,是不是就可以了?那些space和dcd,主要是为了程序的 <br /><br />分号已经注释了部分代码段<br />;;;定义堆栈的大小<br />;;;USR_STACK_LEGTH EQU 10<br />;;;SVC_STACK_LEGTH EQU 10<br />;;;FIQ_STACK_LEGTH EQU 10<br />;;;IRQ_STACK_LEGTH EQU 10<br />;;;ABT_STACK_LEGTH EQU 10<br />;;;UND_STACK_LEGTH EQU 10<br /><br /> AREA Example7,CODE,READONLY ; 声明代码段Example7<br /> ENTRY ; 标识程序入口<br /> CODE32 ; 声明32位ARM指令<br />START MOV R0,#0<br /> MOV R1,#1<br /> MOV R2,#2<br /> MOV R3,#3<br /> MOV R4,#4<br /> MOV R5,#5<br /> MOV R6,#6<br /> MOV R7,#7<br /> MOV R8,#8<br /> MOV R9,#9<br /> MOV R10,#10<br /> MOV R11,#11<br /> MOV R12,#12<br /> <br /> BL InitStack ; 初始化各模式下的堆栈指针<br /> <br /> ; 打开IRQ中断 (将CPSR寄存器的I位清零)<br /> MRS R0,CPSR ; R0 <= CPSR<br /> BIC R0,R0,#0x80 <br /> MSR CPSR_cxsf,R0 ; CPSR <= R0<br /> <br /> ; 切换到用户模式<br /> MSR CPSR_c, #0xd0<br /> MRS R0,CPSR<br /> <br /> ; 切换到管理模式<br /> MSR CPSR_c, #0xdf<br /> MRS R0,CPSR <br /><br />HALT B HALT<br /> <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 0x40003040<br />StackSvc DCD 0x4000ff50<br />StackIrq DCD 0x4000ff60<br />StackFiq DCD 0x4000ff70<br />StackAbt DCD 0x4000ff80<br />StackUnd DCD 0x4000ff90<br /><br />;;; 分配堆栈空间 <br />;;; AREA MyStacks, DATA, NOINIT, ALIGN=2<br />;;;UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间<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 ; 未定义模式堆栈
|