visual-studio - Visual Studio 2017 上的简单汇编程序

标签 visual-studio assembly x86 masm msvcrt

        .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 runtime library来修复

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

谢谢
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   

最佳答案

我没有安装 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 中需要这些行的解释可以在此 Stackoverflow Answer 中找到。 .

您希望 C 运行时成为您的控制台应用程序的入口点(它将调用您的 main)。因此,您必须删除 main从最后一行说 end main .当您这样做时end main它绕过 C 运行时启动启动。当您进行类似 printf 的调用时,未能正确初始化 C 运行时可能会导致程序崩溃。 .它应该只是 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

关于visual-studio - Visual Studio 2017 上的简单汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44083907/

相关文章:

c - 无需系统调用或 C 中的库函数即可从内存中逐字节读取

c - 为什么 CPU 不能在一个简单的循环中执行相当于 Ghz 的 FLOPs 性能?

visual-studio - 结构的第一个成员在 VS 调试器中不可见

C++:将 LPTSTR 转换为字符数组

c - 使用 system() 来定位命令解释器的 COMSPEC 和 PATH 环境变量应该是什么?

performance - 在 x86 中设置和清除零标志

assembly - lea 汇编指令

visual-studio - 无法使用此 PC Visual Studio 2015 附加应用程序 'chrome.exe' (PID)

visual-studio - 跳过函数输入参数的复制构造函数的调试?

multithreading - 例如,在解决进餐哲学家的问题时,是否有一种方法可以在DOS中模拟多线程?