微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Visual Studio – 在64位项目中编译32位代码

所以直接到我的问题:如何编译我的ASM文件与32位ASM编译器,将其包括在我的64位项目,并通过使用ASM文件函数名称访问编译的代码

如果有点不清楚,我可以详细说明一下:

我正在将我的一个项目从32位转换为64位,而我遇到了一个技术问题。 我的项目编译一个ASM文件,并使用编译后的二进制作为input使用。

当我的项目是32位,这是很容易的。 我将ASM文件包含在项目中,并添加一个构build规则,以便使用Microsoft Macro Assembler进行编译 – 然后,通过将我想要从ASM访问的每个函数导出到.h头文件中,我可以从32位项目中访问编译的代码文件并使用函数名称访问它(我可以这样做,因为它被编译为obj,链接器知道这些符号,因为我将原型导出为.h文件)。

在C中写入Bootloader

Assembly中的%gs是多less?

如何获得ac程序的操作码

使用RDTSC获取cpu周期 – 为什么RDTSC的值总是增加

大会非法指示

现在,我需要将此代码转换为64位,但我仍然需要ASM编译为32位代码,仍然可以做同样的事情(从我的64位程序访问编译的32位代码)。 但是,当我尝试编译它时,显然不能识别指令,因为现在整个项目正在被编译为64位代码

提前致谢。

如何阅读由Visual C ++ 2010生成的汇编输出

Segfault仅在GDB中显示

将Linux x86-64程序集hello world程序与ld链接失败

ASM调用Printf

为什么这个简单的汇编程序使用AT&T语法,而不是英特尔语法?

如果我试图在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位代码,那我就是这么想的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐