gpt4 book ai didi

assembly - 为什么编译器保留一点堆栈空间而不是整个数组大小?

转载 作者:太空宇宙 更新时间:2023-11-04 04:12:59 25 4
gpt4 key购买 nike

下面的代码

int main() {
int arr[120];
return arr[0];
}

编译成这样:

  sub     rsp, 360
mov eax, DWORD PTR [rsp-480]
add rsp, 360
ret

知道整数是 4 个字节,数组的大小是 120,数组应该占用 480 个字节,但从 ESP 中只减去 360 个字节...这是为什么?

最佳答案

在函数使用的栈区下面,有一个128-byte red zone。保留供程序使用。因为 main 没有调用其他函数,所以它不需要将堆栈指针移动超过它需要的位置,尽管在这种情况下这无关紧要。它只会从 rsp 中减去足够的内容,以确保数组受到红色区域的保护。

您可以通过向 main 添加函数调用来查看差异

int test() {
int arr[120];
return arr[0]+arr[119];
}

int main() {
int arr[120];
test();
return arr[0]+arr[119];
}

This gives :

test:
push rbp
mov rbp, rsp
sub rsp, 360
mov edx, DWORD PTR [rbp-480]
mov eax, DWORD PTR [rbp-4]
add eax, edx
leave
ret
main:
push rbp
mov rbp, rsp
sub rsp, 480
mov eax, 0
call test
mov edx, DWORD PTR [rbp-480]
mov eax, DWORD PTR [rbp-4]
add eax, edx
leave
ret

您可以看到 main 函数减去 480,因为它需要数组在其堆栈空间中,但 test 不需要,因为它不调用任何函数。

数组元素的额外使用不会显着改变输出,但添加它是为了清楚表明它并不是假装这些元素不存在。

关于assembly - 为什么编译器保留一点堆栈空间而不是整个数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207928/

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