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?
Libreria.mac: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
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_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
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

Rispondi quotando