汇编三(函数的执行过程)

我们知道递归函数在某些条件下会造成内存的溢出,导致程序崩溃,这是为什么呢?函数在内存中的执行过程又是怎么样的呢?看完下面的步骤会给你一个比较清晰的认识:

从汇编的角度看函数的执行过程:

image.png
; 函数的调用流程(内存),整个过程在栈中执行
; 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,参数所占的空间,如果这步没有执行,那么参数会越来越多,导致栈内存溢出)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容