我使用编译器资源管理器(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)。
答案 0 :(得分:-3)
永远不会将变量推入堆栈,也不会弹出变量。相反,堆栈指针按函数中所有变量的大小递增(或递减,取决于体系结构)(如果需要,按照上面的注释),然后通过索引堆栈指针来访问变量。在函数结束时,堆栈指针递减以恢复其先前的值。