2017年视觉工作室的简单装配程序

kir*_*ora 4 x86 assembly masm msvcrt visual-studio

        .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
Run Code Online (Sandbox Code Playgroud)

嗨,我收到以下错误:

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

任何人都可以教我如何才能完全解决它?

谢谢

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   
Run Code Online (Sandbox Code Playgroud)

Mic*_*tch 5

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

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

includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
includelib legacy_stdio_definitions.lib
Run Code Online (Sandbox Code Playgroud)

可以在此Stackoverflow答案中找到有关为什么在Visual Studio中晚于2013年需要这些行的原因的说明.

您希望C运行时成为控制台应用程序的入口点(然后它将调用您的main).因此,你必须main从最后一行中删除end 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
Run Code Online (Sandbox Code Playgroud)