• 栈帧


    一、栈帧

      栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

      从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。 实现上有硬件方式和软件方式(有些体系不支持硬件栈) 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。 注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。

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

      首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器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;
    }
    
    void 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的栈帧。

  • 相关阅读:
    python3全栈开发-并发编程的多进程理论
    python3全栈开发-补充UDP的套接字、操作系统、并发的理论基础
    python3全栈开发-什么是粘包、粘包现象、如何解决粘包
    python3全栈开发-socket编程
    python3全栈开发- 元类metaclass(面试必考题)
    浏览器窗口
    SQL 笔记
    数据库连接字符串
    获取网卡地址信息
    启动所选择的应用程序
  • 原文地址:https://www.cnblogs.com/ztteng/p/3415793.html
Copyright © 2020-2023  润新知