Visual Studio 2013 中的程序集即使在启用 Microsoft Macro Assembler 后也无法构建

Assembly in Visual Studio 2013 not building even after enabling Microsoft Macro Assembler

我正在尝试运行一个非常基本的程序集文件来做一些数学运算并打印输出,没有什么挑战。我已经按照 here 等地方给出的步骤进行操作,但我的构建仍然失败,并且每一行都有关于语法的错误。错误如:

1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(22): error C2061: syntax error : identifier 'dword'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(24): error C2061: syntax error : identifier 'add'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(27): error C2061: syntax error : identifier 'pop'
1>c:\users\damian\documents\visual studio 2013\projects\test345\test345\source.asm(12): error C2061: syntax error : identifier 'main'

我尝试运行的代码是 here。我试过从 cpp 编译更改为 c 编译,我试过在链接器中设置一个入口点,我试过右键单击项目->构建依赖项->构建自定义并检查 masm,但这些都没有任何区别根本。还有什么我想念的吗?

您尝试 assemble 的代码使用 NASM 语法。您需要配置 Visual Studio 以改为使用 NASM。

1) 安装 NASM 并将其路径添加到 PATH 环境变量。
2) 右键单击​​您的 asm 文件,然后选择 Properties->General,然后为 Item Type 字段选择 Custom Build Tool
3) 点击应用。
4) 在 Custom Build Tool 页面上,为命令行字段设置 nasm -f win32 -o "$(ProjectDir)$(IntDir)%(Filename).obj" "%(FullPath)"
5) 将输出字段设置为 $(IntermediateOutputPath)%(Filename).obj

这将使 NASM assemble 您的汇编源文件成为 visual studio 兼容的目标文件。
不过我们还没有完成,您需要先对程序集文件进行一些更改,然后才能 link 使用 MSVC 的 linker.
1) MSVC 的 linker 要求您的函数以下划线开头,因此 main 变为 _main.
2)声明导入API时的命名约定也不同。所以 extern printf 变成 extern __imp__printf
3)导入API的调用指令也不一样。 call printf 变为 call [__imp__printf]。 printf 的地址将存储在 import table 条目中,我们的指令取消引用它以找到 printf 的地址并调用它。

尝试 link 这也会导致错误 (error LNK2001: unresolved external symbol _mainCRTStartup)。我击败它的方法是包含一个 c 文件,其中包含一个不执行任何操作的虚拟函数。这样,CRT 启动存根就会得到 linked。 (如果有更好的方法,在评论中提出)