C数组的反汇编给出奇怪的结果[重复]

问题描述 投票:2回答:1
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没有?

int square(){char test [50]; }上面的代码产生了square():push rbp mov rbp,rsp当我将代码稍微更改为int square(){char test [150]; } ...

c assembly x86 x86-64 red-zone
1个回答
2
投票

[GCC在变量的堆栈指针下方使用x86-64 System V ABI的128字节Red Zone,仅在不够时才保留一些额外的堆栈空间

对于最后一个示例,使用GCCsubs 512使堆栈(和阵列)保持对齐。

© www.soinside.com 2019 - 2024. All rights reserved.