A2004 Проблема с MASM32 - PullRequest
       14

A2004 Проблема с MASM32

1 голос
/ 20 сентября 2010

У меня проблема с ассемблером MASM32

Следующий код является примером Hello World, который я скопировал из учебника MASM32:

.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) : error A2004: symbol type conflict

Может ли кто-нибудь помочь мне с этим? Этот код прекрасно работал с ассемблером TASM, но теперь я должен использовать MASM32, и у меня возникает эта ошибка A2004 для любого ассемблерного кода, который ранее был доказан для работы с TASM.

В случае, если это уместно, у меня 32-битный процессор под управлением ОС Win7.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 20 сентября 2010

Я почти уверен, что .model small и seg являются артефактами более раннего периода, когда архитектура x86 была действительно сегментирована (на куски по 64 КБ).

Среда 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 с новой опцией меню.

Конечно, вы должны будете сделать то же самое для пунктов меню link и assemble/link.Но теперь, когда вы знаете, как это делается, это не должно вызывать проблем.

0 голосов
/ 20 сентября 2010

Прошло много времени с тех пор, как я использовал MASM, но не является ли «message» зарезервированным словом?попробуйте _message.

...