2
int square() {
    char test[50];
}

上面的代码产生

square():
        push    rbp
        mov     rbp, rsp

当我将代码更改为

int square() {
    char test[150];
}

生成的程序集是

square():
        push    rbp
        mov     rbp, rsp
        sub     rsp, 40

这仍然很奇怪,因为我不明白为什么它不分配给以前的创作。我在 -O0 运行,所以 gcc 不会优化它。为什么 gcc 为错误大小的数组创建代码?

int square() {
    char a[50];
    char b[50];
}
square():
        push    rbp
        mov     rbp, rsp
        sub     rsp, 8

对于 x86 也是如此

int square() {
    char a[500];
}

用 -m32 编译给了我:

square():
        push    ebp
        mov     ebp, esp
        sub     esp, 512

这额外的 12 个字节来自哪里?为什么 -m32 有 char test[50] 的子指令而 x86_64 没有?

4

1 回答 1

3

GCC 使用 x86-64 System V ABI 在堆栈指针下方的 128 字节红色区域用于变量,仅在不够时保留一些额外的堆栈空间

对于最后一个示例, GCCsub保持512堆栈(和数组)对齐。

i386 System V ABI 没有红色区域,因此它必须为整个阵列保留空间(Windows x64 也没有)。

于 2020-02-19T15:34:32.513 回答