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

Decreasing of the stack pointer by creating local variables

本文关键字:堆栈 栈指针 局部变量 创建      更新时间:2023-10-16

为了更好地理解二进制文件,我准备了一个小的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个字节。但是看起来这些值是在没有移动堆栈指针的情况下被放到堆栈上的。

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


最诚挚的问候,零

你的编译器绝对没有问题。编译器可以自由选择如何编译代码,它选择不修改堆栈指针。它不需要这样做,因为您的函数不调用任何其他函数。如果它确实调用了另一个函数,那么它将需要创建另一个堆栈帧,以便被调用方不会踩到调用方的堆栈帧。

作为一般规则,您应该避免尝试对编译器将如何编译您的代码做出任何假设。例如,编译器可以完全自由地优化掉函数体。