2010-09-19 25 views
1

J'ai un problème avec l'assembleur MASM32A2004 Problème avec MASM32

Le code suivant est un exemple Bonjour tout le monde que je copiais du tutoriel 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 

On tente d'assembler, MASM32 lancers francs A2004 erreur avec le commentaire suivant:

 
C:\masm32\console.asm(11) : error A2004: symbol type conflict 

Quelqu'un peut-il m'aider avec cela? Ce code a parfaitement fonctionné avec l'assembleur TASM, mais maintenant je dois utiliser MASM32 et j'ai cette erreur A2004 pour tout code d'assemblage que j'ai déjà testé avec TASM.

Dans le cas où cela est pertinent, j'ai un processeur 32 bits fonctionnant sous Win7 OS.

Merci.

Répondre

9

Je suis assez certain que .model small et seg sont des artefacts d'un âge plus précoce lorsque l'architecture x86 était vraiment segmentée (en morceaux de 64 Ko). L'IDE masm32 ne les aime pas du tout (pas étonnant car il est beaucoup plus courant aujourd'hui de faire du code de modèle plat 32 bits).

Le problème réside dans le fait que le fichier bin\assmbl.bat est utilisé par l'éditeur pour assembler le fichier et il contient la ligne:

\masm32\bin\ml /c /coff %1.asm > \masm32\bin\asmbl.txt 

(avec l'option /coff). C'est ce qui fait que l'assembleur se plaint.

Vous pouvez le faire fonctionner en revenant à la ligne de commande. En supposant que votre fichier est tst.asm, utilisez les commandes suivantes:

c:\masm32\bin\ml.exe /c tst.asm 
c:\masm32\bin\link16 tst.obj.tst.exe,,,, 

et vous aurez un tst.exe qui fonctionne très bien.


La transcription ci-dessous montre que cela fonctionne:

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! 

Sinon, l'éditeur est très configurable.Si vous ouvrez le fichier menus.ini pour l'édition (sauvegarder d'abord, je ne devrais pas avoir besoin de vous dire que) et le changement:

&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}" 

vous pouvez obtenir votre nouveau menu article ajouté sur le redémarrage de l'IDE. Vous devez également copier bin\assmbl.bat vers bin\assmbl2.bat et supprimer le /coff de ce dernier.

Ensuite, vous pouvez compiler correctement à partir de l'EDI avec la nouvelle option de menu.

Bien sûr, vous devrez également faire la même chose pour les éléments de menu link et assemble/link. Mais, maintenant que vous savez comment cela se fait, cela ne devrait pas poser de problème.

+0

Huh! Cela fonctionne. Merci beaucoup! – udushu

+0

J'ai même trouvé un script pour faire les commandes assembler/lier. mais merci pour l'astuce IDE, je ne savais pas que c'est si flexible. – udushu

0

Cela fait un moment que j'ai utilisé MASM - mais le message n'est-il pas un mot réservé? essayez '_message'.

+0

J'ai essayé _message. Lance toujours une erreur A2004 à la ligne 11. – udushu