Hi,欢迎来到嵌入式培训高端品牌 - 华清远见教育科技集团<北京总部官网>,专注嵌入式工程师培养15年!
当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 用汇编语言申请栈空间
用汇编语言申请栈空间
时间:2017-01-05作者:华清远见

在C程序运行以前要设置好栈空间,在嵌入式ARM系统中,ARM 的启动代码可以实现此类功能,

etup Stack for each mode
                                LDR        R0, =Stack_Top
        ; Enter Undefined Instruction Mode and set its Stack Pointer
                                MSR         CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                                MOV          SP, R0
                                SUB          R0, R0, #UND_Stack_Size
        ; Enter Abort Mode and set its Stack Pointer
                                MSR        CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                                MOV        SP, R0
                                SUB         R0, R0, #ABT_Stack_Size
        ; Enter FIQ Mode and set its Stack Pointer
                                MSR         CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                                MOV        SP, R0
                                SUB        R0, R0, #FIQ_Stack_Size
        ; Enter IRQ Mode and set its Stack Pointer
                                MSR        CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                                MOV        SP, R0
                                SUB        R0, R0, #IRQ_Stack_Size
        ; Enter Supervisor Mode and set its Stack Pointer
                                MSR         CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                                MOV        SP, R0
                                SUB        R0, R0, #SVC_Stack_Size
        ; Enter User Mode and set its Stack Pointer
                                MSR         CPSR_c, #Mode_USR

以上是MDK的startup.s文件对各种处理器模式栈空间的设置,但是在多进程编程时我们希望栈空间的设置更灵活,我们可以使用几条伪指令来实现栈空间的申请,

AREA |subr|, CODE, READONLY

;软件中断

SoftwareInterrupt
        LDR SP, StackSvc ; 重新设置堆栈指针
        STMFD SP!, {R0-R3, R12, LR}
        StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)

在地址StackSvc的空间(SvcStackSpace + SVC_STACK_LEGTH * 4 - 4),这个值正好是下面用SPACE 申请的空间的高地址,ATPCS标准ARM采用FD栈,所以要去栈空间的高地址;

        AREA SWIStacks, DATA, NOINIT,ALIGN=2
        SvcStackSpace SPACE SVC_STACK_LEGTH * 4

使用SPACE 申请以SvcStackSpace标号为起始地址,空间为SVC_STACK_LEGTH * 4大小的空间。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)