【问题标题】:Simple Assembly program on visual studio 2017Visual Studio 2017 上的简单组装程序
【发布时间】:2017-05-20 08:59:02
【问题描述】:
        .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   

【问题讨论】:

  • 虽然这个其他答案是在考虑 VS 2015 的情况下编写的,但它很可能适用于 VS 2017:stackoverflow.com/questions/33721059/…。有几个可能的解决方案的答案。
  • 你好Michael,我已经阅读了帖子并尝试了上面提到的三种方法,但在2017版本上不起作用,我什至无法更改为2013 v120,使用第二种和第三种方法,我可以成功编译,但是当我打开exe文件时实际上什么也没发生~
  • 我很好奇。如果您按原样获取代码(没有任何更改)并编译它运行时的结果是什么?该代码在此答案中:stackoverflow.com/a/33725587/3857942。我只是问,因为我还没有在系统上折腾 VS 2017。
  • 嗨,当我使用 includelib libcmt.lib、libvcruntime.lib、libucrt.lib、legacy_stdio_definitions.lib 复制代码并编译时,它显示错误“LNK1120 1 unresolved externals Win32Project1”“LNK2019 unresolved函数“int __cdecl __scrt_common_main_seh(void)”(?__scrt_common_main_seh@@YAHXZ) Win32Project1"中引用的外部符号_WinMain@16
  • 当我在附加依赖项中添加 wcrt.lib 并在不更改代码的情况下编译时,它显示错误“1 unresolved symbol”,“unresolved external symbol _WinMain@16referenced in function _WinMainCRTStartup”

标签: visual-studio assembly x86 masm msvcrt


【解决方案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)。因此,您必须从最后一行 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

【讨论】:

  • 哦!它起作用了,原来是因为我在 ".stack 100h" 之后放了 int includelib ;)
  • 非常感谢
  • 还有因为创建 Windows_application 而不是 Console_application
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多