【发布时间】:2014-01-21 18:59:52
【问题描述】:
我找到了以下函数here,并希望让它在MinGW下编译:
size_t stackavail()
{
static unsigned StackPtr;
__asm mov [StackPtr],esp
static MEMORY_BASIC_INFORMATION mbi;
VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi));
return StackPtr-(unsigned)mbi.AllocationBase;
}
我尝试修改上面的代码并设法编译并运行它:
size_t stackavail()
{
static unsigned StackPtr;
__asm__ ("movl %%esp, %0\n\t" : "=r" (StackPtr) );
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery((PVOID)StackPtr, &mbi, sizeof(mbi));
return StackPtr-(unsigned)mbi.AllocationBase;
}
但我有疑问。这是正确的吗?还有其他方法吗?
【问题讨论】:
-
对我来说看起来是正确的,但您应该尽量避免将
__asm__用于旨在可移植的代码。 -
此外,使用静态本地会导致这非常不安全。
-
使用 GCC 内置
__builtin_frame_address()代替内联汇编怎么样?这甚至可以移植到其他架构(例如 x86-64)。 -
谢谢大家的帮助! @AdamRosenfield:很棒的提示。它工作正常。
标签: c++ c gcc inline-assembly