PDA

Visualizza la versione completa : [ASSEMBLY] Errore MASM: "symbol redefinition"


DostoHouskij
27-08-2011, 12:48
Nel programma seguente, quando assemblo con MASM esce la scritta > Executing: C:\Arch-Lab\_Editor\ConTEXT\ConExec.exe "C:\Arch-Lab\Bin\Sys\AsmConText.bat" xxxx

Assembling: xxxx.asm

xxxx.asm(41) : error A2005: symbol redefinition : post_intro

pr_str(5): Macro Called From
xxxx.asm(41): Main Line Code

xxxx.asm(41) : error A2005: symbol redefinition : print

pr_str(9): Macro Called From
xxxx.asm(41): Main Line Code

xxxx.asm(41) : error A2005: symbol redefinition : continua

pr_str(13): Macro Called From
xxxx.asm(41): Main Line Code

Rilevati ERRORI di Compilazione: Correggi e riprova con F9 > Execution finished. Ho visto che su alcune versioni di Masm presente questo bug http://support.microsoft.com/kb/120064/it: questa la causa dell'errore o ho sbagliato qualcosa io? In ogni caso, come posso aggirarlo?


;INTESTAZIONE
PAGE 66,132
;MACRO UTILIZZATE DAL PROGRAMMA
include libreria.mac
;DEFINIZIONE DEL SEGMENTO DEL CODICE
_prog SEGMENT ;BYTE PUBLIC 'CODE'
ASSUME CS:_prog, DS:_prog
ORG 100H
;AREA DESTINATA AI DATI DEL PROGRAMMA
testo db 'Scrivi due numeri (separati da "INVIO")','$'
Nan db 'Ho detto di scrivere un numero!','$'
num1 db 0,'$'
;----------------------------------------------------------------------------
Main:
pr_str num1
intro:
mov ah,00H ;chiede con funzioni BIOS un carattere
int 16H
cmp al,27 ;se il tasto non ESC...
je Fine ;...passa alla fase di controllo

Control:

sub al,30h ;sottraendo 30h(=48) al codice ASCII di un numero si ottiene il numero stesso
cmp al,9 ;se il risultato dellla sottrazione maggiore di 9 significa che il codice ASCII del tasto era maggiore di 39h o anche minore di 30h, dato che 'ja' si usa per gli unsigned
ja isNaN ;e considera come positivi i numeri negativi, per cui un numero come FFFF FFFF FFFF FFFF, che se considerato negativo sarebbe =-1, risulta comunque maggiore di 9.
add al,30h ;riporta AL al valore originario
mov ah,0EH ;stampa il carattere (solo se un numero)
int 10H
mov bx,seg num1
mov es,bx
mov di,offset num1
mov es:[di],al
inc di
pr_str num1
jmp intro
Fine:
mov ah,4ch
int 16h

isNaN:
jmp main

_prog ENDS
END Main

Libreria.mac:


; pr_char
;STAMPA UN CARATTERE POSTO IN AL
pr_char MACRO
mov ah,0EH ;si limita ad eseguire l'interrupt 0EH di 21H
int 10H
ENDM pr_char
;----------------------------------------------------------------------------------
; pr_str
;STAMPA UNA STRINGA TERMINANTE CON ",0"
pr_str MACRO string
pushad
mov ax,seg string
mov es,ax
mov di, offset string
post_intro:
mov al,es:[di] ;se si esegue l'istruzione "cmp es:[di],0"
cmp al,0 ;il computer cerca di stampare tutto es (?)
je continua ;while al!=0 ripete il ciclo
print:
pr_char
inc di
jmp post_intro
continua:
popad
ENDM pr_str

P.S.: la cosa pi strana (almeno credo...) che se a pr_str sostituisco il codice seguente non mi d nessun messaggio di errore.


; pr_str_dos
;STAMPA UNA STRINGA PASSATA COME PARAMETRO USANDO FUNZIONI DOS
;N.B.: LA STRINGA DA STAMPARE DEVE TERMINARE CON IL CARATTERE '$' (Da aggiustare)
pr_str_dos MACRO testo
mov ax, SEG testo ;sposta in ax l'indirizzo del segmento dati...
mov ds, ax ;...per poi spostarlo in ds
lea dx, testo ;sposta in dx l'offset di 'testo'
mov ah,09H ;chiama la funzione 09H
int 21H ;di 21H
ENDM pr_str_dos

linoma
28-08-2011, 17:26
Sn le labels della macro che vengono aggiunte + volte.

oregon
28-08-2011, 18:04
Non un bug, ma un cattivo uso delle macro.

Nelle macro devi usare delle label di tipo local.

Leggi questo

http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/ProgrammersGuide/Chap_09.htm

DostoHouskij
29-08-2011, 21:46
Grazie, me lo sto studiando; non ho capito per con esattezza l'utilizzo di "textequ".

Loading