Ecco il sorgente corretto e funzionante:
DATA SEGMENT PUBLIC
DOM DB "Digitare la password: ",'$'
RISSI DB "ACCESSO CONSENTITO AL SISTEMA!",'$'
RISNO DB "ACCESSO NEGATO AL SISTEMA!",'$'
DIGITATA DB "Parola digitata come password: ",'$'
ACAPO DB 10,13,'$'
DIM EQU 16 ;COSTANTE 15
INPUT DB DIM DUP(?) ;VETTORE PER CONTENERE L'INPUT DELLA PAROLA
CONTA DW 0 ;CONTATORE DEL NUMERO DI CARATTERI DELLA PAROLA IN INPUT
DATA ENDS ;FINE DEL SEGMENT DEI DATI
EXTRA SEGMENT
PASSWORD DB "federico",'$'
EXTRA ENDS ;FINE DEL SEGMENTO DI CODICE EXTRA
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EXTRA
INIZIO:
;CARICAMENTO DEI DATI
MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
;PULIZIA DELLO SCHERMO
MOV AX,03H
INT 10H
STAMPA MACRO FRASE
MOV AH,09H
LEA DX,FRASE
INT 21H
ENDM ;FINE MACRO PER LA STAMPA
STAMPA DOM ;RICHIAMO LA MACRO PER ESEGUIRE LA STAMPA DELLA STRINGA
CALL INPUTPAROLA ;RICHIAMO LA PROCEDURA PER ESEGUIRE L'INPUT DI UNA PAROLA
MOV BX,8 ;NUMERO DI BYTE DELLA PASSWORD
MOV CX,CONTA ;CARICO LA DIMENSIONE MASSIMA DELLE DUE PAROLE
CMP BX,CX ;COMPARE FRA IL NUMERO DI CARATTERI DELLA PAROLA IN INPUT E LA PASSWORD
JNE FALSO ;SE IL NUMERO E' DIVERSO SICURAMENTE NON SONO UGUALI
XOR SI,SI
LEA SI,INPUT ;CARICO INDIRIZZO DELLA PAROLA DIGITATA DALL'UTENTE
LEA DI,PASSWORD ;CARICO INDIRIZZO DELLA PASSWORD
CLD ;SCANSIONE DEI BYTE INDIETRO
REPE CMPSB ;CONFRONTO BYTE PER DETERMINARE L'UGUAGLIANZA DELLE DUE STRINGHE
;IL CONFRONTO TERMINA QUANTO C'E' UNA DISUGUAGLIANZA FRA I DUE TERMINI
;REPNE CONFRONTO TERMINA QUANTO C'E' UNA UGUAGLIANZA
JE VERO
JNE FALSO
VERO:
STAMPA RISSI ;RICHIAMO LA MACRO PER ESEGUIRE LA STAMPA DELLA STRINGA
JMP ESCI ;SALTO INCONDIZIONATO ALLA FINE DEL PROGRAMMA
FALSO:
STAMPA RISNO ;RICHIAMO LA MACRO PER ESEGUIRE LA STAMPA DELLA STRINGA
;JMP ESCI;SALTO INCONDIZIONATO ALLA FINE DEL PROGRAMMA
ESCI:
;RESTITUISCO IL CONTROLLO AL SISTEMA DOS
MOV AH,4CH
INT 21H
;PROCEDURA CHE PERMETTE INPUT DI UNA PAROLA
INPUTPAROLA PROC NEAR
MOV SI,0 ;AZZERO IL REGISTRO SI
CICLO:
MOV AH,01H ;METTO IN AH LA RICHIESTA DI INPUT DI UN CARATTERE
INT 21H ;INTERRUPT CHE PERMETTE L'INPUT DI UN CARATTERE
CMP AL,0DH ;CONTROLLO CHE AL SIA UGUALE A 13(=INVIO)
JE FINE ;SE E' UGUALE SI ESCE DAL CICLO
MOV INPUT[SI],AL ;SALVO IL CARATTERE
CMP SI,15 ;CONTROLLO CHE SI SIA UGUALE A 15(NUMERO MASSIMO DI LETTERE)
JE FINE ;SE E' UGUALE ESCO DAL CICLO
INC SI;INCREMENTO SI
JMP CICLO ;SALTO INCONDIZIONATO A INIZIO DEL CICLO
FINE:
MOV CONTA,SI ;SALVO IL VALORE DI CARATTERI INSERITI
MOV INPUT[SI],'$' ;METTO IL TAPPO ALLA FINE DELLA STRINGA
MOV AH,09H ;RICHIESTA DI STAMPA DI UNA STRINGA
LEA DX,DIGITATA ;CARICAMENTO DELLA STRINGA IN DX
INT 21H ;INTERRUPT CHE PERMETTE LA STAMPA DELLA STRINGA
;STAMPA DELLA PAROLA DIGITATA
MOV AH,09H ;RICHIESTA DI STAMPA DI UNA STRINGA
LEA DX,INPUT ;CARICAMENTO DELLA STRINGA IN DX
INT 21H ;INTERRUPT CHE PERMETTE LA STAMPA DELLA STRINGA
MOV AH,09H ;RICHIESTA DI STAMPA DI UNA STRINGA
LEA DX,ACAPO ;CARICAMENTO DELLA STRINGA IN DX
INT 21H ;INTERRUPT CHE PERMETTE LA STAMPA DELLA STRINGA
RET ;RITORNO AL BLOCCO PRINCIPALE
ENDP ;FINE PROCEDURA
CODE ENDS ;FINE PROGRAMMA
END INIZIO
Grazie per l'aiuto come sempre