visual studio para guide ensamblador configurar asm _asm c windows visual-studio assembly x86

para - Visual Studio: compilación de código de 32 bits dentro del proyecto de 64 bits



visual studio asm (1)

Tan directo a mi pregunta: ¿cómo puedo compilar mis archivos ASM con un compilador ASM de 32 bits, incluirlo en mi proyecto de 64 bits y acceder al código compilado utilizando los nombres de función del archivo ASM?

Si no está claro, puedo elaborar:

Estoy convirtiendo un proyecto mío de 32 bits a 64 bits y me encontré con un problema técnico. Mi proyecto compila un archivo ASM y usa el binario compilado como entrada para su uso.

Cuando mi proyecto era de 32 bits, fue bastante fácil. Incluí los archivos ASM en el proyecto y agregué una regla de compilación para compilarlos con Microsoft Macro Assembler ; luego pude acceder al código compilado de mi proyecto de 32 bits exportando cada función a la que quería acceder desde el ASM a un encabezado .h archive y acceda usando el nombre de la función (pude hacerlo porque fue compilado a obj y el enlazador conocía los símbolos porque exporté los prototipos a un archivo .h ).

Ahora, necesito convertir este código a 64 bits, pero aún necesito que el ASM se compile como código de 32 bits y aún pueda hacer lo mismo (acceder al código compilado de 32 bits de mi programa de 64 bits) ) Sin embargo, cuando intento compilarlo, obviamente no reconoce las instrucciones porque ahora todo el proyecto se está compilando como código de 64 bits.

Gracias por adelantado.


Si estuviera tratando de incrustar código de 32 bits dentro de un programa de 64 bits (lo cual es algo dudoso de hacer, pero digamos por el argumento de que tiene una buena razón y realmente sabe lo que está haciendo con el resultado ) - Tomaría el código de 32 bits, ya sea escrito en C, ensamblado u otra cosa, y compilarlo como un proyecto separado, produciendo una DLL como salida. Esto no implica extra rareza en la cadena de compilación: es solo una DLL ordinaria de 32 bits.

Esa DLL de 32 bits se puede incrustar en su aplicación de 64 bits como un recurso binario, simplemente una burbuja de memoria que puede cargar y acceder.

Entonces, ¿cómo se puede hacer algo con el código compilado en esa DLL? Usaría una versión algo pirateada de la biblioteca MemoryModule de Joachim Bauch para acceder a ella. MemoryModule está diseñado para cargar archivos DLL de una gran cantidad de memoria y proporcionar acceso a sus exportaciones; es como la LoadLibrary() la API de Windows, solo desde la memoria en lugar de desde un archivo. Está diseñado para hacerlo con el mismo tamaño de bit que el proceso de llamada, pero con un poco de hackeo, probablemente puedas compilarlo como una biblioteca de 64 bits, pero capaz de leer una biblioteca de 32 bits. Los usos resultantes serían bastante simples:

// Load the embedded DLL first from the current module. hresource = FindResource(hmodule, "MyLibrary.DLL", "binary"); hglobal = LoadResource(hmodule, hresource); data = LockResource(hglobal); size = SizeofResource(hmodule, hresource); // Turn the raw buffer into a "library". libraryHandle = MemoryLoadLibrary(data, size); // Get a pointer to some export within it. myFunction = MemoryGetProcAddress(libraryHandle, "myFunction");

Dicho esto, como he mencionado antes (y otros también aludieron), incluso si puede obtener punteros a las exportaciones, no podrá invocarlos, porque el código es de 32 bits y es posible que ni siquiera se cargue en un dirección que existe debajo de la marca 4GB. Pero si realmente desea insertar código de 32 bits en una aplicación de 64 bits, así es como lo haría.