You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:54:00