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}

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

 

一家之言, 欢迎拍砖.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值