栈实现过程调用 以及栈溢出的原因和影响(未完待续)

栈的定义

1.它是一种运算受限的线性表。
2.其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶。
相对地,把另一端称为栈底。
3.向一个栈插入新元素又称作进栈、入栈或压栈,从一个栈删除元素又称作出栈或退栈

程序中的栈–函数调用栈

  1. 函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等
  2. 函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。

介绍三个重要的寄存器

  1. EIP:用来存储即将执行的程序指令的地址。cpu 依照 eip 的存储内容读取指令并执行,eip 随之指向相邻的下一条指令
  2. EBP: 即MIPS中的fp,用来存储当前函数状态的基地址
  3. ESP: 即MIPS中的sp, 用来存储函数调用栈的栈顶地址,在压栈和出栈时发生变化

栈帧的样子

栈实现过程调用 以及栈溢出的原因和影响(未完待续)

栈帧的内部啥样子

栈实现过程调用 以及栈溢出的原因和影响(未完待续)

如果我在fun1中调用fun2

栈实现过程调用 以及栈溢出的原因和影响(未完待续)

脑补一下大概就出来栈的调用过程了

  1. 首先是读到子函数时,将ESP减小,将子函数下方的语句的地址入栈。
  2. 将栈基(ebp)的地址入栈,并将此时ESP的值赋给EBP,ESP减小。
  3. 将子函数中的局部变量入栈。
  4. ….
  5. 子函数执行到return指令,则将ESP增大,将局部变量等出栈。
  6. 读到之前保存的EBP的值,将值赋给EBP。
  7. 将之前保存的返回地址赋给EIP,使得指令从函数调用的下一条语句继续执行。