2010-09-19 2 views
1

У меня есть проблема с MASM32 ассемблереA2004 Проблема с 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.

Спасибо.

ответ

9

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

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. Но теперь, когда вы знаете, как это делается, это не должно представлять проблемы.

+0

Huh! Это работает. Большое спасибо! – udushu

+0

Я придумал сценарий для создания команд сборки/ссылки. но спасибо за подсказку IDE, я не знал, что это гибкий. – udushu

0

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

+0

Я пробовал _message. Все еще выбрасывает ошибку A2004 в строке 11. – udushu