栈帧的基本概念和函数调用约定
前言
本文将介绍栈帧的基本概念以及对函数调用约定进行总结。
一、栈帧的基本概念
1.函数调用时需要内存。为啥需要内存?
-
函数的调用方需要给被调用函数传递参数,这些参数需要找个地方存放;
-
函数在执行过程中,会需要临时的存储空间,例如函数内部会定义一些局部变量。
回答完上述问题后,就引出了栈帧这个概念。栈帧就是为了程序员不用操心自己亲手去设计 函数参数和局部变量进行分配和释放内存的过程 。(这一过程对程序员透明)
接下来是调用一个函数时的详细操作步骤。
- 调用方将被调用函数需要的参数放入到指定的位置。(谁指定的? 答: 由函数调用约定来指定这些位置)
- 调用方将程序的控制权交给被调用的函数,(call指令或者MIPS中的 JAl指令执行交接权力这一过程。)然后返回地址会保存在程序栈或者寄存器中。
- 如有必要,被调用的函数会配置一个栈指针,并保存调用方希望保持不变的任何寄存器值。
- 被调用函数为其内部的局部变量分配空间,通常是通过调整栈指针来在运行时栈上开辟空间来实现。
- 被调用函数来实现他的功能,并可能产生一个结果,这个结果通常会被放到一个特定的寄存器中(例如EAX),或者是在函数返回后调用方可以立即访问的寄存器。
- 释放为局部变量开辟的栈空间。
- 恢复第(3)步中调用方希望保持不变的寄存器的值,其中包括调用方的帧指针寄存器。
- 将控制权交给调用方。(使用RET指令或者MIPS中的JR指令,这一过程中根据函数调用约定,会从程序栈中删除若干参数)
- 调用方获得控制权后,可能需要阐述栈中的参数,这是可能需要对栈进行调整,将栈指针恢复到第一步以前的值。
二、函数调用约定总结
1.函数调用约定
调