(gdb) disas /m main
Dump of assembler code for function main():
2 {
0x080483f4 <+0>: push %ebp
0x080483f5 <+1>: mov %esp,%ebp
0x080483f7 <+3>: sub $0x10,%esp
3 int a = 1;
0x080483fa <+6>: movl $0x1,-0x4(%ebp)
4 int b = 10;
0x08048401 <+13>: movl $0xa,-0x8(%ebp)
5 int c;
6 c = a + b;
0x08048408 <+20>: mov -0x8(%ebp),%eax
0x0804840b <+23>: mov -0x4(%ebp),%edx
0x0804840e <+26>: lea (%edx,%eax,1),%eax
0x08048411 <+29>: mov %eax,-0xc(%ebp)
7 return 0;
0x08048414 <+32>: mov $0x0,%eax
8 }
0x08048419 <+37>: leave
通知第3个汇编指令,它分配了16个字节而不是预期的12个字节。这是为什么?我认为第3行是分配自动变量...
即使我删除了分配,分配仍然是16个字节。
感谢。
修改
// no header. nothing
int main()
{
int a = 1;
int b = 10;
int c;
c = a + b;
return 0;
}
g ++ -g -o demo demo.cpp
跟进...... 我在堆栈对齐上读了几个线程(对不起,我现在正在研究计算机拱和组织课......所以我对此并不熟悉)
Stack Allocation Padding and Alignment
我认为这是编译器的设置。所以默认情况下,最小值是16字节。
如果我们有
int a = 1;
int b = 10;
int c = 10;
int d = 10;
// --
int e = 10;
直到int d,我们才会有16个字节,分配仍然是0x10。但是当我们给出另一个选择时,int e = 10,esp现在被分配了32个字节(0x20)。
这表明esp(堆栈指针)仅用于自动变量。
后续行动2
调用堆栈和堆栈帧
每个堆栈框架
Storage space for all the automatic variables for the newly called function. The line number of the calling function to return to when the called function returns. The arguments, or parameters, of the called function.
但是在我们分配int到int d后,它已经花了我们16个字节。 Main没有函数参数,因此为零。但回归的路线,这些信息去了哪里?
答案 0 :(得分:9)
虽然我还没有看到我认为这是由于堆栈对齐造成的。main()
的源代码,
在您的设置下,堆栈可能需要与8个字节对齐。因此esp
增加16个字节而不是12个字节。 (即使12个字节足以容纳所有变量)
在其他系统(使用SSE或AVX)上,堆栈需要与16或32字节对齐。
答案 1 :(得分:0)
没有任何东西 - 为返回代码分配前四个字节:)