rawurlencode que primero online huevo gallina fue for escape ejemplo c++ assembly x86

c++ - que - url encode php



La dirección de la función no es la dirección del código real (4)

Al depurar un código en Visual Studio 2008 (C ++), noté que la dirección en mi variable de puntero a función no es la dirección real de la función en sí. Esta es una función externa "C".

int main() { void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429 } Address: 0x013C4F10 void print() { ... }

El desensamblaje de tomar la dirección de la función es:

void (*printaddr)(const char *) = &print; 013C7465 C7 45 BC 29 14 3C 01 mov dword ptr [printaddr],offset print (13C1429h)

EDITAR: vi el código en la dirección 013C4F10 y el compilador aparentemente está insertando una instrucción "jmp" en esa dirección.

013C4F10 E9 C7 3F 00 00 jmp print (013C1429h)

En realidad, hay una tabla de salto completa de cada método en el .exe.

¿Puede alguien explicar por qué hace esto? ¿Es una "característica" de depuración?


El compilador está insertando una instrucción "jmp" en esa dirección al método real.

013C4F10 E9 C7 3F 00 00 jmp print (013C1429h)

En realidad, hay una tabla de salto completa de cada método en el .exe.

Es una función de depuración. Cuando cambio al modo de lanzamiento, la tabla de saltos desaparece y la dirección es de hecho la dirección de la función real.



Voy a arriesgarme a adivinar aquí, pero es posible habilitar Edit-and-Continue .

Supongamos que necesita recompilar esa función, solo necesita cambiar la tabla de direccionamiento indirecto, no todas las personas que llaman. Eso reduciría drásticamente la cantidad de trabajo que se debe hacer cuando se ejerce la función Editar y continuar.


es probable que tenga que ver con la interacción entre el enlazador y la necesidad de invocar el código en DLL

Este artículo habla de ello, no estoy 100% seguro de cómo se aplicó a su ejemplo, pero parece que podría ayudarlo a comprender http://msdn.microsoft.com/en-us/library/aa271769(VS.60).aspx