为什么我的编译器保留的空间多于函数堆栈帧所需的空间?

2023-11-22

我有一个功能:

void func(int a)
{
    int x = a+2;
}

在汇编代码中,在函数序言中:

push %ebp
mov %esp, %ebp
sub $0x10, %esp

代码只需要为x预留空间,即4个字节。但它保留了 16 个字节。这是为什么 ?我总是看到它预留的空间超过了所需的空间。

我的猜测:它往往存储在 16 个字节中。也就是说,如果我需要 20 个字节,无论如何它都会保留 32 个字节。


这在很大程度上取决于您的体系结构和编译器标志,因此不可能在这里指出单个事物并说“这一定是它”。不过,我可以给您一些可能会有所帮助的建议。

首先,考虑堆栈边界。您可能听说过 GCC 的 -mpreferred-stack-boundary=X 标志。如果不是,它基本上告诉编译器更喜欢堆栈上的值每个为 2^X 字节。然后,您的编译器将尝试优化您的程序,以便这些值尽可能适合堆栈。另一方面,GCC 修饰符(例如 __packed__)将使编译器尝试尽可能紧密地适应堆栈中的数据。

还有堆栈保护器。基本上,GCC 在堆栈上放置虚拟值,以确保缓冲区溢出除了导致程序出现段错误之外不会造成任何损害(这并不有趣,但比攻击者控制指令指针要好)。您可以轻松地尝试一下:使用任何最新版本的 GCC 并让用户溢出缓冲区。您会注意到程序退出时会显示一条消息“检测到堆栈粉碎,已终止”。尝试使用 -fno-stack-protector 编译程序,堆栈上分配的本地内存可能会更小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的编译器保留的空间多于函数堆栈帧所需的空间? 的相关文章

  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • 保存和恢复陷阱状态?管理多个陷阱处理程序的简单方法?

    有什么好的方法可以覆盖bash陷阱处理程序不会永久破坏可能已设置或尚未设置的现有处理程序 动态管理任意陷阱例程链怎么样 有没有办法保存陷阱处理程序的当前状态 以便以后可以恢复 在 Bash 中保存和恢复陷阱处理程序状态 我将提交以下堆栈实现
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101

随机推荐

  • 为什么 Java 和 C# 有位移运算符?

    整数乘法 暂时忘记除法 之间的差异是否仍然有利于移位 如果是的话 差异有多大 它看起来只是一个低级优化 即使您想要它 在大多数情况下 C Java 字节码编译器或 jit 不应该捕获它吗 注意 我测试了 C 的编译输出 使用 gmcs Mo
  • 设置 UITextField 的最大字符长度

    如何设置一个文件的最大字符数UITextField当我加载一个iPhone SDK时UIView 虽然UITextField类没有最大长度属性 通过设置文本字段的值来获得此功能相对简单delegate并实现以下委托方法 Objective
  • 在运行时,如何测试属性是否是只读的?

    我正在自动生成代码 根据配置 文本框 dateTimePickers 等 创建 winform 对话框 这些对话框上的控件是从保存的数据集填充的 需要设置和获取各种控制对象 自定义或其他 的属性 Upon opening of form p
  • x86 CPU 有多少条内存屏障指令?

    我发现 x86 CPU 有以下内存屏障指令 mfence lfence and sfence x86 CPU 是否只有这三个内存屏障指令 还是还有更多 sfence 上交所1 和mfence lfence SSE2 是唯一以其内存栅栏 屏障
  • Oracle 基于列值的唯一约束

    我有以下独特的约束 dup Checklist QNum UNIQUE QUESTION NO IS ACTIVE 我试图防止两个问题在活动状态下具有相同的问题编号 IS ACTIVE 值 1 一切看起来都很好 直到我不得不第二次回答一个问
  • 如何持续通知用户 Perl CGI 脚本的进度?

    我的 Apache 服务器的 cgi bin 文件夹中有这个 Perl 脚本 usr bin perl use strict use warnings 1 print Content type text html r n r n print
  • GitHub 操作发布标签

    在 GitHub 中创建发布后 我会触发 GitHub 操作 在此操作中 我想从发布中获取一些数据 这可能吗 例如 我想获取标签 然后使用这个标签作为NuGet包版本 有没有办法从工作中获取这些数据 您可以使用 github ref or
  • 如何获取从 iPhone 的照片库中选取的图像的名称?

    我正在从 iphone 应用程序的照片库中挑选一张图像 我将如何检索实际的图像名称 在 h类中 UIImageView imageView UIButton choosePhotoBtn 在 m 级 IBAction getPhoto id
  • 使用 Java 的递归表达式计算器

    我将编写一个仅执行加法和减法的表达式计算器 我有一个简单的算法可以做到这一点 但是 我有一些实施问题 我将表达式视为 它是一个字符串
  • Google Analytics API 创建新属性

    我遇到的问题是 当我尝试使用 Google Analytics Api 插入新的网络属性时 出现错误 reason 权限不足 message 您的项目无权访问此功能 即使我使用该页面时也是如此 https developers google
  • BufferedImage getRGB 与 Raster getSample

    我正在尝试用 Java 进行一些图像处理 我使用 ImageIO 库来读取和写入图像 我可以通过以下两种方式读取图像像素值 可能还有其他方法不知道 使用 BufferedImage 的 getRGB 方法 像素 image getRGB x
  • “BindingSource 不能是其自己的数据源” - 尝试从另一个类中的方法重置绑定源时出错

    我们正在绑定一个DataGridview using BindingSource 所以在主线程中我们是这样给出的 class1BindingSource new BindingSource class1BindingSource DataS
  • 替代用户在 django admin 中选择界面以减少大型网站的页面大小?

    我有一个基于 Django 的网站 包含大约 300 000 个 User 对象 具有外键字段的对象的管理页面用户需要very加载时间较长 因为生成的表单大小约为 6MB 当然 生成的下拉菜单也不是特别有用 有没有现成的替代品可以处理这种情
  • 禁用水平滚动[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 好吧 由于某种原因 我的网页从左向右滚动并显示出很多难看的空间 我已经搜索了结果 但他们只是制作了滚动条HIDDEN 这就是我现在想要的 我想要身体上的DISABLE水平滚动功能 我不希望
  • 在 HTML 中嵌入 SVG 中嵌入 HTML?

    允许在 HTML 中嵌入 SVG
  • 为什么我们不将 C++ main 方法放在一个类中呢?

    在 C 中 为什么我们不将 main 方法放在类中 如 Java 为什么这样做没有意义 我认为 We can main不是保留字 但根据语言标准 C 工具链期望程序的入口点是main在全球范围内 所以main类内部不会被识别为程序的入口点
  • 为什么 Scala 的 Future 没有 .get / get(maxDuration) 方法,迫使我们求助于 Await.result() 呢?

    解耦有什么特别的好处吗 get方法从Future类 我希望它驻留在其中 并强制编码器必须了解这个名为的外部两种方法类Await 解耦有什么特别的好处吗 get方法从Future class 是的 让开发商很难做错误的事情 A Future表
  • 在 Web 部署之外应用 Web.Config 转换

    有没有办法在 Web 部署之外应用 VS 2010 Web Config 转换 例如在调试期间 能够在不同的环境之间自由切换 会给我很大的提升 是的 您可以显式执行 Web config 转换通过调用TransformXmlMSBuild
  • OPENJSON - 关键字“with”附近的语法不正确

    想知道是否有人能找出这有什么问题 当我从 HubSpotCache 之外的另一个数据库 仍在同一个 SQL 实例中 读取表时 我不断收到此错误 消息 319 第 15 级 状态 1 第 33 行关键字 with 附近的语法不正确 如果此语句
  • 为什么我的编译器保留的空间多于函数堆栈帧所需的空间?

    我有一个功能 void func int a int x a 2 在汇编代码中 在函数序言中 push ebp mov esp ebp sub 0x10 esp 代码只需要为x预留空间 即4个字节 但它保留了 16 个字节 这是为什么 我总