|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
[assembler] aiutatemi! inserimento e controllo password
Ciao a tutti
L'esercizio dice: - programma che consente di inserire una password di 8 caratteri e di confrontarla con una password memorizzata nel segmento dati - il programma non deve visualizzare la password mentre viene inserita - ogni carattere deve essere sostituito a video con un '*' - se la password e' corretta il programma deve stampare un messaggio di benvenuto, altrimenti un messaggio di errore Questo è il codice che ho scritto: Codice:
Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansiro'
code segment
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
mov cx,8
caratteri:
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov al,'*'
int 10h
loop caratteri; stampa asterischi quando inserisci un carattere
cmp al,san ; confronto con password
jne pas_sba
lea dx,accapo
mov ah,9
int 21h ; vai a capo
lea dx,msg2
mov ah,9
int 21h; visualizza messaggio di benvenuto
jmp fine
pas_sba:
lea dx,msg3
mov ah,9
int 21h ; visualizza messaggio
fine:
Grazie in anticipo. |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
ho aggiustato qualcosa ma non so se il confronto è giusto
Sono riuscito a mettere gli asterischi ogni volta che inserisco una parola, ma non capisco, se come ho fatto i confronti sia giusto
Inserisco il codice: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot', 8 dup(00h)
password db 8 dup(00h,00h,00h,00h,00h,00h,00h,00h)
code segment
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
mov cx,0000h
mov di,0
caratteri:
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
cmp cx,8 ; contatore
je confr
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
;copia i caratteri in un vettore
mov password[di],al; dovrebbe salvare la password nella stringa
inc di
inc cx
jmp caratteri ; salta a caratteri
confr:
mov ax,san
mov bx,password
cmp ax,bx; dovrebbe confrontare la password immessa con quella del di san
jne errore; se non è uguale salta a errore
benvenuto:
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,msg3
mov ah,9
int 21h ; stampa errore
fine:
ret
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Guarda, non sei molto lontano.
Un problema che salta subito all'occhio e' che AL, risultato dell'input da tastiera, sarebbe bene che lo usassi in qualche modo prima di sovrascriverci '*', altrimenti ovviamente perdi l'informazione dell'input digitato dall'utente.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Grazie mille
Inserisco il codice: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot', 8 dup(00h)
password db 8 dup(00h,00h,00h,00h,00h,00h,00h,00h)
code segment
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
mov cx,0
mov di,0
lea dx,accapo
mov ah,9
int 21h; va a capo
caratteri:
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[di],al; inserice la parola immessa nel vettore password
cmp cx,8 ; contatore
je confr ; se il contatore arriva a otto salta a confr
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
;copia i caratteri in un vettore
inc di ; incrementa il contatore di
inc cx ; incrementa il contatore cx
jmp caratteri
confr:
mov ax,san ; mette la password giusta ovvero san nel registro ax
mov bx,password ; mette la password inserita dall'utente nel registro bx
cmp ax,bx; confronta ax con bx
jne errore ; se non sono uguali salta a errore
benvenuto:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
fine:
ret
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
il confronto e' sbagliato.
ax e bx sono 2 registri ciascuno a 16 bit. Ti pare che basti confrontare tra loro i contenuti, qualunque cosa contengano, per capire se 2 password (ciascuna lunga 8 caratteri = 8 byte = 64bit) sono uguali?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
L'unica cosa che mi viene in mente e di prendere singolarmente ogni carattere e di confrontarli in un ciclo:
Tipo questo: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot',2 dup(00h)
password db 10 dup(00h)
code segment
messaggio:
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
lea dx,accapo
mov ah,9
int 21h; va a capo
mov cx,0
mov di,0
caratteri:
cmp cx,7 ; contatore
je confronto ; se il contatore arriva a otto salta a confronto
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[di],al; inserice la parola immessa nel vettore password
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
;copia i caratteri in un vettore
inc di ; incrementa il contatore di
inc cx ; incrementa il contatore cx
jmp caratteri
indici:
mov cx,0
mov di,0
mov si,0
confronto:
cmp cx,7
je benvenuto; salta a controllo se sono uguali
inc cx; incrementa un contatore
mov ah,san[si] ; mette una lettera alla volta in ah
mov al,password[di] ; mette una lettera alla volta in al
inc di
inc si
cmp ah,al; confronta ah con al
jne errore; salta se non e' uguale a errore
inc si
inc di
jmp confronto
benvenuto:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
jmp fine
fine:
ret
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
fai che fare
INC di INC si una volta sola per ogni ciclo, non due. Anzi, poiche' sia DI che SI che CX (sia nel ciclo di acquisizione che in quello di confronto) valgono sempre lo stesso identico valore, potresti usarne anche solo uno dei tre
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ho fatto come hai detto tu
C'è qualche altro metodo per i confronti tra stringhe? Sono proprio in confusione Questo è il codice: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot',2 dup(00h)
password db 10 dup(00h)
code segment
messaggio:
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
lea dx,accapo
mov ah,9
int 21h; va a capo
mov si,0
caratteri:
cmp si,7 ; contatore
je confronto ; se il contatore arriva a otto salta a confronto
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[si],al; inserice la parola immessa nel vettore password
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
;copia i caratteri in un vettore
inc si ; incrementa il contatore di
jmp caratteri
indici:
mov si,0
confronto:
cmp si,7
je benvenuto; salta a controllo se sono uguali
inc si; incrementa contatore
mov ah,san[si] ; mette una lettera alla volta in ah
mov al,password[si] ; mette una lettera alla volta in al
cmp ah,al; confronta ah con al
jne errore; salta se non e' uguale a errore
jmp confronto
benvenuto:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
jmp fine
fine:
ret
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:29. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Mi attizza l'assembler
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ti riferisci a 7 che devo sostituirlo con 8?
così: Codice:
caratteri:
cmp si,8 ; contatore
je confronto ; se il contatore arriva a otto salta a confronto
Codice:
confronto: cmp si,8 |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:29. |
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Tu dici che devo sostituire contatore con indici?
così: Codice:
Codice:
caratteri:
cmp si,8 ; contatore
je indici; se il contatore arriva a otto salta a indici
Codice:
indici:
mov si,0
confronto:
cmp si,8
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:29. |
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Il problema adesso è che mi da due errori quando lo avvio:
- non mi stampa l'inizio ovvero: Inserire password di 8 caratteri: - adesso mi dice sempre Password Sbagliata anche quando la password è giusta non capisco l'errore dove sia inserisco il codice: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot',2 dup(00h)
password db 10 dup(00h)
code segment
messaggio:
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
lea dx,accapo
mov ah,9
int 21h; va a capo
mov si,0
caratteri:
cmp si,8 ; contatore
je indici ; se il contatore arriva a otto salta a confronto
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[si],al; inserice la parola immessa nel vettore password
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
;copia i caratteri in un vettore
inc si ; incrementa il contatore di
jmp caratteri
indici:
mov si,0
confronto:
cmp si,8
je benvenuto; salta a controllo se sono uguali
inc si; incrementa contatore
mov ah,san[si] ; mette una lettera alla volta in ah
mov al,password[si] ; mette una lettera alla volta in al
cmp ah,al; confronta ah con al
jne errore; salta se non e' uguale a errore
jmp confronto
benvenuto:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
jmp fine
fine:
ret
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 16:30. |
|
|
|
|
|
#18 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Dici così:
Codice:
data ends
code segment
ASSUME DS:data
messaggio:
mov ax,data
mov ds, ax
Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot',2 dup(00h)
password db 10 dup(00h)
data ends
code segment
ASSUME DS:data
messaggio:
mov ax,data
mov ds, ax
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
lea dx,accapo
mov ah,9
int 21h; va a capo
mov si,0; mette a zero il contatore si
caratteri:
cmp si,8 ; contatore
je indici ; se il contatore arriva a otto salta a indici
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[si],al; inserice la parola immessa nel vettore password
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
inc si ; incrementa il contatore si
jmp caratteri; salta sempre a caratteri
indici:
mov si,0; inizializza il contatore si
confronto:
cmp si,8
je benvenuto; salta a benvenuto se sono uguali
inc si; incrementa contatore
mov ah,san[si] ; mette una lettera alla volta in ah
mov al,password[si] ; mette una lettera alla volta in al
cmp ah,al; confronta ah con al
jne errore; salta se non e' uguale a errore
jmp confronto; salta sempre a confronto
benvenuto:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
lea dx,accapo
mov ah,9
int 21h; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
jmp fine
fine:
ret
L'unica cosa è che non va a capo dopo ogni scritta. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Mi piace come linguaggio, ma mi piace anche Java e assembler mi attizza
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Jul 2008
Messaggi: 27
|
Ho risolto l'ultimo problemino
Qui il codice completo: Codice:
; programma che consente di inserire una password di 8 caratteri
; e di confrontarla con una password memorizzata nel segmento dati
; il programma non deve visualizzare la password mentre viene inserita
; ogni carattere deve essere sostituito a video con un '*'
; se la password e' corretta il programma deve stampare un messaggio di
; benvenuto altrimenti un messaggio di errore
data segment
msg1 db 'Inserire password di 8 caratteri:',13,10,'$'
msg2 db 'Ok!Benvenuto!$'
msg3 db 'Password Sbagliata$'
accapo db 13,10,'$'
san db 'sansirot',2 dup(00h)
password db 10 dup(00h)
data ends
code segment
ASSUME DS:data
messaggio:
mov ax,data
mov ds, ax
lea dx,msg1
mov ah,9
int 21h; visualizza messaggio
lea dx,accapo
mov ah,9
int 21h; va a capo
mov si,0; mette a zero il contatore si
caratteri:
cmp si,8 ; contatore
je indici ; se il contatore arriva a otto salta a indici
mov ah,00h
int 16h; legge carattere da tastiera e lo mette in al
mov password[si],al; inserice la parola immessa nel vettore password
mov al,'*'
mov ah,0Eh
int 10h ; stampa asterisco dopo ogni inserimento
inc si ; incrementa il contatore si
jmp caratteri; salta sempre a caratteri
indici:
mov si,0; inizializza il contatore si
confronto:
cmp si,8
je benvenuto; salta a benvenuto se sono uguali
inc si; incrementa contatore
mov ah,san[si] ; mette una lettera alla volta in ah
mov al,password[si] ; mette una lettera alla volta in al
cmp ah,al; confronta ah con al
jne errore; salta se non e' uguale a errore
jmp confronto; salta sempre a confronto
benvenuto:
MOV AH,02h
MOV DL,13
INT 21h
MOV AH,02h
MOV DL,10
INT 21h ; va a capo
lea dx,msg2
mov ah,9
int 21h; stampa benvenuto
jmp fine
errore:
MOV AH,02h
MOV DL,13
INT 21h
MOV AH,02h
MOV DL,10
INT 21h ; va a capo
lea dx,msg3
mov ah,9
int 21h; stampa errore
jmp fine
fine:
ret
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:53.



















