在Visual Studio中编译汇编代码

59

如何在Visual Studio中编译汇编代码?

我想在Visual Studio 2010中编译和运行一个汇编源文件。

我创建了一个Visual C++项目,并在一个名为code.asm的文件中插入了一些汇编代码:

.586              ;Target processor.  Use instructions for Pentium class machines
.MODEL FLAT, C    ;Use the flat memory model. Use C calling conventions
.STACK            ;Define a stack segment of 1KB (Not required for this example)
.DATA             ;Create a near data segment.  Local variables are declared after
                  ;this directive (Not required for this example)
.CODE             ;Indicates the start of a code segment.

clear PROC
   xor eax, eax 
   xor ebx, ebx 
   ret 
clear ENDP 
END

不过问题在于当你尝试编译这段代码时,会报错:

LINK : error LNK2001: unresolved external symbol _mainCRTStartup

我确实启用了构建自定义masm.targets(右键单击项目>构建自定义..),但没有任何效果。


请查看我的博客文章为MASM32编程设置Visual Studio 2010 - Romaine Carter
而使用Visual Studio进行汇编调试(查看寄存器并从断点单步执行):https://dev59.com/4aXja4cB1Zd3GeqPRG5B。请参阅[x86标签wiki](https://stackoverflow.com/tags/x86/info)中的其他x86汇编链接。 - Peter Cordes
5个回答

71
听起来好像没有启用.asm文件的自定义构建规则。右键单击项目,选择"自定义构建规则",勾选"Microsoft宏汇编器"。使用"END清除"指令并禁用增量链接,我得到了一个干净的构建。
从VS2010开始,有所不同: 1. 右键单击项目,选择"构建自定义",勾选"masm"。 2. 右键单击.asm文件,选择"属性",更改"项类型"为"Microsoft宏汇编器"。

4
这通常是由使用 Express 版本的程序员提出的问题。它在我的电脑上。 - Hans Passant
8
在Visual Studio的后续版本中(例如2015),您需要按照以下路径操作:项目->(右键单击)->生成依赖项->生成自定义...->(勾选)masm。 - Alex

16

命令行:

使用以下命令编译代码:

ml /c /Cx /coff code.asm

输出结果为code.obj。

链接方式为:

link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear

现在您可以运行go.exe。

或者使用以下命令一次性完成:

ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear

Visual Studio(未解决)


您可以在项目属性对话框中编辑链接行以指定 /entry:clear。/out:会自动为您指定,code.obj也是如此。假设code.obj已经组装好了,如果错误是链接问题,那么这个方法应该可以解决它。正在运行的命令在此树的高级页面上。 - user257111
完整版本应该是 ml /Cx /coff code.asm /link /SUBSYSTEM:console /out:go /entry:clear 而不是 ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear - Dennis Ng

9
Visual Studio包含MASM宏汇编器。较小的汇编代码片段通常在C或C++程序中使用inline assembly编写。
要将汇编文件集成到Visual Studio项目中,请创建一个常规的C/C++项目(命令行或GUI),然后只需将以.asm结尾的文件添加到源文件列表中即可。
要将clear指定为入口点,请按照以下说明操作:
  1. 打开项目的“属性页”对话框。有关详细信息,请参阅设置 Visual C++ 项目属性。
  2. 单击链接器文件夹。
  3. 单击高级属性页面。
  4. 修改“入口点”属性。
(摘自Visual Studio文档。)
我可以确认Hans Passant的指示。此外,根据this article,如果您首先添加“构建自定义”masm复选框,然后再添加文件,它将自动被识别为汇编器文件。此外,不在END指令中指定入口点名称,而是在项目设置中指定也对我有效。

1
以下是如何使用VS20xx编译NASM汇编源代码的方法:
  1. 将“排除编译”设置为“否”

  2. 将“项目类型”设置为“自定义构建工具”

  3. 点击应用

  4. 自定义构建工具 -> 常规 -> 命令行:

    c:\nasm\nasm -f win64 my_asm.asm

  5. 自定义构建工具 -> 常规 -> 输出:

    my_asm.obj

  6. 像这样调用函数:

    extern "C" int foo(void); // 在汇编中编写!

https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/

nasm教程:

http://cs.lmu.edu/~ray/notes/nasmtutorial/


0
问题在于您的汇编代码只是一个函数。要进行编译和链接,您需要像 C/C++ 中的 Main 一样拥有一个启动过程。您可以通过在您的 END 指令中指定启动符号来完成此操作。例如:
END clear

或者,如果您愿意,您可以将生成的 .obj 文件与 C/C++ 生成的 .obj 文件链接起来。


由于这是VC++,它必须搜索一个带有Main函数的C文件。如果您只使用纯汇编和链接器,则最终解决方案将起作用。 - Madhur Ahuja
实际上,不需要使用 END clear 命令就可以使其正常工作:您只需向链接器指定“/entry:clear”即可。 - bobobobo
这是另一种方法,但如果您正在使用纯汇编语言,END清除解决方案将起作用。 - Madhur Ahuja

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