我一直在试图获得的编译器产生怎样的机器代码有更深的了解,更具体如何GCC与堆栈交易。 在这方面,我已经写了简单的C程序,它们编译为装配和尽我所能理解的结果。 这里有一个简单的程序和它的输出:
asmtest.c
:
void main() {
char buffer[5];
}
asmtest.s
:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
leave
ret
什么是令人费解的我就是24个字节被分配为堆栈。 我知道,因为如何在处理器地址内存,堆在4增量分配,但如果是这样的话,我们只能由8个字节,而不是24作为参考,17缓冲区中移动堆栈指针字节产生一个堆栈指针移动40个字节并且没有缓冲在所有移动栈指针8 1首16个字节包括移动之间的缓冲ESP
24字节。
现在假定8个字节是一个必要的常数(它是什么需要?),这意味着我们在16个字节的块正在分配。 为什么编译器是这样排列? 我使用的是x86_64的处理器,但即使是64位字只需要8字节对齐。 为什么不一致?
仅供参考我运行10.5用gcc 4.0.1在Mac上编译这个并启用任何优化。