【发布时间】:2015-09-08 07:02:57
【问题描述】:
我正在使用 MSVC++ 2012 用 C++ 编写代码,我的代码针对 x86 平台。我有一种情况,编写一个函数(除其他外)可以在 CALLING 函数的堆栈上分配一些内存是有利的。我在这篇文章中并不是要讨论这样做的智慧,而只是考虑技术上的可行性。
我的实施计划是将我的函数编写为一个裸函数,并在内联汇编中使用自定义序言代码。在序言中,我将首先确定我需要多少内存,然后将返回地址、参数和该指针向下移动该数量。最后,我会将堆栈指针调整该数量。如果我没记错的话,这会在调用函数的堆栈上创建一个区域。
有人看到这个计划有什么漏洞吗?
【问题讨论】:
-
不是真的,不,假设你没有搞砸汇编程序并且有足够的堆栈空间:) 我假设堆栈需要在返回后的某个时候修复以删除分配空间?
-
类似于
alloca的作用? -
这可能是 XY 问题。 @CaptainObvlious 指出,
alloca做你想做的事,但没有任何背景,所有解决方案都可能毫无意义 -
移动堆栈帧的一个明显问题是任何传递/存储到其中的变量的指针都是无效的。
-
@Josh - 如果 epb/rbp 用于保存/恢复堆栈指针,那么至少堆栈指针将被恢复。问题是参数和局部变量是否作为 esp/rsp(这里的问题)或 epb/rpb(应该没问题)的偏移量来处理。 Microsoft 编译器有一个禁用帧指针的选项,在这种情况下 ebp/rbp 不用于保存/恢复堆栈指针,在这种情况下,您会遇到问题。
标签: c++ memory-management stack calling-convention