博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数入栈出栈以及栈帧
阅读量:4223 次
发布时间:2019-05-26

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

参考一

函数调用是程序设计中的重要环节,也是程序员应聘时常被问及的,本文就函数调用的过程进行分析。

一、堆和栈

首先要清楚的是程序对内存的使用分为以下几个区:

l         栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。

l         堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。与数据结构中的堆是两码事,分配方式类似于链表。

l         全局区(static):全局变量和静态变量存放在此。

l         文字常量区:常量字符串放在此,程序结束后由系统释放。

l         程序代码区:存放函数体的二进制代码。

典型的内存区域分配如图所示:

 

参考二

首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置

 

入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图

出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图

我们来看下面这个C程序在执行过程中,栈的变化情况

void func(int m, int n) {

    int a, b;

    a = m;

    b = n;

}

main() {

...

    func(m, n);

L:  下一条语句

...

 

在main调用func函数前,栈的情况,也就是说main的栈帧:

从低地址esp到高地址ebp的这块区域,就是当前main函数的栈帧。当main中调用func时,写成汇编大致是:

push m

push n; 两个参数压入栈

call func; 调用func,将返回地址填入栈,并跳转到func

当跳转到了func,来看看func的汇编大致的样子:

__func:

        push ebp; 这个很重要,因为现在到了一个新的函数,也就是说要有自己的栈帧了,那么,必须把上面的函数main的栈帧底部保存起                        ; 来,栈顶是不用保存的,因为上一个栈帧的顶部讲会是func的栈帧底部。(两栈帧相邻的)

        mov ebp, esp; 上一栈帧的顶部,就是这个栈帧的底部

        ;暂时先看现在的栈的情况

                 ;到这里,新的栈帧开始了

                 sub esp, 8   ;  int a, b 这里声明了两个int,所以esp减小8个字节来为a,b分配空间

                 mov dword ptr [esp+4], [ebp+12];   a=m

                 mov dword ptr [esp], [ebp+8]; b=n         

   这样,栈的情况变为:

                    ret 8     ;  返回,然后8是什么意思呢,就是参数占用的字节数,当返回后,esp-8,释放参数m,n的空间

 

由此可见,通过ebp,能够很容易定位到上面的参数。当从func函数返回时,首先esp移动到栈帧底部(即释放局部变量),然后把上一个函数的栈帧底部指针弹出到ebp,再弹出返回地址到cs:ip上,esp继续移动划过参数,这样,ebp,esp就回到了调用函数前的状态,即现在恢复了原来的main的栈帧。

链接:

http://blog.csdn.net/zhongguoren666/article/details/7586074

http://blog.csdn.net/yxysdcl/article/details/5569351

你可能感兴趣的文章
我分析了上万个微信红包数据,得到了这些发现(附数据集)
查看>>
独家 | 手把手教你学习R语言(附资源链接)
查看>>
数据蒋堂 | 倍增分段技术
查看>>
全解卷积神经网络,并分享9篇必读论文
查看>>
从零开始,教你征战Kaggle竞赛
查看>>
一文读懂智能对话系统
查看>>
独家 | 王海峰:百度大数据与人工智能(附PPT下载)
查看>>
一文读懂支持向量积核函数(附公式)
查看>>
教你在Python中用Scikit生成测试数据集(附代码、学习资料)
查看>>
对话 | 薛娅菲:从0到1,行则将至
查看>>
清华大学公管学院、数据科学研究院共同助力国家数据治理,国家数据与治理联盟在京成立
查看>>
独家 | 17篇手把手教技术指南、技术进阶干货大合集
查看>>
独家 | 一文读懂人工神经网络
查看>>
数据院跨学科交叉人才培养走出国门——中德交换生项目首位社科学子赴德国哥廷根大学交流学习
查看>>
福利 | 13篇精选国外资源合集(技术指南、大咖经验、资源分享...)
查看>>
收藏 | Linux常用156个命令汇总!
查看>>
一文助你解决90%的自然语言处理问题(附代码)
查看>>
独家 | 一文读懂人工神经网络学习原理
查看>>
机器学习在热门微博推荐中的应用
查看>>
数据蒋堂 | 文件的性能分析
查看>>