为什么局部变量不会改变堆栈指针?

时间:2017-04-15 19:01:36

标签: c++ c assembly x86 x86-64

我使用编译器资源管理器(https://godbolt.org/)和默认编译器设置(x86-64 gcc 6.3)。以下代码

int foo(int num) {
    int a, b, c;
    a = 1;
    b = 2; 
    c = 3;
}

生成程序集

foo(int):
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-20], edi
            mov     DWORD PTR [rbp-4], 1
            mov     DWORD PTR [rbp-8], 2
            mov     DWORD PTR [rbp-12], 3
            nop
            pop     rbp
            ret

似乎永远不会修改堆栈指针寄存器rsp。为什么是这样?我认为局部变量被压入堆栈,随后会修改rsp(例如https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames)。

1 个答案:

答案 0 :(得分:-3)

永远不会将变量推入堆栈,也不会弹出变量。相反,堆栈指针按函数中所有变量的大小递增(或递减,取决于体系结构)(如果需要,按照上面的注释),然后通过索引堆栈指针来访问变量。在函数结束时,堆栈指针递减以恢复其先前的值。