栈实现过程调用 以及栈溢出的原因和影响(未完待续)
栈的定义
1.它是一种运算受限的线性表。
2.其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶。
相对地,把另一端称为栈底。
3.向一个栈插入新元素又称作进栈、入栈或压栈,从一个栈删除元素又称作出栈或退栈
程序中的栈–函数调用栈
- 函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等
- 函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。
介绍三个重要的寄存器
- EIP:用来存储即将执行的程序指令的地址。cpu 依照 eip 的存储内容读取指令并执行,eip 随之指向相邻的下一条指令
- EBP: 即MIPS中的fp,用来存储当前函数状态的基地址
- ESP: 即MIPS中的sp, 用来存储函数调用栈的栈顶地址,在压栈和出栈时发生变化
栈帧的样子
栈帧的内部啥样子
如果我在fun1中调用fun2
脑补一下大概就出来栈的调用过程了
- 首先是读到子函数时,将ESP减小,将子函数下方的语句的地址入栈。
- 将栈基(ebp)的地址入栈,并将此时ESP的值赋给EBP,ESP减小。
- 将子函数中的局部变量入栈。
- ….
- 子函数执行到return指令,则将ESP增大,将局部变量等出栈。
- 读到之前保存的EBP的值,将值赋给EBP。
- 将之前保存的返回地址赋给EIP,使得指令从函数调用的下一条语句继续执行。