gpt4 book ai didi

c - 局部变量如何入栈

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:41 30 4
gpt4 key购买 nike

对于程序来说,局部变量是在堆栈中定义和分配的,但是,我只是想知道局部变量定义的顺序和使用它的顺序不一样。比如在main函数中定义了int a b c,如前所述,a b c分配在栈中,也就是说如果变量a位于栈底,但是当变量被最先使用时,如何将a从栈中pop出来呢?还是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 + 55 然后 a = a + 10 没有压入或弹出操作,只是直接访问位置,使用 add DWORD PTR [rbp-12], 55add DWORD PTR [rbp-4], 10 分别。编译器将知道这些变量在堆栈帧中的位置。

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

关于c - 局部变量如何入栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50524734/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com