visual-studio-2010 - 在 Visual Studio 2010 下为 x64 构建的 native C 代码中无法解释的堆栈分配

标签 visual-studio-2010 assembly stack 64-bit x86-64

我正在尝试使用 CL 16.0 for x64 (VS 2010) 来生成一些可读的 64 位 ASM 代码作为示例,但 CL 坚持预先分配大量堆栈空间(28h 字节),如下行:

sub rsp, 40 ; 00000028H (actual value depends on number of local vars of course)

问题是,如何禁用此行为?很难向全类解释,我喜欢向他们展示干净、可解释的代码......我的假设是“sub rsp, XXX”应该分配函数中局部变量所需的确切空间。

当然,它不需要额外的空间。在 x86 上,此行为似乎由编辑和继续开关(/Zi 与/ZI)控制,但这些在 x64 情况下没有任何影响。知道如何让 x64 CL 只分配实际需要的堆栈吗?

提前致谢!

最佳答案

如果你展示了产生这个的源代码会更容易,但 40 字节对于 64 位机器来说并不多。那只有五个 long s 或指针。要考虑的另一件事是局部变量的对齐 - 编译器可能会填充它们以获得最佳访问。

编辑:

嗯,这确实有点令人费解。通过 GCC 运行它不会导致这样的堆栈抓取。我怀疑这是编译器特定的异常处理 prolog 要求(您是否在生成的代码中的堆栈分配之前和之后看到一些看起来很奇怪的标签?)。

以下是您可能会觉得有用的几个 MSDN 链接:

  • Overview of x64 Calling Conventions
  • Stack Allocation

  • 我没有要测试的 Windows 设备,但可以尝试 /favor:???看看是否将优化级别调高一点可以消除这种情况。毕竟是叶子函数。

    此外,SO 上的注释格式很糟糕,将代码放入问题本身。

    关于visual-studio-2010 - 在 Visual Studio 2010 下为 x64 构建的 native C 代码中无法解释的堆栈分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3217459/

    相关文章:

    c# - Visual Studio 调试很慢

    c# - 在 Visual Studio 的设计器中,为什么没有任何图像显示在选择资源窗口中?

    c++ - 使用 Visual Studio 构建错误

    linux - 如何在 x86 汇编中调用 fgets?

    java - 创建基于 ArrayList 的堆栈并在回文检测器中使用

    c# - 为什么将整数值分配给 C# 方法参数中的 uint 参数无效?

    c - 查找共享库函数中定义的局部变量的地址

    c++ - C++代码中的汇编代码

    rust - 使用堆栈内存作为堆内存,无需 UB

    java - 将 pop() 的对象存储为变量