Stack就像一个桶,我们往桶里面放东西时,也是一个一个往上叠,桶的最上方永远是最新放入的东西,要取出里面的东西必须从最顶端的开始取。因此,堆栈被称为是后进先出(last-in-first-out,LIFO)的数据结构。
函数的调用正好复合这种LIFO的特性,不管函数如何嵌套调用,每个函数最终都必须八控制权返回给调用它的函数。
每当函数调用另一个函数时,一个数据项(栈帧-stack frame)就会被压入到堆栈中。这个对战包含了被调用函数返回到其调用者所需要的返回地址,然后包含了函数的各个参数。
函数执行完毕,根据stack frame中的数据返回到调用者的地址,斌且不再需要函数局部变量的内存,因此堆栈弹出,返回调用者的地址并丢弃局部变量。
下面引用一下一位道友的结论和图:
- 参数压栈传递,并且是从右向左依次压栈。注意静态变量是不入栈的。
- ebp总是指向当前栈帧的栈底。
- 返回值通过eax寄存器传递。
Reference:
函数调用栈 剖析+图解