【问题标题】:Compiling assembly in Visual Studio在 Visual Studio 中编译程序集
【发布时间】:2011-05-31 17:31:39
【问题描述】:

如何使用 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(右键单击项目>构建自定义..),但无济于事。

【问题讨论】:

标签: windows visual-studio-2010 assembly


【解决方案1】:

Visual Studio 包含MASM 宏汇编器。较小的汇编代码片段通常在 C 或 C++ 程序中以inline assembly 编写。

要将汇编程序文件集成到 Visual Studio 项目中,请创建一个常规 C/C++ 项目(命令行或 GUI),并将以 .asm 结尾的文件添加到源文件列表中。

要将 clear 指定为入口点,请按照以下说明操作:

  1. 打开项目的属性页 对话框。有关详细信息,请参阅设置 Visual C++ 项目属性。

  2. 单击链接器文件夹。

  3. 单击“高级”属性页。

  4. 修改入口点属性。

(取自Visual Studio documentation。)

我可以确认 Hans Passant 的指示。另外,根据this article的说法,如果先添加“构建自定义”masm复选框,再添加文件,会自动识别为汇编文件。此外,不在 END 指令中指定入口点名称,而是在项目设置中指定它也适用于我。

【讨论】:

    【解决方案2】:

    问题在于您的汇编代码只是一个函数。要编译和链接,您需要有一个类似于 C/C++ 中的Main 的启动过程。您可以通过在 END 指令中指定来指定开始符号。喜欢:

    END clear
    

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

    【讨论】:

    • 既然是VC++,肯定是用Main函数搜索C文件。如果您只使用纯汇编器和链接器,最终解决方案将起作用。
    • 实际上不需要 END clear 来使其工作:您只需将 /entry:clear 指定给链接器。
    • 这是另一种方式,但是如果您使用的是纯汇编程序,则可以使用 END clear 解决方案。
    【解决方案3】:

    命令行:

    编译代码:

    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 组装正常并且错误链接应该修复它。正在运行的命令位于此树的高级页面上。
    • 完整版应该是ml /Cx /coff code.asm /link /SUBSYSTEM:console /out:go /entry:clear而不是ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear
    【解决方案4】:

    在我看来,.asm 文件的自定义构建规则未启用。右键单击项目,自定义构建规则,勾选“Microsoft Macro Assembler”。使用“END clear”指令并禁用增量链接,我得到了一个干净的构建。

    VS2010开始就不一样了:

    1. 右键单击项目构建自定义项,勾选“ma​​sm”。
    2. 右击.asm文件,Properties,将Item Type更改为“Microsoft Macro Assembler”。

    【讨论】:

    • 这是我的。使用 Express 版本的程序员往往会问。
    • 在更高版本的 Visual Studio(例如 2015)中,您必须遵循以下路径:Project->(右键单击)->Build Dependencies->Build Customizations...->(check)masm
    【解决方案5】:

    这里是如何使用 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多