小编Nik*_*Nik的帖子

System V ABI - AMD64 - GCC 发出的程序集中的堆栈对齐

对于下面的 C 代码,来自Compiler Explorer 的GCC x86-64 10.2发出我在下面进一步粘贴的程序集。

一个指令是subq $40, %rsp。问题是,为什么减去 40 个字节%rsp不会使堆栈未对齐?我的理解是:

  • 就在 之前call foo,堆栈是 16 字节对齐的;
  • call foo 在堆栈上放置一个 8 字节的返回地址,因此堆栈未对齐;
  • 但是pushq %rbpatfoo的 start 在堆栈上又放置了 8 个字节,因此它再次对齐了 16 个字节;
  • 所以堆栈是 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)

assembly stack x86-64 calling-convention memory-alignment

4
推荐指数
1
解决办法
236
查看次数