View Full Version : [assembler] aiutatemi! inserimento e controllo password
pol88884
22-04-2009, 12:08
Ciao a tutti :) , preannuncio che sono un pivello alle prime armi :), ho appena iniziato lo studio di assembler 8086, uso il programma emu8086, e sto trovando un po' di difficolta nella risoluzione di alcuni esercizi. So che voi siete i migliori.
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:
; 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:
Che ne pensate? Dove sbaglio?
Grazie in anticipo.
pol88884
23-04-2009, 13:55
Sono riuscito a mettere gli asterischi ogni volta che inserisco una parola, ma non capisco, se come ho fatto i confronti sia giusto :muro: .
Inserisco il 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
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.
pol88884
23-04-2009, 14:51
Grazie mille :) , non me ne ero proprio accorto. Ora esce.
Inserisco il 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
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?
pol88884
24-04-2009, 17:52
L'unica cosa che mi viene in mente e di prendere singolarmente ogni carattere e di confrontarli in un ciclo:
Tipo questo:
; 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
Il problema però è che mi da sempre benvenuto anche se la password è sbagliata.
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
pol88884
24-04-2009, 18:54
Ho fatto come hai detto tu :) , ho sostituito tutti gli indici con si, però il confronto non mi esce, mi dice sempre benvenuto :muro: .
C'è qualche altro metodo per i confronti tra stringhe? Sono proprio in confusione :confused: .
Questo è il 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
rеpne scasb
24-04-2009, 19:41
■
~FullSyst3m~
24-04-2009, 20:08
Mi attizza l'assembler :D
pol88884
25-04-2009, 00:02
Ti riferisci a 7 che devo sostituirlo con 8?
così:
caratteri:
cmp si,8 ; contatore
je confronto ; se il contatore arriva a otto salta a confronto
confronto:
cmp si,8
rеpne scasb
25-04-2009, 10:30
■
pol88884
25-04-2009, 11:54
Tu dici che devo sostituire contatore con indici?
così:
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
Kralizek
25-04-2009, 12:03
Mi attizza l'assembler :D
ma non eri il paladino del pitone? pussa via e torna al "piano di sopra" :sofico:
rеpne scasb
25-04-2009, 12:33
■
pol88884
25-04-2009, 12:58
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:
; 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
rеpne scasb
25-04-2009, 17:39
■
pol88884
25-04-2009, 20:12
Dici così:
data ends
code segment
ASSUME DS:data
messaggio:
mov ax,data
mov ds, ax
qui metto l'intero 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
Grazie mille!!! Mi esce!! :)
L'unica cosa è che non va a capo dopo ogni scritta.
~FullSyst3m~
25-04-2009, 23:49
ma non eri il paladino del pitone? pussa via e torna al "piano di sopra" :sofico:
Non sono un paladino del pitone dai :D
Mi piace come linguaggio, ma mi piace anche Java e assembler mi attizza :D
pol88884
26-04-2009, 12:37
Ho risolto l'ultimo problemino ;).
Qui il codice completo:
; 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
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.