今天一大早就有个师弟在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}
这句才放了五个寄存器而已. 也就是说,一般情况下,都是够用的,不用担心溢出的问题.
一家之言, 欢迎拍砖.