MS Visual Studio 2010如何使用生成的.asm文件

8

我想询问一下关于我想在Visual Studio 2010中尝试的内容。

我通过将项目属性中的选项设置为“汇编器输出”(/FAs)从.cpp文件生成一个.asm文件,方法是:进入项目属性 --> C/C++ --> 输出文件。

我的问题是,在下一步中如何使用生成的.asm文件链接到程序,而不再使用.cpp文件。比如,如果我想对.asm文件进行一些修改,然后通过保留我在汇编级别所做的修改来重新链接。

如果您能提供确切的步骤和项目属性中可能需要的正确配置,那将非常有帮助。


首先,您需要使用ML编译它,然后才能进入链接器。查看ML.EXE的命令行参数,我从未在VS2010中尝试过它。 - Al Kepp
在某些情况下,您可以使用内联汇编。 - BlackBear
如果你想将这个用于除了实验/学习以外的任何事情,请小心。MSVC汇编器输出与C++不兼容(特别是异常处理),而且微软不支持汇编清单,除非是为了“信息目的”。请参见https://dev59.com/zFvUa4cB1Zd3GeqPtnTW#7495413。 - Michael Burr
@Al Kepp,也许你是用VS2008试过了?应该是一样的。请告诉我。 - Economou Kyriakos
@BlackBear,我知道这个。我只需要使用整个生成的.asm文件。 - Economou Kyriakos
@MichaelBurr,谢谢你提供的链接。我已经阅读过了,但它并没有解决问题。 - Economou Kyriakos
3个回答

2

谢谢您的时间,但我已经知道了那个教程,它描述的情况与我的不同。正如我之前所说,我不想仅仅链接一个用汇编语言编写的函数。我可以在 .cpp 文件本身中使用内联汇编语言轻松完成此操作。 - Economou Kyriakos
之后您就不需要cpp文件了。我使用ml.exe进行编译,并添加了自定义的构建步骤。 - MartyTPS
1
正如我所说,我实际上正在寻找一种解决方案,可以在编译C++源文件(cpp文件)后使用整个生成的.asm文件,然后仅使用生成的asm再次编译,而不再使用cpp。 谢谢。 那个具体的教程描述了他如何在cpp文件中使用他编写的asm函数,这与我想要的不同。 然而,我可以使用那个教程来为我的情况找到一个自定义解决方案,因为我已经在cpp文件中编写了许多我的代码。 - Economou Kyriakos

1
我最近做过这个。以下是我在此处compile-assembly-output-generated-by-vc提供的答案。结果发现您仍然可以在MSVC2012的32位模式下执行此操作,但我认为64位模式是无望的。
对于32位模式,您需要执行以下操作:
创建一个空项目和一个源文件Source.cpp
 #include <stdio.h>
 int main() {
     printf("hello world\n");
     return 0;
 }
  1. 右键单击项目,选择“生成自定义”并选择masm,如http://www.masm32.com/board/index.php?topic=9231.0所述
  2. 在C++/OutputFiles下选择Assembly Output /FA
  3. 以32位模式Release模式编译
  4. Source.asm文件加载到MSVC中以便查看。它还不能工作,仍需要进行一些更改。
  5. 在C++/Optimization下关闭整个程序优化(删除/GL)。这将添加行INCLUDELIB MSVCRT
  6. 在链接器/高级设置最后一个选项“Image Has Safe Exception Handlers”为No(/SAFESEH:NO
  7. 现在你应该有一个可以执行与Source.cpp文件相同操作的Source.asm文件。将Release目录中的Source.cpp复制到与Source.cpp相同的目录中(这样当你构建/清除时不会被删除)。
  8. Source.asm(作为现有文件)添加到源文件中并从构建中删除Source.cpp
  9. 重新构建,你应该能够看到“Hello World”,而无需手动更改任何汇编行。

我已经使用这个方法来实现更复杂的功能。通常,我会在一个单独的模块上进行操作,并在函数名上使用extern "C"以去除C++名称修饰。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接