通过创建局部变量来减少堆栈指针

时间:2013-02-27 12:44:29

标签: c++ pointers gdb stack disassembly

为了更好地理解二进制文件,我准备了一个小的c ++示例,并使用gdb来反汇编并查找机器代码。

main()函数调用函数func()

int func(void)
{
    int a;
    int b;
    int c;
    int d;
    d = 4;
    c = 3;
    b = 2;
    a = 1;
    return 0;
}

项目使用g ++编译,保存调试信息。接下来gdb用于反汇编源代码。我为func()得到的是:

0x00000000004004cc <+0>:    push   %rbp
0x00000000004004cd <+1>:    mov    %rsp,%rbp
0x00000000004004d0 <+4>:    movl   $0x4,-0x10(%rbp)
0x00000000004004d7 <+11>:   movl   $0x3,-0xc(%rbp)
0x00000000004004de <+18>:   movl   $0x2,-0x8(%rbp)
0x00000000004004e5 <+25>:   movl   $0x1,-0x4(%rbp)
0x00000000004004ec <+32>:   mov    $0x0,%eax
0x00000000004004f1 <+37>:   pop    %rbp
0x00000000004004f2 <+38>:   retq

现在我的问题是我希望堆栈指针应移动16个字节到相对于基指针的较低地址,因为每个整数值需要4个字节。但看起来这些值是在没有移动堆栈指针的情况下放在堆栈上的。

我没有正确理解什么?这是编译器的问题还是汇编器省略了一些行?

最好的问候,

1 个答案:

答案 0 :(得分:4)

您的编译器绝对没问题。编译器可以自由选择如何编译代码,并且它选择不修改堆栈指针。由于您的函数不调用任何其他函数,因此无需执行此操作。如果它确实调用了另一个函数,那么它将需要创建另一个堆栈帧,以便被调用者不会踩踏调用者的堆栈帧。

作为一般规则,您应该避免尝试对编译器如何编译代码做出任何假设。例如,你的编译器可以完全放弃你的函数体。