visual studio 2017 年的简单组装程序

Simple Assembly program on visual studio 2017

        .386
        .model flat, c
        .stack 100h
printf  PROTO arg1:Ptr Byte

        .data
msg1    byte "Hello World!", 0Ah, 0

        .code
main    proc
        INVOKE printf, ADDR msg1
        ret

main    endp
        end main

嗨,我收到以下错误:

我四处搜索,发现有人说可以通过链接 Microsoft 运行时库来修复它

谁能教我如何正确修复它?

谢谢

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol _printf referenced in function _main testing C:\Users\Kin\Desktop\assembly\testing\testing\Source.obj    1   
Error   LNK1120 1 unresolved externals  testing C:\Users\Kin\Desktop\assembly\testing\Debug\testing.exe 1   

自 Visual Studio 2015 年起,printf 现在 "inlined" 为 C 代码。解决这个问题的汇编代码会很复杂。我最终在项目中包含了一个小的 C 源文件,其中包含一个未使用的 printf 调用来解决这个问题。我不记得生成的 printf 代码是否依赖于参数计数。我只是在对 printf 的虚拟 C 源代码调用中使用了与在汇编代码中使用的参数相同或更多的参数。

我没有安装 VS 2017 来尝试这个。 重要提示:确保创建 Console Application 而不是 Windows Application。创建此项目后,请确保将 MASM 添加到构建自定义项中。将 .ASM 文件添加到您的项目。

获取您的代码并在顶部插入以下行:

includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
includelib legacy_stdio_definitions.lib

关于为什么在 2013 年之后的 Visual Studio 中需要这些行的解释可以在 .

中找到

您希望 C 运行时成为您的控制台应用程序的入口点(它将调用您的 main)。因此,您必须 从最后一行 end main 中删除 main。当您执行 end main 时,它会绕过 C 运行时启动。未能正确初始化 C 运行时可能会导致程序在您调用 printf 时崩溃。它应该只是 end 而不是 end main.

您应该测试的最终代码是:

includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
includelib legacy_stdio_definitions.lib

        .386
        .model flat, c
        .stack 100h
printf  PROTO arg1:Ptr Byte

        .data
msg1    byte "Hello World!", 0Ah, 0

        .code
main    proc
        INVOKE printf, ADDR msg1
        ret

main    endp
        end