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

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

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

#介绍三个重要的寄存器

  1. EIP:用来存储即将执行的程序指令的地址。cpu 依照 eip 的存储内容读取指令并执行,eip 随之指向相邻的下一条指令
  2. EBP: 即MIPS中的fp,用来存储当前函数状态的基地址
  3. ESP: 即MIPS中的sp, 用来存储函数调用栈的栈顶地址,在压栈和出栈时发生变化
    #栈帧的样子
    原创栈帧的样子
    #栈帧的内部啥样子
    原创 栈帧内部的样子
    ###如果我在fun1中调用fun2
    原创 栈
    ###脑补一下大概就出来栈的调用过程了
  4. 首先是读到子函数时,将ESP减小,将子函数下方的语句的地址入栈。
  5. 将栈基(ebp)的地址入栈,并将此时ESP的值赋给EBP,ESP减小。
  6. 将子函数中的局部变量入栈。
  7. 子函数执行到return指令,则将ESP增大,将局部变量等出栈。
  8. 读到之前保存的EBP的值,将值赋给EBP。
  9. 将之前保存的返回地址赋给EIP,使得指令从函数调用的下一条语句继续执行。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值