由网友(月色降人间)分享简介:有这么简单的assemblyWin 32程序:.386.model flat, stdcalloption casemap :noneEXTERN printf :PROC ; declare printf.dataHelloWorld db "Hello Wolrd!:-)", 0.codestart:sub...
有这么简单的assembly
Win 32
程序:
.386
.model flat, stdcall
option casemap :none
EXTERN printf :PROC ; declare printf
.data
HelloWorld db "Hello Wolrd!:-)", 0
.code
start:
sub esp, 4
push offset HelloWorld
call printf
add esp, 4
ret
end start
我只需:
即可成功编译ml.exe /c HelloWorld.asm
但在链接它时遇到问题。当我使用:
link HelloWorld.obj libcmt.lib
我收到一个错误:
unresolved external symbol _main called in _mainCRTStartup
我要更改/更正什么才能成功链接程序以运行它?
附注
请不要告诉我只使用nasm
。我想使用我的MSVC中的ml
&;link
。
推荐答案
经过一些细微的调整,现在可以正确构建。
.386
.model flat, c
option casemap :none
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
EXTERN printf :PROC ; declare printf
.data
HelloWorld db "Hello World!:-)", 0
.code
main PROC
push offset HelloWorld
call printf
add esp, 4
ret
main ENDP
END
主要编辑内容
.Model Flat,c将过程的调用约定设置为C。 如果您决定将.model保持为平面,则stdcall将需要进行这些更改。替换
EXTERN printf :PROC
main PROC
与
printf PROTO NEAR C,:DWORD
main PROC NEAR C
包含libcmt.lib和Legend_Stdio_finitions.lib,它们静态地将本机C运行时启动链接到您的代码中。
已将入口点从开始更改为主要。在C运行时库(CRT)libcmt.lib中有一个入口点(_MainCRTStartup),它执行一些初始化任务,然后将控制权移交给应用程序的入口点main。您可以更改默认入口点,但通常您希望CRT入口点自动为您提供初始化的便利。
删除第一个子esp,4,因此剩余的一次推送由添加esp 4平衡,因此当ret运行时,esp指向返回地址。
要生成,请打开Windows命令提示符并运行:
"C:Program Files (x86)Microsoft Visual Studio2019ProfessionalVCAuxiliaryBuildvcvars32.bat"
设置初始化的MSVC环境:‘x86’
接下来,运行这些MASM命令
ml.exe /c /coff HelloWorld.asm
link.exe /SUBSYSTEM:console HelloWorld.obj
程序显示
Hello World!:-)
相关推荐
最新文章