函数局部变量如何从堆栈中访问?

从http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

这是调用函数时发生的一系列步骤:

  • 超出函数调用的指令地址被压入堆栈。 这是CPU如何记住函数返回后的位置。
  • 房间在函数返回类型的堆栈上进行。 目前这只是一个占位符。
  • CPU跳转到该函数的代码。
  • 当前的堆栈顶部被保存在一个称为堆栈帧的特殊指针中。
  • 此点之后所有添加到堆栈的内容都被认为是本地的。
  • 所有的函数参数都放在堆栈上。
  • 函数内部的指令开始执行。
  • 局部变量在定义时被压入堆栈。
  • 我不确定第6点如何运作。 如果所有函数参数都放在堆栈上,它们是如何访问的?

    例如,如果有三个参数abc并且从顶部像这样放置在栈上

    | a |
    | b |
    | c |
    |   |
     ...
    |___|
    

    现在当函数想要访问c时会发生什么? ab弹出吗?


    这个堆栈是一个隐喻堆栈 。 请记住, 它仍然是一个RAM ,所以如果你知道你在找什么,你可以访问每个地址而不用弹出其他地址。

    由于自动变量的大小在编译时已知 - 编译器会为每个变量标记offset量,所以偏移量取决于堆栈启动时自动变量部分的位置[或堆栈的头部,两者都是有效的,具体实现取决于可能取决于体系结构],它只通过以下方式访问它们:每个变量的偏移量的start + offset量。


    不,他们不是。 堆栈指针(通常是esp注册表)指向aesp+8h指向besp+16h指向c等等。 有没有必要为a被弹出。

    请注意,这是一个实现细节。 你不应该担心这些。 我给出的数字纯粹是理论上的,在某些体系结构中,递减地址赋予后面的参数,其他参数赋予其他参数。 这不能保证发生。

    编辑:在我看来,这不是一个非常可靠的信息来源。 它提到堆栈和堆,但这些是实现细节,甚至可能不在那里。

    任何通过堆栈实现的标准都没有限制。 例如,我生成了以下代码:

    void foo(int x, int y, int z)
    {
    01241380  push        ebp  
    01241381  mov         ebp,esp 
    01241383  sub         esp,0CCh 
    01241389  push        ebx  
    0124138A  push        esi  
    0124138B  push        edi  
    0124138C  lea         edi,[ebp-0CCh] 
    01241392  mov         ecx,33h 
    01241397  mov         eax,0CCCCCCCCh 
    0124139C  rep stos    dword ptr es:[edi] 
        int c = x;
    0124139E  mov         eax,dword ptr [x] 
    012413A1  mov         dword ptr [c],eax 
        c = y;
    012413A4  mov         eax,dword ptr [y] 
    012413A7  mov         dword ptr [c],eax 
        c = z;
    012413AA  mov         eax,dword ptr [z] 
    012413AD  mov         dword ptr [c],eax 
    }
    012413B0  pop         edi  
    012413B1  pop         esi  
    012413B2  pop         ebx  
    012413B3  mov         esp,ebp 
    012413B5  pop         ebp  
    

    所以你看,那里没有堆栈。 运行时可以直接访问元素: dword ptr [x]等。


    它使用堆栈指针和相对地址来指出c。

    链接地址: http://www.djcxy.com/p/80369.html

    上一篇: How are the function local variables accessed from the stack?

    下一篇: Address of local variable on stack