对于下面的 C 代码,来自Compiler Explorer 的GCC x86-64 10.2发出我在下面进一步粘贴的程序集。
一个指令是subq $40, %rsp。问题是,为什么减去 40 个字节%rsp不会使堆栈未对齐?我的理解是:
call foo,堆栈是 16 字节对齐的;call foo 在堆栈上放置一个 8 字节的返回地址,因此堆栈未对齐;pushq %rbpatfoo的 start 在堆栈上又放置了 8 个字节,因此它再次对齐了 16 个字节;subq $40, %rsp。结果,减少%rsp40个字节一定会破坏对齐吗?显然,就保持堆栈对齐而言,GCC 发出了有效的程序集,所以我一定遗漏了一些东西。
(我尝试用 CLANG 替换 GCC,并且 CLANG 发出了subq $48, %rsp- 正如我直觉所期望的那样。)
那么,我在 GCC 生成的程序集中缺少什么?它如何保持堆栈 16 字节对齐?
int bar(int i) { return i; }
int foo(int p0, int …Run Code Online (Sandbox Code Playgroud)