使用 GCC 将简单的 C 代码编译成程序集将具有以下输出:
...
13 xorl %eax, %eax
14 movl $0, -4(%rbp)
15 movl $5, -8(%rbp)
16 movl $6, -12(%rbp)
17 movl -8(%rbp), %ecx
18 addl -12(%rbp), %ecx
19 movl %ecx, -16(%rbp)
20 popq %rbp
21 retq
我的问题是,为什么要使用偏移量frame base pointer (rbp)
而不是操纵stack pointer (rsp)
. 这不是拥有堆栈指针的全部意义吗?
如果这个进程的堆栈被其他进程(例如垃圾收集)覆盖,甚至不知道堆栈正在被使用,因为rsp
在写入值时不会递减。