我很确定 .model small 和 seg 是 x86 架构真正被分割(成 64K 块)的早期时代的产物。
masm32 IDE 根本不喜欢它们(这并不意外,因为现在编写 32 位平面模型代码更为常见)。
问题在于编辑器正在使用bin\assmbl.bat 文件来组装文件,它包含以下行:
\masm32\bin\ml /c /coff %1.asm > \masm32\bin\asmbl.txt
(使用/coff 选项)。这就是让汇编程序抱怨的原因。
您可以通过恢复到命令行来使其工作。假设您的文件是tst.asm,请使用以下命令:
c:\masm32\bin\ml.exe /c tst.asm
c:\masm32\bin\link16 tst.obj.tst.exe,,,,
您将拥有一个运行良好的tst.exe。
以下记录表明这是可行的:
C:\masm32> type tst.asm
.model small
.stack
.data
message db "Hello world!", "$"
.code
_main proc
mov ax,seg message
mov ds,ax
mov ah,09
lea dx,message
int 21h
mov ax,4c00h
int 21h
_main endp
end _main
C:\masm32> bin\ml.exe /c tst.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: tst.asm
C:\masm32> bin\link16 tst.obj,tst.exe,,,,
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
C:\masm32> tst.exe
Hello world!
或者,编辑器是非常可配置的。如果您打开 menus.ini 文件进行编辑(先备份它,我不需要告诉您)并更改:
&Assemble ASM file,\MASM32\BIN\Assmbl.bat "{b}"
到:
&Assemble ASM file,\MASM32\BIN\Assmbl.bat "{b}"
Assemble ASM file (no COFF),\MASM32\BIN\Assmbl2.bat "{b}"
您可以在 IDE 重新启动时添加新菜单项。
您还需要将bin\assmbl.bat 复制到bin\assmbl2.bat 并从后者中删除/coff。
然后您可以在 IDE 中使用新的菜单选项进行正常编译。
当然,您也必须对link 和assemble/link 菜单项执行相同的操作。但是,既然您知道它是如何完成的,那应该不成问题。