linux - 为什么 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

标签 linux gcc assembly stack

作为asm的初学者,我正在查看gcc -S生成的asm代码来学习。

为什么gcc 4.x在调用方法时默认为堆栈保留8个字节?

func18 是空函数,没有返回值,没有参数,没有定义局部变量。 我不明白为什么这里保留 8 个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的) 是为了 %ebp 只是推送吗?或返回类型?!非常感谢!

      .globl _func18
  _func18:
     pushl   %ebp 
     movl    %esp, %ebp 
     subl    $8, %esp 
     .text 

最佳答案

一些指令要求某些数据类型与 16 字节边界对齐(特别是 SSE 数据类型 __m128)。为了满足这个要求,gcc 确保堆栈最初是 16 字节对齐的,并以 16 字节的倍数分配堆栈空间。如果只需要压入 4 字节的返回地址和 4 字节的帧指针,则需要 8 个额外的字节来保持堆栈与 16 字节的边界对齐。然而,如果 gcc 确定额外的对齐是不必要的(即没有使用花哨的数据类型并且没有调用外部函数),那么它可能会省略任何用于对齐堆栈的额外指令。确定这一点所需的分析可能需要执行某些优化过程。

另请参阅选项的 gcc 文档 -mpreferred-stack-boundary=num .

关于linux - 为什么 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2399072/

相关文章:

c++ - 零大小结构

assembly - 在没有AVX2的情况下,如何使用字节中的位设置ymm寄存器中的双字? (vmovmskps的倒数)

c++ - 在 GCC 中使用 -O3 有什么缺点吗?

c - 汇编代码 : logic behind calculating offset into stack

linux - 从 x86 asm 访问 linux 中的命令行参数的问题

assembly - 汇编函数中的错误返回 (x86)

linux - DOCKER_OPTS 在系统重启后重置

linux - 将文件从一个位置复制到另一位置

php - 开箱即用的 php 目录结构组件

linux - 为什么在 Linux shell 脚本中使用 % 不起作用?