我正在将一个应用程序从x86移植到x64。我使用的是Visual Studio 2009;大部分代码都是C++,一些部分是纯C。当编译为x64时,__asm关键字不受支持,并且我们的应用程序包含一些内联汇编器的部分。我没有编写这段代码,因此不知道它应该做什么:
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
EBP是指向当前函数堆栈的基指针。有没有一种方法可以在不使用内联汇编的情况下获取堆栈指针?我一直在查找微软提供的替代内联汇编的内部函数,但我找不到任何有用的东西。有什么想法吗?
Andreas问pFrame用于做什么。这是完整的函数:
int CallStackSize(DWORD frameEBP = 0)
{
DWORD pc;
int tmpint = 0;
DWORD Frame;
PDWORD pFrame, pPrevFrame;
if(!frameEBP) // No frame supplied. Use current.
{
__asm
{
mov EAX, EBP
mov Frame, EAX
}
}
else Frame = frameEBP;
pFrame = (PDWORD)Frame;
do
{
pc = pFrame[1];
pPrevFrame = pFrame;
pFrame = (PDWORD)pFrame[0]; // precede to next higher frame on stack
if ((DWORD)pFrame & 3) // Frame pointer must be aligned on a DWORD boundary. Bail if not so.
break;
if (pFrame <= pPrevFrame)
break;
// Can two DWORDs be read from the supposed frame address?
if(IsBadWritePtr(pFrame, sizeof(PVOID)*2))
break;
tmpint++;
} while (true);
return tmpint;
}
变量pc没有被使用。这个函数似乎会一直向下遍历堆栈,直到失败为止。它假设无法读取应用程序堆栈之外的内容,因此当它失败时,就测量了调用堆栈的深度。这段代码不需要在所有编译器上都编译通过。只需要在VS2009上编译通过即可。该应用程序也不需要在所有计算机上运行。我们完全控制部署,因为我们自己安装/配置并将整个应用交付给客户。