如下代码,如果我不使用space来分配,甚至可以不使用dcd指令,我就直接给那些各种模式下的sp的指针附值,只要自己在程序中控制好,保证不让代码段的指令会到这段地址,是不是就可以了?那些space和dcd,主要是为了程序的
分号已经注释了部分代码段 ;;;定义堆栈的大小 ;;;USR_STACK_LEGTH EQU 10 ;;;SVC_STACK_LEGTH EQU 10 ;;;FIQ_STACK_LEGTH EQU 10 ;;;IRQ_STACK_LEGTH EQU 10 ;;;ABT_STACK_LEGTH EQU 10 ;;;UND_STACK_LEGTH EQU 10
AREA Example7,CODE,READONLY ; 声明代码段Example7 ENTRY ; 标识程序入口 CODE32 ; 声明32位ARM指令 START MOV R0,#0 MOV R1,#1 MOV R2,#2 MOV R3,#3 MOV R4,#4 MOV R5,#5 MOV R6,#6 MOV R7,#7 MOV R8,#8 MOV R9,#9 MOV R10,#10 MOV R11,#11 MOV R12,#12 BL InitStack ; 初始化各模式下的堆栈指针 ; 打开IRQ中断 (将CPSR寄存器的I位清零) MRS R0,CPSR ; R0 <= CPSR BIC R0,R0,#0x80 MSR CPSR_cxsf,R0 ; CPSR <= R0 ; 切换到用户模式 MSR CPSR_c, #0xd0 MRS R0,CPSR ; 切换到管理模式 MSR CPSR_c, #0xdf MRS R0,CPSR
HALT B HALT ; 名称:InitStack ; 功能:堆栈初始化,即初始化各模式下的堆栈指针。 ; 入口参数:无 ; 出口参数:无 ; 说明:在特权模式下调用此子程序,比如复位后的管理模式 InitStack MOV R0, LR ; R0 <= LR,因为各种模式下R0是相同的
;设置管理模式堆栈 MSR CPSR_c, #0xd3 LDR SP, StackSvc ;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq ;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq ;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt ;设置未定义模式堆栈 MSR CPSR_c, #0xdb LDR SP, StackUnd ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, StackUsr
MOV PC, R0
StackUsr DCD 0x40003040 StackSvc DCD 0x4000ff50 StackIrq DCD 0x4000ff60 StackFiq DCD 0x4000ff70 StackAbt DCD 0x4000ff80 StackUnd DCD 0x4000ff90
;;; 分配堆栈空间 ;;; AREA MyStacks, DATA, NOINIT, ALIGN=2 ;;;UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间 ;;;SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ; 管理模式堆栈空间 ;;;IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中断模式堆栈空间 ;;;FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中断模式堆栈空间 ;;;AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ; 中止义模式堆栈空间 ;;;UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定义模式堆栈 |