2016-01-27 84 views
0

是否有可能扩大这样的栈帧:放大堆栈帧 - 对齐?

subq $1, %rsp 

,如果我们只是想存储堆栈(例如)在char。 或者我们需要将堆栈放大8倍的倍数。有没有对齐?

+1

技术上是的,但不要这样做。如果您打算与其他代码进行互操作,调用约定需要至少8个字节的对齐,可能是16个。错位也涉及一些性能处罚。 – Jester

+0

有可能,x86对它并不是很挑剔。不要进行任何函数调用,错位的堆栈会降低它们的速度。或者当它们包含SIMD代码时使它们完全失效,越来越常见因为不应该进行调用,所以在没有调整堆栈指针4或8时没有任何意义。 –

回答

4

简而言之,“是的”。您可以按照您指定的方式精确放大堆叠框架。但是,如您在问题的其余部分所述,您可能会遇到堆栈对齐问题。

这些问题很少会在您自己的代码中造成问题。老实说,只要你没有违反体系结构的限制,你可以用任何你想要的方式管理堆栈和传递参数。

但是,为了与系统和库调用进行互操作,堆栈对齐通常是必需的。您可能会发现this文档很有用。举一个例子,x86和x86_64上的Linux下的GCC期望(强制)堆栈的16字节对齐,并使用cdecl

您可能希望在参考文档中找到您正在使用的平台和库的任何调用标准和对齐要求。

+2

您的意思是'cdecl'而不是'stdcall'。 – Jester

+0

嗯..哎呀!谢谢! –

+1

@ jester有一天我需要让你进入聊天并找出你的背景。你的装配知识真正广泛而令人印象深刻。 :) –