1

我的 MASM32 汇编器有问题

以下代码是我从 MASM32 教程中复制的 Hello World 示例:

.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

在尝试组装时,MASM32 抛出 A2004 错误并带有以下注释:

C:\masm32\console.asm(11) : 错误 A2004: 符号类型冲突

任何人都可以帮助我吗?这段代码在 TASM 汇编器上运行得非常好,但现在我必须使用 MASM32,而且对于我之前证明可以与 TASM 一起使用的任何汇编代码,我都遇到了这个 A2004 错误。

如果这是相关的,我有一个运行 Win7 操作系统的 32 位 CPU。

谢谢。

4

2 回答 2

9

我很确定这是 x86 架构真正被分割(.model smallseg64K 块)时的早期产物。

IDE 根本不喜欢它们(这masm32并不意外,因为现在执行 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 中使用新的菜单选项进行正常编译。

当然,您也必须对linkassemble/link菜单项做同样的事情。但是,既然您知道它是如何完成的,那应该不存在问题。

于 2010-09-20T01:00:26.230 回答
0

自从我使用 MASM 已经有一段时间了——但“消息”不是保留字吗?尝试'_message'。

于 2010-09-20T00:01:03.220 回答