栈是包含数据的一块连续内存区域,SP(stack pointer)指向栈的顶部,栈的底部是一个确定后不可更改的地址,栈的大小在运行时被kernel动态调整,栈的POP和PUSH操作由CPU实现。
当调用一个函数的时候,一个逻辑栈帧(logical stack frame)被构造,函数退出时,这个逻辑栈帧就释放。一个逻辑栈帧包含指向函数的指针,包括函数里的局部变量,和可以恢复到上一个栈帧的数据等。
如果我们除了SP之外还有一个指向当前栈帧固定位置的指针,会使得很多操作变得方便,所以引入了FP(frame pointer)或者称作LB(local base pointer)。如果假设当前系统中栈是从高处往低处增长的,那么函数的参数在FP的正偏移处,函数里面的局部变量在FP的负偏移处。
当一个函数被调用的时候,它要做的第一件事情是:储存前一个FP。因为这样一来,可以在函数退出的时候将FP的值恢复。