Sublime Text 默认不支持一键批量编译多个 .asm 文件,因其构建系统仅作用于当前激活文件;可行方案是用 bat 脚本统一处理整个目录下的 .asm 文件,并在构建系统中通过 "shell": true 调用,且需确保路径无空格、工具链匹配、working_dir 指向项目根目录。

Sublime Text 本身不支持“一键批量编译多个独立 .asm 文件”——它默认只对当前激活文件执行 Ctrl+B,即使你写了遍历脚本,也不会自动触发所有打开/未打开的 .asm 文件。 真正可行的路径是:用批处理(.bat)或 shell 脚本统一编译整个目录下的所有 .asm 文件,并在构建系统中调用它。
为什么不能直接用默认 build system 多文件编译
Sublime 的构建系统本质是单文件上下文驱动:$file、$file_base_name 等变量只代表当前编辑器里**正在看的那个文件**。即使你同时打开了 10 个 .asm,Ctrl+B 也只会作用于焦点所在那个。试图在 cmd 数组里写循环(比如 for %f in (*.asm) do ml.exe %f)会失败,因为 Sublime 不解析 shell 语法,除非显式启用 "shell": true,且该 shell 能正确执行你的命令。
- 常见错误现象:
ml.exe报错 “File not found” 或 “Invalid number of arguments”,其实是%1.asm没被正确替换,或路径含空格未加引号 -
selector设为"source.asm"只影响菜单是否显示该构建项,不改变执行范围 - 别指望靠
working_dir自动扫子目录——它只是工作路径,不是 glob 模式开关
用 bat 脚本实现真正批量编译(Windows + MASM)
这是最稳定、可调试、易排查的方式。核心是把编译+链接逻辑从 Sublime 移出,交给 Windows 批处理统一调度。
- 在
D:masm32in下新建build_all.bat,内容如下(注意路径按你实际安装位置调整):
"D:masm32inml.exe" /c /Zi *.asm "D:masm32inlink16.exe" *.obj /SUBSYSTEM:CONSOLE
- 保存后,在 Sublime 中新建构建系统,内容为:
{
"cmd": ["D:\masm32\bin\build_all.bat"],
"working_dir": "${project_path:${folder}}",
"shell": true,
"file_regex": "^(.*?\.asm):([0-9]+):.*$",
"selector": "source.asm"
}
-
"shell": true是关键,否则build_all.bat不会被当作可执行命令调用 -
working_dir必须设为项目根目录(即所有.asm所在文件夹),否则*.asm会找不到文件 -
file_regex要匹配 MASM 输出的错误格式,例如main.asm(12): error A2006: undefined symbol : foo;上面的正则适配括号编号形式,若你用的是冒号分隔(如main.asm:12:),得改成"file_regex": "^(.*?\.asm):([0-9]+):"
避免踩坑的硬性条件
批量编译能跑通,依赖三个外部前提全部满足,缺一不可:
-
ml.exe和link16.exe必须能被系统直接调用:要么它们所在目录(如D:masm32in)已加入系统级PATH,要么你在.sublime-build里用"path": "D:\masm32\bin"显式声明(推荐后者,绕过环境变量继承问题) - 所有
.asm文件必须放在同一目录下,且不能有中文路径或空格;MASM 对路径敏感,ml.exe /c foo bar.asm会误认为foo是参数而非文件名 - 如果你用的是 32/64 位 MASM(如
ml64.exe),脚本里要对应换掉命令名,且link也要匹配(link64.exe),不能混用 16-bit 和 64-bit 工具链
真正麻烦的从来不是写几行 JSON 或 BAT,而是 MASM 错误信息格式不统一、路径空格、工具链版本错配——这些细节不亲手在 CMD 里跑一遍 build_all.bat,光看 Sublime 输出根本定位不到根因。


















