Simulazione input password[Risolto]

di il
10 risposte

Simulazione input password[Risolto]

Ciao a tutti
Ho intenzione di creare un piccolo programma che simuli l'input di una password e comunica in base alla parola digitata se si ha accesso al sistema oppure no.
Per effettuare il confronto fra le due stringhe ho utilizzato l'istruzione "CMPSB"

Ecco il codice sorgente:
DATA SEGMENT PUBLIC
	DOM DB "Digitare la password: ",'$'
	PASSWORD DB "federico"
	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
DATA ENDS ;FINE DEL SEGMENT DEI DATI

CODE SEGMENT

	ASSUME CS:CODE,DS:DATA 

INIZIO:

	;CARICAMENTO DEI DATI
	MOV AX,DATA
	MOV DS,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 
	
	CALL INPUTPAROLA ;RICHIAMO LA PROCEDURA PER ESEGUIRE L'INPUT DI UNA PAROLA
	
	LEA SI,INPUT  ;CARICO INDIRIZZO DELLA PAROLA DIGITATA DALL'UTENTE
	LEA DI,PASSWORD ;CARICO INDIRIZZO DELLA PASSWORD
	MOV CX,DIM ;CARICO LA DIMENSIONE MASSIMA DELLE DUE PAROLE
	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
		JMP ESCI 
		
	FALSO:
		STAMPA RISNO
		JMP ESCI

ESCI: 	
;RESTITUISCO IL CONTROLLO AL SISTEMA DOS	
MOV AH,4CH
INT 21H 	

INPUTPAROLA PROC NEAR 

	MOV SI,0 ;AZZERO IL REGISTRO SI
	MOV AH,01H ;METTO IN AH LA RICHIESTA DI INPUT DI UN CARATTERE
	
	CICLO:
		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
		INC SI;INCREMENTO SI
		CMP SI,15 ;CONTROLLO CHE SI SIA UGUALE A 15(NUMERO MASSIMO DI LETTERE)
		JE FINE ;SE E' UGUALE ESCO DAL CICLO
		JMP CICLO ;SALTO INCONDIZIONATO A INIZIO DEL CICLO

	FINE:
	
		INC SI ;INCREMENTO L'INDICE
		MOV INPUT[SI],'$' ;METTO IL TAPPO ALLA FINE DELLA STRINGA
	
		MOV AH,09H
		LEA DX,DIGITATA
		INT 21H 
		;STAMPA DELLA PAROLA DIGITATA
		MOV AH,09H
		LEA DX,INPUT
		INT 21H 
		
		MOV AH,09H
		LEA DX,ACAPO
		INT 21H 
		
		RET ;RITORNO AL BLOCCO PRINCIPALE
		
ENDP ;FINE PROCEDURA

CODE ENDS ;FINE PROGRAMMA
END INIZIO
Il problema è che anche se inserisco la parola corretta dice che è sbagliato.
Grazie in anticipo per chi mi potrà aiutare

10 Risposte

  • Re: Simulazione input password[Risolto]

    Ma se confronti sempre 16 caratteri come possono essere mai uguali le password?
  • Re: Simulazione input password[Risolto]

    Quindi dovrei stabilire il numero di byte di entrambe le parole e confrontarle solamente se il numero di byte di entrambe le parole sono uguali con l'istruzione size giusto?
  • Re: Simulazione input password[Risolto]

    Domandona: ma se le due password hanno lunghezza diversa, possono essere uguali?

    'ciccio' puo' essere uguale a 'ciccione'?
  • Re: Simulazione input password[Risolto]

    Infatti, confronta le stringhe SOLO se le lunghezze sono uguali
  • Re: Simulazione input password[Risolto]

    Grazie per i consigli:)
    Proverò a breve
  • Re: Simulazione input password[Risolto]

    Ho provato a considerare la conta del numero di caratteri delle parole ma anche se inserisco il termine corretto dice che la parola digitata è sbagliata
    DATA SEGMENT PUBLIC
    	DOM DB "Digitare la password: ",'$'
    	PASSWORD DB "federico",'$'
    	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
    
    
    CODE SEGMENT
    
    	ASSUME CS:CODE,DS:DATA 
    
    INIZIO:
    	;CARICAMENTO DEI DATI
    	MOV AX,DATA
    	MOV DS,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
    	
    	XOR BX,BX ;AZZERO IL REGISTRO BX
    	XOR CX,CX ;AZZERO IL REGISTRO CX 
    	
    	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
  • Re: Simulazione input password[Risolto]

    Due considerazioni

    1) le linee

    XOR BX,BX ;AZZERO IL REGISTRO BX
    XOR CX,CX ;AZZERO IL REGISTRO CX

    non servono a nulla, ma non sono la causa del problema

    2) la CMPSB lavora con due puntatori che fanno riferimento a due segmenti

    DS:SI
    ES:DI

    ma non vedo l'uso di ES nel tuo programma
  • Re: Simulazione input password[Risolto]

    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
  • Re: Simulazione input password[Risolto]

    Ok, bene, ma puoi migliorare usando la funzione ah=07 al posto della ah=01 per evitare la visualizzazione della password
  • Re: Simulazione input password[Risolto]

    Grazie
Devi accedere o registrarti per scrivere nel forum
10 risposte