回答
简而言之,“是的”。您可以按照您指定的方式精确放大堆叠框架。但是,如您在问题的其余部分所述,您可能会遇到堆栈对齐问题。
这些问题很少会在您自己的代码中造成问题。老实说,只要你没有违反体系结构的限制,你可以用任何你想要的方式管理堆栈和传递参数。
但是,为了与系统和库调用进行互操作,堆栈对齐通常是必需的。您可能会发现this文档很有用。举一个例子,x86和x86_64上的Linux下的GCC期望(强制)堆栈的16字节对齐,并使用cdecl
。
您可能希望在参考文档中找到您正在使用的平台和库的任何调用标准和对齐要求。
您的意思是'cdecl'而不是'stdcall'。 – Jester
嗯..哎呀!谢谢! –
@ jester有一天我需要让你进入聊天并找出你的背景。你的装配知识真正广泛而令人印象深刻。 :) –
- 1. VxWorks堆栈帧异常大
- 2. 对齐堆栈标签
- 3. 关于堆栈帧的对齐,来自CSAPP的一个例子
- 4. 堆栈帧和堆栈指针
- 5. 打印堆栈帧
- 6. 洞察V8最大堆栈帧/尺寸
- 7. 获取堆栈帧
- 8. 访问堆栈帧
- 9. Qt,GCC,SSE和堆栈对齐
- 10. 对齐堆栈是什么意思?
- 11. 使用鞋子时对齐堆栈
- 12. Bootstrap导航对齐堆栈li
- 13. 堆栈分配,填充和对齐
- 14. WPF堆栈面板居中对齐
- 15. Visual Studio 2008未对齐堆栈变量?
- 16. 从堆栈指针减去对齐?
- 17. x86上的堆栈对齐方式
- 18. 对齐堆栈上的数据(C++)
- 19. STDCALL和CDECL堆栈对齐尺寸
- 20. 缓存对齐的堆栈变量
- 21. 垂直对齐堆栈内容
- 22. 将堆栈对齐到RelativeLayout的底部?
- 23. 对齐或不对齐堆栈上的char数组?
- 24. 堆栈= java.lang.StackOverflowError的:堆栈大小8MB
- 25. 访问Java堆栈帧
- 26. 堆栈帧内存分配
- 27. 了解堆栈帧C
- 28. 需要堆栈帧,ARM
- 29. 堆栈应该如何使用大对象堆栈?
- 30. 了解快速调用堆栈帧
技术上是的,但不要这样做。如果您打算与其他代码进行互操作,调用约定需要至少8个字节的对齐,可能是16个。错位也涉及一些性能处罚。 – Jester
有可能,x86对它并不是很挑剔。不要进行任何函数调用,错位的堆栈会降低它们的速度。或者当它们包含SIMD代码时使它们完全失效,越来越常见因为不应该进行调用,所以在没有调整堆栈指针4或8时没有任何意义。 –