有这样一个简单的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
。我想用ml
&link
from my MSVC.
经过一些小调整,现在可以正确构建了
.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
主要编辑为
- 。模型平面,c将过程的调用约定设置为c。
如果您决定保留。模型平面,stdcall
EXTERN printf :PROC
main PROC
printf PROTO NEAR C,:DWORD
main PROC NEAR C
包括libcmt.lib和legacy_stdio_definitions.lib它静态地将本地C-Runtime启动链接到你的代码中。
从start更改入口点主要对。在c -运行时库(CRT) libcmt中有一个入口点(_mainCRTStartup)。lib,它执行一些初始化任务,然后将控制权交给应用程序的入口点main。您可以更改默认入口点,但通常您需要CRT入口点自动为您完成初始化的便利性。
删除第一个子esp,4因此,当ret运行时,剩余的一次push由add esp,4来平衡,因此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 !: -)
你的错误信息说它找不到导出的符号(即函数)"_main"我希望把你的start函数重命名为_main可以让它编译。