如何在Windows上使用ml和link编译链接32位汇编HelloWorld程序
错误原因
你遇到的链接报错是因为MSVC链接器默认使用C运行时(CRT)的启动入口_mainCRTStartup,该启动代码会主动调用名为_main的用户逻辑入口,你当前汇编代码中定义的入口符号是start,不存在_main符号,因此触发未定义引用报错。
解决方案
共有两种可行调整方案,你可以按需选择:
方案1:修改汇编代码适配CRT默认规则(推荐,CRT功能兼容性最好)
调整内容如下:
- 将代码中的逻辑入口标签
start重命名为_main - 将代码末尾的
end start修改为end _main - 可选修正:你代码中字符串的
Wolrd为拼写错误,可以改成World
修改后的完整代码示例:
.386 .model flat, stdcall option casemap :none EXTERN printf :PROC ; 声明printf函数 .data HelloWorld db "Hello World!:-)", 0 .code _main: push offset HelloWorld call printf add esp, 4 ; 清理printf的入参栈空间(cdecl调用约定由调用方清栈) xor eax, eax ; 程序返回值设为0 ret end _main
仍然使用你原来的编译链接命令即可正常生成可执行文件:
ml.exe /c HelloWorld.asm link HelloWorld.obj libcmt.lib
方案2:不修改汇编代码,调整链接参数指定入口
如果你不想改动现有汇编代码,可以在链接时通过/entry参数手动指定你的自定义入口符号:
ml.exe /c HelloWorld.asm link HelloWorld.obj libcmt.lib /entry:start
该方案跳过了CRT的初始化流程,仅适合简单场景使用,复杂CRT功能调用可能出现异常。
补充提示
如果运行生成的exe时提示缺少运行时依赖,可以在链接时添加/MT参数静态链接C运行时,避免依赖动态运行时库。
内容的提问来源于stack exchange,提问作者darek_911
相关产品推荐
相关产品推荐

