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