Estoy en el proceso de portar una aplicación de x86 a x64. Estoy usando Visual Studio 2009; la mayor parte del código es C++ y algunas partes son C. La palabra clave __asm no es compatible cuando se compila hacia x64 y nuestra aplicación contiene algunas partes del ensamblador en línea. No escribí este código, así que no sé exactamente lo que se supone et hacer:Cómo obtener la dirección del puntero de la pila base
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
EBP es el puntero de base a la pila de la función actual. ¿Hay alguna forma de obtener el puntero de la pila sin usar el asm en línea? He estado observando las características intrínsecas que ofrece Microsoft como sustituto del asm en línea, pero no pude encontrar nada que me diera algo útil. ¿Algunas ideas?
Andreas preguntó qué cosas se hacen con pFrame. Aquí está la función completa:
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;
}
La variable pc no se utiliza. Parece que esta función baja la pila hasta que falla. Supone que no puede leer fuera de la pila de aplicaciones, por lo que cuando falla, mide la profundidad de la pila de llamadas. Este código no necesita compilarse en el compilador _EVERY_SINGLE. Solo VS2009. La aplicación no necesita ejecutarse en EVERY_SINGLE computadora por ahí. Tenemos control total de la implementación ya que la instalamos/configuramos nosotros mismos y la entregamos a nuestros clientes.
qué pasta está hecho con pFrame? –