【发布时间】:2010-12-23 06:06:18
【问题描述】:
我正在将应用程序从 x86 移植到 x64。我正在使用 Visual Studio 2009;大部分代码是 C++,有些部分是纯 C。编译到 x64 时不支持 __asm 关键字,并且我们的应用程序包含一些内联汇编程序部分。我没有写这段代码,所以我不知道 et 应该做什么:
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
EBP 是指向当前函数堆栈的基指针。有什么方法可以在不使用内联 asm 的情况下获取堆栈指针?我一直在研究 Microsoft 提供的作为内联 asm 替代品的内在函数,但我找不到任何对我有用的东西。有什么想法吗?
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。看起来这个函数沿着堆栈向下走,直到它失败。它假定它无法在应用程序堆栈之外读取,因此当它失败时,它已经测量了调用堆栈的深度。此代码不需要在 _EVERY_SINGLE 编译器上编译。只是VS2009。该应用程序不需要在 EVERY_SINGLE 计算机上运行。我们可以完全控制部署,因为我们自己安装/配置并将整个事情交付给我们的客户。
【问题讨论】:
-
用 pFrame 做了什么?
标签: c windows pointers assembly stack