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