MS Visual Studio 2010 如何使用 .asm 生成的文件
Posted
技术标签:
【中文标题】MS Visual Studio 2010 如何使用 .asm 生成的文件【英文标题】:MS Visual Studio 2010 how to use the .asm generated file 【发布时间】:2011-10-11 22:05:10 【问题描述】:我想问一些我正在考虑尝试使用 Visual Studio 2010 的事情。
我通过在项目属性 --> C/C++ --> 输出文件 (/FAs) 中将选项设置为“汇编程序输出”,从 .cpp 文件生成一个 .asm 文件。
我的问题是,如果我想在 .asm 文件中进行一些修改然后链接再次保持我在装配级别所做的修改。
如果您能提供准确的步骤,包括项目属性中可能需要的正确配置,那将非常有帮助。
【问题讨论】:
首先你需要用ML编译它,然后你可以去链接器。看ML.EXE的命令行参数,VS2010没试过。 在某些情况下你可以使用内联汇编 如果您想将其用于实验/学习之外的任何事情,请小心。 MSVC 汇编器输出不能很好地与 C++(特别是异常处理)配合使用,并且 MS 不支持除了“信息目的”之外的汇编列表。见***.com/questions/7488056/… @Al Kepp,也许你用 VS2008 试过了?应该是一样的。请告诉我。 @BlackBear,我知道这一点。我只需要使用整个 .asm 生成的文件。 【参考方案1】:这里有教程http://www.cs.virginia.edu/~evans/cs216/guides/vsasm.html
【讨论】:
感谢您抽出宝贵时间,但我已经知道该教程描述了另一个案例,与我的不同。正如已经说过的,我不想仅仅链接一个用 asm 编写的函数。我可以使用 .cpp 文件本身中的内联 asm 轻松做到这一点。 之后就不需要cpp文件了。我正在使用带有自定义构建步骤的 ml.exe 进行编译。 正如我所说,我实际上是在寻找一种解决方案,在编译 C++ 源(cpp 文件)后使用整个 .asm 生成的文件,然后只使用生成的 asm 以便再次编译而无需不再使用cpp。谢谢你。该特定教程描述了一个案例,其中他使用了他在 asm 中编写的函数以及 cpp 文件,这与我想要的不同。但是,我可以使用该教程为我的案例找到自定义解决方案,因为我在 cpp 文件中的 .asm 中编写了很多代码。【参考方案2】:我最近这样做了。这是我在compile-assembly-output-generated-by-vc 给出的答案的重复。事实证明,您仍然可以在 MSVC2012 中以 32 位模式执行此操作,但我认为 64 位模式是没有希望的。
对于 32 位模式,这就是你要做的。
创建一个空项目和一个源文件Source.cpp
#include <stdio.h>
int main()
printf("hello world\n");
return 0;
-
右键单击您的项目并选择“构建自定义”并
选择这里描述的masm http://www.masm32.com/board/index.php?topic=9231.0
在 C++/OutputFiles 下选择程序集输出 /FA
在 32 位模式下编译发布模式
将 Source.asm 文件加载到 MSVC 中,以便您查看。它还行不通。仍然需要进行一些更改。
在 C++/优化下关闭整个程序优化(删除
/GL
)。这将添加行 INCLUDELIB MSVCRT
在 Linker/Advanced 中将最后一个选项“Image Has Safe Exception Handlers”设置为 No (/SAFESEH:NO
)
现在您应该有一个 Source.asm 文件,该文件将执行与 Source.cpp 文件相同的操作。将 Source.cpp 从 Release 目录复制到与 Source.cpp 相同的目录(因此在构建/清理时不会将其删除)。
将 Source.asm(作为现有文件)添加到源文件并从构建中删除 Source.cpp。
重建,您应该可以看到“Hello World”,而无需手动更改任何装配线。
我已经将它用于更复杂的功能。我通常在一个单独的模块上执行此操作,并在函数名称上使用 extern "C"
来删除 C++ 名称重整。
【讨论】:
【参考方案3】:只需将 .obj 文件拖入项目(解决方案资源管理器树): How to include .obj files into the project
【讨论】:
以上是关于MS Visual Studio 2010 如何使用 .asm 生成的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)
请参阅 MS Visual Studio 2010 中 GUI C++ 应用程序的控制台输出
Visual Studio 2010 DTE:如何使添加的 DLL 引用成为绝对引用而不是复制
MS VIsual Studio 2010 中的问题 Glut lib 工作