ARM 堆栈溢出问题

今天一大早就有个师弟在QQ上问了我一个问题, 先把代码贴出来.

SoftwareInterrupt

。。。。。
                STMFD   SP!, {R0-R3, R12, LR}
        MOV     R1, SP                      

        MRS     R3, SPSR
        TST     R3, #T_bit                  ; THUMB mode ?
        LDRNEH  R0, [LR,#-2]                ; yes, fetch SWI NO. in THUMB mode
        BICNE   R0, R0, #0xff00
        LDREQ   R0, [LR,#-4]                ; no, fetch SWI NO. in ARM mode
        BICEQ   R0, R0, #0xFF000000
                                            
        CMP     R0, #1
        LDRLO   PC, =OSIntCtxSw
        LDREQ   PC, =__OSStartHighRdy       

        BL      SWI_Exception
        
        LDMFD   SP!, {R0-R3, R12, PC}^


这是SWI的第一级中断处理代码. 程序很好理解,就不解释了. 师弟问的这个问题, 倒是这以前没有想过的.

问题是这样的:

STMFD   SP!, {R0-R3, R12, LR}

他的问题是,如果SP指向的堆栈空间不够大,溢出怎么办?

 

先来看看SP指向了哪里. 因为这是SWI的中断处理代码, 所自然进入的是管理模式. 一般在启动代码里会有各个模式下的堆栈的定义和初始化代码.所以我们应该会找到类似下面的代码.

SVC_STACK_LEGTH         EQU         128
StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4
LDR     SP, StackSvc


理解了上面四行语句, 再加上你知道ARM的堆栈是满递减的. 上面的128就够你放30多个寄存器了(每一个寄存器是4个字节)

STMFD   SP!, {R0-R3, R12, LR}

这句才放了五个寄存器而已. 也就是说,一般情况下,都是够用的,不用担心溢出的问题.

 

一家之言, 欢迎拍砖.

 

你可能感兴趣的:(ARM 堆栈溢出问题)