我正在將應用程序從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是基本指向當前函數的棧。有沒有一些方法來獲得堆棧指針而不使用內聯asm?我一直在研究微軟提供的作爲內聯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計算機上運行。我們完全控制部署,因爲我們自己安裝/配置它,並將整個事情交付給我們的客戶。
什麼東西是與P幀做了什麼? –