局部变量如何存储在堆栈中 [英] How the local variable stored in stack

查看:4
本文介绍了局部变量如何存储在堆栈中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于程序来说,局部变量是在堆栈中定义和分配的,但我只是想知道定义局部变量的顺序与使用它的顺序不同。 例如,在main函数中,定义了int a b c,如上所述,a b c被分配到堆栈中,这意味着如果变量a位于堆栈的底部,但当首先使用变量时,如何从堆栈中弹出a? 或eBP指向已存储所有变量的位置?

推荐答案

基本上在函数中,局部变量存储在堆栈帧中。在堆栈框架内,变量的访问顺序可以是随机的。我推荐阅读这篇文章:http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch10s07.html

考虑以下代码

int main (void)
{
  int a = 1, b = 2, c = 3;

  c = c + 55;
  a = a + 10;

  return 0;
}

编译器可以生成以下代码

main:
.LFB0:
        .cfi_startproc
        push    rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        mov     rbp, rsp
        .cfi_def_cfa_register 6
        mov     DWORD PTR [rbp-4], 1
        mov     DWORD PTR [rbp-8], 2
        mov     DWORD PTR [rbp-12], 3
        add     DWORD PTR [rbp-12], 55
        add     DWORD PTR [rbp-4], 10
        mov     eax, 0
        pop     rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
请注意,变量abc存储在rbp-4rbp-8rbp-12位置,因此每个变量都有4个字节(在我的系统中)。它是负数,因为堆栈向下增长,并且此函数的堆栈帧的开始由rbp的内容指示。

接下来,请注意,第一个c = c + 55a = a + 10没有推送或弹出操作,只是分别使用add DWORD PTR [rbp-12], 55add DWORD PTR [rbp-4], 10直接访问位置。编译器将知道这些变量在堆栈帧中的位置。

注意声明和访问变量之前的push rbp。该操作将rbp(基指针,64位)的当前值存储在堆栈帧上。接下来,更新rbp以获得指示此函数的限制的新值。现在,在此限制范围内,可以存储所有局部变量。还要注意返回前的pop rbp。这将从之前存储的堆栈帧恢复rbp的旧值,以便在ret之后,它可以返回到旧状态。

这篇关于局部变量如何存储在堆栈中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆