所以直接到我的问题:如何编译我的ASM文件与32位ASM编译器,将其包括在我的64位项目,并通过使用ASM文件的函数名称访问编译的代码?
如果有点不清楚,我可以详细说明一下:
我正在将我的一个项目从32位转换为64位,而我遇到了一个技术问题。 我的项目编译一个ASM文件,并使用编译后的二进制作为input使用。
当我的项目是32位,这是很容易的。 我将ASM文件包含在项目中,并添加了一个构build规则,以便使用Microsoft Macro Assembler
进行编译 – 然后,通过将我想要从ASM访问的每个函数导出到.h
头文件中,我可以从32位项目中访问编译的代码文件并使用函数名称访问它(我可以这样做,因为它被编译为obj,链接器知道这些符号,因为我将原型导出为.h
文件)。
现在,我需要将此代码转换为64位,但我仍然需要ASM编译为32位代码,仍然可以做同样的事情(从我的64位程序访问编译的32位代码)。 但是,当我尝试编译它时,显然不能识别指令,因为现在整个项目正在被编译为64位代码。
提前致谢。
如果我试图在64位程序中嵌入32位代码(这是一个值得怀疑的事情,但是为了争辩说,你有一个很好的理由,并且实际上知道你在处理结果) – 我会采取32位代码,无论是写在C,程序集或其他东西 – 并编译为一个单独的项目,产生一个DLL作为输出。 这在编译链中没有多余的怪异点:它只是一个普通的32位DLL。
然后,这个32位DLL可以作为二进制资源嵌入到64位应用程序中 – 只是您可以加载和访问的一块内存。
那么你怎么能真正做任何事情与该DLL中的编译代码? 我会使用Joachim Bauch的Memorymodulee库的有点黑客版本来访问它。 Memorymodulee被设计为从一大块内存中加载DLL,并提供对其导出的访问 – 就像Windows API的LoadLibrary()
,只能从内存而不是从文件中获取。 它被设计成与调用过程相同的位大小,但是有一点瑕疵,你可以把它编译成一个64位的库,但是能够读取一个32位的库。 由此产生的用法将非常简单:
// 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");
也就是说,正如我之前提到的(也有人提到的那样),即使你能得到指向导出的指针,也不能调用它们,因为代码的32位甚至可能不会被加载存在于4GB以下的地址。 但是,如果你真的想要在64位应用程序中嵌入32位代码,那我就是这么想的。