我们知道递归函数在某些条件下会造成内存的溢出,导致程序崩溃,这是为什么呢?函数在内存中的执行过程又是怎么样的呢?看完下面的步骤会给你一个比较清晰的认识:
从汇编的角度看函数的执行过程:
; 函数的调用流程(内存),整个过程在栈中执行
; 1.push 参数(外界传进函数的参数)
; 2.push 函数的返回地址(即函数下一条指令的地址,函数执行完到ret时会pop出来)
; 3.push bp (保留bp之前的值,方便以后恢复,方便跳转回bp在原来函数中的位置,即类似于4步中sp赋值给bp的位置)
; 4.mov bp, sp (保留sp之前的值,方便以后恢复)
; 5.sub sp,空间大小 (分配空间给局部变量)
; 6.保护可能要用到的寄存器
; 7.使用CC(int 3)填充局部变量的空间
; 8.--------执行业务逻辑--------
; 9.恢复寄存器之前的值(没有保护寄存器时则不用)
; 10.mov sp, bp (恢复sp之前的值)
; 11.pop bp (恢复bp之前的值)
; 12.ret (将函数的返回地址出栈,执行下一条指令)
; 13.恢复栈平衡 (add sp,参数所占的空间,如果这步没有执行,那么参数会越来越多,导致栈内存溢出)