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没有?
GCC使用x86-64 System V ABI的堆栈指针下方的128字节红色区域作为变量,仅在不够时才保留一些额外的堆栈空间
对于最后一个例子,GCC sub
š512
保持对准堆栈(和阵列)。
i386 System V ABI没有红色区域,因此它必须为整个阵列保留空间(Windows x64也不是)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句