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?
codice:
;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:
codice:
; 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.
codice:
; 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