博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈溢出利用
阅读量:4992 次
发布时间:2019-06-12

本文共 796 字,大约阅读时间需要 2 分钟。

函数调用时发生了什么 :

系统在调用函数时,会为它开辟一个新的栈侦,并把新的栈侦压入系统栈中,这个新的栈侦中的内存空间会被它所属的函数独占!

例如:

(1) main() 函数在调用函数 A() 时,首先在自己的栈侦中压入函数返回地址,然后为函数 A() 创建新的栈侦并压入系统栈

(2) 函数 A() 执行完返回时,函数 A() 的栈侦会被弹出系统栈 , main() 函数栈侦中的返回地址会被 "披露" 在栈顶,此时处理器按照这个返回地址跳转到 main 函数代码区执行

寄存器和函数栈侦 :

正在运行的函数栈侦总是在系统栈的栈顶

ESP : 栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈侦的栈顶

EBP : 栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈侦的栈底

EIP : 指令寄存器 , 其内存放着一个指针, 该指针永远指向下一条等待执行的指令地址

函数栈侦 : ESP 和 EBP 之间的内存空间为当前函数栈侦

函数栈侦中包含的信息 如下

(1) 局部变量 : 为函数局部变量开辟的内存空间

(2) 栈侦状态值 : 保存前栈侦的顶部和底部,用于在本栈被弹出后恢复出上一个栈侦

(3) 函数返回地址 : 保存当前函数调用前的 "断点" 信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行命令

函数调用大致几个步骤 :

(1) 参数入栈 : 将参数从右向左依次压入系统堆栈

(2) 返回地址入栈 : 将当前代码区调用指令的下一条指令地址压入栈中 , 供函数返回时继续执行

(3) 代码区跳转 : 处理器从当前代码区跳转到被调用函数的入口处

(4) 栈侦调整 :

转载于:https://www.cnblogs.com/duogemajia/archive/2012/02/20/2359163.html

你可能感兴趣的文章
ZeptoLab Code Rush 2015 B. Om Nom and Dark Park
查看>>
ctci1.2
查看>>
[译]RabbitMQ教程C#版 - 路由
查看>>
升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
查看>>
调用API函数减少c#内存占用(20+m减至1m以下)
查看>>
Android:onNewIntent()触发机制及注意事项
查看>>
珠宝公司之感想
查看>>
项目问题
查看>>
scss侦听并压缩
查看>>
我有接口文档, 你有酒吗?
查看>>
iOS - Push 通知推送
查看>>
[FJOI2007]轮状病毒
查看>>
Azure AADSTS7000215 其中一种问题的解决
查看>>
关于吃苦
查看>>
uva 1629切蛋糕(dp)
查看>>
生成awr报告
查看>>
cocos2d-x 3.0rc2 对于每个包执行情况的重要平台 (超级方便)
查看>>
Android 深入解析光传感器(二)
查看>>
Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
查看>>
【bzoj4552/Tjoi2016&Heoi2016】排序——二分+线段树/平衡树+线段树分裂与合并
查看>>