You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用MASM在Visual Studio中通过DOS中断输出Hello World的正确执行步骤

解决MASM DOS代码在Visual Studio中报错的问题

先把你的代码规整一下,看着更清楚:

.MODEL SMALL
.STACK 100H
.DATA
MSG DB "HELLO! $"
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX
    LEA DX, MSG
    MOV AH, 9
    INT 21H
    MOV AH,4CH
    INT 21H
MAIN ENDP
END MAIN

为啥这段代码在VS里跑不起来?

咱得先明白:现在VS自带的MASM工具链(比如ML.exe)主要是给32/64位Windows程序用的,根本不支持你写的这种16位DOS实模式代码。你用的.MODEL SMALL是16位程序的内存模型,INT 21H是DOS系统调用——这些都是老DOS时代的东西,VS的现代编译环境早就把这些支持砍掉了,直接编译肯定报错,比如不认.MODEL SMALL,或者说INT 21H指令无效之类的。

正确的执行流程分两种路子:

路子1:老MASM工具链+DOSBox(最省心靠谱)

这和你用emu模拟器的思路一样,就是用专门支持16位DOS的MASM工具编译成DOS可执行文件,再用DOSBox模拟DOS环境运行:

  • 先搞到MASM 6.11版本(这个版本完美支持16位DOS程序编译),里面有masm.exelink.exe这些核心工具。
  • 把你的代码存成hello.asm,放到MASM工具所在的文件夹里。
  • 打开DOSBox,挂载MASM的目录(比如输入mount c: C:\masm611,把C盘指向你的MASM文件夹),然后输入c:切换到C盘。
  • 依次敲下面的命令编译链接:
    masm hello.asm;
    link hello.obj;
    
    命令后面的分号是用来跳过中间文件名的提示,省得你一步步输入。
  • 最后运行生成的hello.exe,就能看到熟悉的HELLO!输出了。

路子2:在老版本VS里配置16位编译(麻烦且局限性大)

如果非要在VS里折腾,只能用VS 2010及更早的版本(新版本完全砍掉了16位支持),步骤如下:

  • 创建一个空的Win32项目,然后在项目属性里,把“平台”设为“Win32”,找到MASM相关的设置项。
  • 把你的.asm文件添加到项目里,然后修改MASM编译选项:
    • 在“常规”里,把“目标机器”改成“16位”(只有老VS才有这个选项);
    • 在“命令行”里加上/c /coff参数,强制生成COFF格式的目标文件。
  • 再配置链接器,添加/subsystem:dos /machine:x86参数,告诉链接器要生成DOS可执行文件。
  • 编译出来的exe文件,还是得用DOSBox运行(64位Windows已经去掉了原生支持DOS程序的NTVDM)。

总结

其实最省心的还是路子1——毕竟你的代码就是给DOS写的,用适配的老工具+DOSBox模拟环境,完全不会有兼容性问题。VS现在主打现代Windows程序开发,真不适合搞这种老掉牙的16位DOS代码。

内容的提问来源于stack exchange,提问作者shifa umar

火山引擎 最新活动